Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop MapReduce是否在每台机器上运行?_Hadoop_Mapreduce - Fatal编程技术网

Hadoop MapReduce是否在每台机器上运行?

Hadoop MapReduce是否在每台机器上运行?,hadoop,mapreduce,Hadoop,Mapreduce,如果Hadoop在50台机器的网格上运行,并且我运行了一项确定哪些是最常见的单词的任务,那么我可以指定只在文档abc1.txt和abc2.txt中搜索吗? Hadoop如何知道在哪台机器上查找这些文件,或者它会尝试在50台机器中的每台机器上查找这些文件?在Hadoop中,您将这些文件放在hdfs上,它会将这些文件复制到多个位置,比如说每个文件的3个副本,这些副本均匀分布 例如,您有50个文件,每个文件在hdfs中有3个副本(这个数字是在设置hadoop时确定的)。假设Machine1具有abc1

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

在Hadoop中,您将这些文件放在hdfs上,它会将这些文件复制到多个位置,比如说每个文件的3个副本,这些副本均匀分布

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


当您将abc_i.txt(i为1到50)作为输入时,因为
abc24.txt
hadoop将把作业交给M1或M2或其他拥有该文件的机器,以便不进行任何网络数据传输。所有其他文件都将由拥有该文件的机器进行处理(在某些例外情况下,这些规则可能会失败)。要更好地理解此内容,请阅读。

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

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

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

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

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


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

dude,请阅读关于HDFS的文章:)