如何在集群Mapreduce环境中合并数据

kyxcudwk  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(309)

我是hadoop新手。当mapreduce在集群环境中时,我在理解它时遇到了问题。
以单词计数为例,代码假设我有三个节点,每个节点都有一个Map任务。Map之后:机器a:

hello 1
word  1
data  1
...

机器b:

hello 1
xu  2
...

Map的输出保存在和机器中的本地文件中。我的问题是,在进入reduce阶段之前,这些跨多台机器的数据是如何合并的?例如,reduce statge接收

hello <1, 1>
xu 1
yeotifhr

yeotifhr1#

Map器输出按关键字(在您的例子中按单词)进行局部排序,然后将其划分为若干个块(如果此特定Map器输出没有特定还原器的关键字,则块的数量等于或小于还原器的数量)。之后,每个块进入相应的reducer(它还接收来自其余Map器的数据块),在那里它与来自其他Map器的其他块合并,然后它作为reducer的输入。

pzfprimi

pzfprimi2#

一旦为一个作业完成了Map任务,那么输出就被保存,然后被传输到partitioner类这个类负责根据reducer分离数据。例如,在您的例子中,您有3台机器正在运行2个reducer。然后partitioner类的getpartition()方法负责划分该2个reducer的Map输出ex->hello 1//reducer 1 word 1//reducer 2 data 1//reducer 1
因此,现在将为每个reducer创建两个单独的文件,每个mapper节点上创建的这些文件的数量取决于Map输出是否包含每个reducer的数据,请记住,到目前为止,所有这些文件仍在mapper节点上。
在调用这个writablecomapartor类之后,它负责对2个文件中的每个文件中的数据进行排序,并负责对它们进行分组。一旦完成这项工作,生成的文件就可以发送到集群中的各个节点。
在执行此洗牌和排序之后,所有Map节点在各自的reducer节点上发送结果输出文件,然后在reducer上合并从所有Map器接收的文件并对其进行排序ex->,因此有2个Map器和2个reducer,一个Map器生成reducer 1和reducer 2的数据,另一个Map器只生成一个输出文件,然后reducer 1将得到两个文件,reducer 2将得到一个文件。
合并和排序之后,reducer将在这些文件上运行,并生成最终输出。
有关从mapper到reducer的数据流的更多详细信息,请参阅此处

ibps3vxo

ibps3vxo3#

在本例中,mapper从每行输入数据的最后一个单元格中获取平均值。它不计算字数,所以请记住,您将不会得到这样的字数输出数据从您的本地数据集使用这个Map器;
在开始reducestage之前,mr框架将把每个节点的每个Map器的输出分组到一个按密钥数据集排序的单个Map器中。最终,它将被分解为一组reduce作业,在其中定义reduce逻辑。
对于您的特定情况,正如我在前面提到的,所有输出都将按与输出的第一个单词相关的键进行分组:
机器a:你好1,单词1,数据1
b机:你好1,徐2
减速机输入:data{1},hello{1,1},word{1},xu{2}
请参阅本文中有关mapreduce的更多详细信息

相关问题