如何在群集映射中合并数据减少环境

时间:2017-02-20 20:36:54

标签: hadoop mapreduce

我是hadoop的新手。在集群环境中理解MapReduce时遇到问题。

获取单词计数示例代码假设我有三个节点,每个节点都有一个map任务。地图后: 机器A:

hello 1
word  1
data  1
...

机器B:

hello 1
xu  2
...

Map的输出保存在本地文件和机器中。 我的问题是在传递到reduce阶段之前,如何将多台机器上的数据合并?例如,reduce statge接收

hello <1, 1>
xu 1

3 个答案:

答案 0 :(得分:1)

  1. 在此示例中,Mapper从每行输入数据的最后一个单元格中获取平均值。它不计算单词,因此请记住,您不会使用此映射器从本地数据集中获取此类单词计数输出数据;
  2. 在开始缩减阶段之前,MR框架会将每个节点的每个映射器的输出分组为按密钥数据集排序的单个输出。最终,它将被拆分为一组减少作业,您可以在其中定义减少逻辑。
  3. 对于您的特定情况,正如我在前一点中所提到的,所有输出都将按照与输出的第一个单词相关的键进行分组:
  4. 机器A: hello 1,word 1,data 1

    机器B:你好1,xu 2

    缩减器输入:数据{1},问候{1,1},字{1},xu {2}

    在此article

    中查看有关MapReduce的更多详细信息

答案 1 :(得分:1)

为作业完成Map任务后,输出将被保存,然后传输到Partitioner class,此类负责根据reducers分离数据。例如,在你的情况下,你有3台机器运行2个reducer。然后分区器类的getpartition()方法负责划分该2减速器的地图输出Ex-&gt; 你好1 //减速机1 字1 //减速机2 数据1 // reducer 1

所以现在将为每个reducer创建一个分离的文件。在每个映射器节点上创建的这些文件中的任何一个都取决于映射输出是否包含每个reducer的数据,并记住到目前为止所有这些文件仍然在mapper节点上。

在调用此WritableComapartor类之后,该类负责对2个文件中的每个文件中的数据进行排序,并且还负责对它们进行分组。完成此操作后,可以将结果文件发送到群集中的相应节点。

在这种混洗和排序发生之后,所有映射节点在相应的reducer节点上发送结果输出文件,然后在reducer上合并从所有映射器接收的文件并排序Ex - &gt;所以它有2个mapper和2个reducer,一个mapper为reducer 1和reducer 2生成一个数据,其他只生成一个输出文件,对于reducer 1,则reducer 1将获得两个文件,reducer 2将获得1个文件。

合并和排序后,对这些文件运行Reducer并生成最终输出。

Refer here for more detail about data flow from mapper to reducer

答案 2 :(得分:0)

映射器输出按键在本地排序(在您的情况下按字),然后将其分区为多个块(如果此特定映射器输出没有某些减少器的键,则块数等于或更少的减少器数) 。之后,每个块转到相应的reducer(它也接收来自其余映射器的数据片段),在那里它与来自其他映射器的其他块合并,然后它全部作为reducer的输入。