我是hadoop的新手,我阅读了很多页面的hadoop mapreduce和hdfs,但仍然无法清除一个概念。
这个问题可能是愚蠢或不寻常的,如果不是那么抱歉。 我的问题是,假设我在hadoop中为一个大小为1 GB的文件创建了一个字数统计程序,其中map函数将每行作为输入并输出为键值对,reduce函数将输入 作为键值对,简单地迭代列表并计算一个单词在该文件中的总次数。
现在我的问题是,因为这个文件存储在多个数据节点的块中,并且map-reduce并行执行每个数据节点。假设我的文件存储在两个datanode上,第一个数据节点上的文件包含单词“hadoop”5次,第二个数据节点上的文件包含单词“hadoop”7次。所以基本上 整个地图缩小过程的输出将是:
hadoop的:7
的hadoop:5
因为2个map-reduce函数并行地在2个不同的数据节点上执行, 但输出应该是两个文件中“hadoop”字数的总和,即: hadoop的:13
那么我将如何实现这一点,或者我在这里错过了一些概念。请帮助我严重困扰这个概念,如果我无法让你明白我想问的话,我很抱歉。
答案 0 :(得分:0)
我认为你完全错过了reducer的概念,因为它正是它的功能,reducer输入将是一个键(在这种情况下是hadoop)和一个与这个键相关的值列表(7和5),所以你的reducer程序将迭代值列表并进行求和,然后是hadoop,13。
答案 1 :(得分:0)
你可能已经读了许多Hadoop Mapreduce和HDFS 的页面,但是你似乎错过了在Map之后和Reduce之前包含舞台的那些页面,称为Shuffle and Sort。
基本上它的作用是,它将来自所有映射器的数据混洗,并将具有相同键的行以排序顺序发送到同一个reducer。因此,在您的情况下,hadoop 7
和hadoop 5
都将使用相同的reducer,将其缩减为hadoop 12
(不是13!)
您可以在网上轻松获得有关Shuffle和Sort的更多信息。您可以阅读questions like this too。