如果我在50台机器的网格上运行Hadoop,并且我运行确定哪些是最常见的单词的工作,我可以指定我只想搜索文档abc1.txt和abc2.txt吗?Hadoop如何知道在哪些机器上查找这些文件,或者它会尝试在50台机器中的每台机器上查找这些文件?
是的,您应该指定HDFS中文件的路径作为MapReduce作业的输入。但好处是,您不需要知道这些文件实际存储在哪里。
当你上传abc1.txt
和abc2.txt
到HDFS分布式文件系统时,Hadoop会将这些文件中的数据块存储在集群中称为节点的几台机器上(默认为3台)。如果文件大小大于一台机器可以存储的大小,Hadoop会将文件分成几个块,并将每个块存储在几个节点上。
所以作业不需要知道文件实际存储在哪里。您的作业程序将仅通过URI识别文件,如hdfs://abc1.txt
和hdfs://abc2.txt
。
Hadoop尽量在存储数据的同一节点上运行作业(或部分作业)。
当Hadoop将调度您的作业时,它将考虑哪些节点拥有作业的数据以及当时哪些节点可用。然后,它将调度作业在节点上运行。
如果每个文件适合一个节点,则作业将被安排在每个文件的一个节点上运行。所以它不会在集群的所有50个节点上运行。
在hadoop中,你把文件放在hdfs上,它会将文件复制到多个位置,比如每个文件平均分布3个副本。
例如,您有50个文件,每个文件在hdfs中有3个副本(这个数字在设置hadoop时确定)。假设Machine1
有abc1.txt, abc24.txt and abc47.txt
, M2有abc11.txt, abc24.txt and abc27.txt
,其他类似。
当你给abc_i.txt(i是1到50)作为输入时,对于abc24.txt
hadoop将把作业交给M1或M2或其他具有该文件的机器,以便没有任何网络数据传输。所有其他文件将由拥有该文件的机器处理(可能存在这些规则失败的特殊情况)。