0

如果我在 50 台机器的网格上运行 Hadoop,并且我运行一项确定哪些是最常用词的工作,我可以指定我只想在文档 abc1.txt 和 abc2.txt 中搜索吗?Hadoop 如何知道在哪些机器上查找这些文件,或者它会尝试在 50 台机器上的每一台机器上查找文件?

4

2 回答 2

1

在 hadoop 中,您将文件放在 hdfs 上,并将文件复制到多个位置,例如每个文件的 3 个副本,这些副本位于均匀位置。

例如,您有 50 个文件,每个文件在 hdfs 中有 3 个副本(这个数字是在设置 hadoop 时确定的)。假设Machine1hasabc1.txt, abc24.txt and abc47.txt和 M2 has abc11.txt, abc24.txt and abc27.txt和其他类似。

当您将 abc_ i .txt(i is 1 to 50) 作为输入时,abc24.txthadoop 会将作业交给 M1 或 M2 或具有该文件的另一台机器,以便不进行任何网络数据传输。并且所有其他文件都将由拥有该文件的机器处理(可能存在这些规则失败的一些例外情况)。为了更好地理解,请阅读此wiki 页面

于 2013-05-26T19:42:45.090 回答
1

是的,您应该指定 HDFS 中文件的路径作为 MapReduce 作业的输入。但好在 - 您不需要知道这些文件的实际存储位置。

当您上传abc1.txtabc2.txtHDFS - 分布式文件系统时,Hadoop 会将此文件中的数据块存储在称为节点的集群中的多台机器上(默认为 3 个)。如果文件大小大于一台机器可以存储的大小 - Hadoop 会将文件分成几个块,并将每个块存储在几个节点上。

因此,作业不需要知道文件实际存储在哪里。您的作业程序将仅通过 URI 识别文件,例如hdfs://abc1.txthdfs://abc2.txt.

Hadoop 尽最大努力在存储数据的同一节点上运行作业(或部分作业)。

当 Hadoop 安排您的作业时,它将考虑哪些节点具有该作业的数据以及当时可用的节点。然后它将安排作业在节点上运行。

如果每个文件适合一个节点,则作业将被安排在每个文件的一个节点上运行。所以它不会在集群的所有 50 个节点上运行。

于 2013-05-26T19:43:29.050 回答