我是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
yeotifhr1#
Map器输出按关键字(在您的例子中按单词)进行局部排序,然后将其划分为若干个块(如果此特定Map器输出没有特定还原器的关键字,则块的数量等于或小于还原器的数量)。之后,每个块进入相应的reducer(它还接收来自其余Map器的数据块),在那里它与来自其他Map器的其他块合并,然后它作为reducer的输入。
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的数据流的更多详细信息,请参阅此处
ibps3vxo3#
在本例中,mapper从每行输入数据的最后一个单元格中获取平均值。它不计算字数,所以请记住,您将不会得到这样的字数输出数据从您的本地数据集使用这个Map器;在开始reducestage之前,mr框架将把每个节点的每个Map器的输出分组到一个按密钥数据集排序的单个Map器中。最终,它将被分解为一组reduce作业,在其中定义reduce逻辑。对于您的特定情况,正如我在前面提到的,所有输出都将按与输出的第一个单词相关的键进行分组:机器a:你好1,单词1,数据1b机:你好1,徐2减速机输入:data{1},hello{1,1},word{1},xu{2}请参阅本文中有关mapreduce的更多详细信息
3条答案
按热度按时间yeotifhr1#
Map器输出按关键字(在您的例子中按单词)进行局部排序,然后将其划分为若干个块(如果此特定Map器输出没有特定还原器的关键字,则块的数量等于或小于还原器的数量)。之后,每个块进入相应的reducer(它还接收来自其余Map器的数据块),在那里它与来自其他Map器的其他块合并,然后它作为reducer的输入。
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的数据流的更多详细信息,请参阅此处
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的更多详细信息