Hadoop 如何在cluster map reduce环境中合并数据

Hadoop 如何在cluster map reduce环境中合并数据,hadoop,mapreduce,Hadoop,Mapreduce,我是hadoop的新手。当MapReduce在集群环境中时,我在理解它方面有问题 以单词计数示例代码为例,假设我有三个节点,每个节点都有一个映射任务。地图之后: 机器A: hello 1 word 1 data 1 ... 机器B: hello 1 xu 2 ... 地图的输出保存在和机器中的本地文件中。 我的问题是,在进入reduce阶段之前,如何合并多台机器上的这些数据?例如,reduce statge接收 hello <1, 1> xu 1 你好 徐1 在本例中,

我是hadoop的新手。当MapReduce在集群环境中时,我在理解它方面有问题

以单词计数示例代码为例,假设我有三个节点,每个节点都有一个映射任务。地图之后: 机器A:

hello 1
word  1
data  1
...
机器B:

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

hello <1, 1>
xu 1
你好 徐1
  • 在本例中,映射器从每行输入数据的最后一个单元格获取平均值。它不计算字数,因此请记住,使用此映射器,您不会从本地数据集中获得此类字数输出数据
  • 在开始reducestage之前,MR框架将每个节点的每个映射器的输出分组到一个按键数据集排序的单个映射器中。最终,它将被分解为一组reduce作业,在其中定义reduce逻辑
  • 对于您的特定情况,正如我在前一点中提到的,所有输出都将按照与输出的第一个单词相关的键进行分组:
  • 机器A:你好1,单词1,数据1

    机器B:你好1,徐2

    Reducer输入:data{1},hello{1,1},word{1},xu{2}

    请参阅本文中有关MapReduce的更多详细信息

  • 在本例中,映射器从每行输入数据的最后一个单元格获取平均值。它不计算字数,因此请记住,使用此映射器,您不会从本地数据集中获得此类字数输出数据
  • 在开始reducestage之前,MR框架将每个节点的每个映射器的输出分组到一个按键数据集排序的单个映射器中。最终,它将被分解为一组reduce作业,在其中定义reduce逻辑
  • 对于您的特定情况,正如我在前一点中提到的,所有输出都将按照与输出的第一个单词相关的键进行分组:
  • 机器A:你好1,单词1,数据1

    机器B:你好1,徐2

    Reducer输入:data{1},hello{1,1},word{1},xu{2}


    有关MapReduce的更多详细信息,请参见此

    一旦为某个作业完成映射任务,则输出将保存,然后传输到此类。该类负责根据还原器分离数据。例如,在您的例子中,您有3台机器正在运行2个reducer。然后partitioner类的getpartition()方法负责分割该2个reducer的映射输出Ex-> 你好1//1 字1//2 数据1//1

    因此,现在将为每个reducer创建两个单独的文件。在每个mapper节点上创建的这些文件的数量取决于map输出是否包含每个reducer的数据,请记住,到目前为止,所有这些文件仍在mapper节点上

    调用该类后,该类负责对2个文件中的每个文件中的数据进行排序,并负责对它们进行分组。完成后,生成的文件就可以发送到集群中的各个节点

    在执行此洗牌和排序后,所有映射节点在各自的reducer节点上发送生成的输出文件,然后在reducer上合并从所有映射器接收的文件并进行排序Ex->,因此有2个映射器和2个reducer,一个映射器为reducer 1和reducer 2生成数据,另一个仅生成一个输出文件,用于reducer 1,然后reducer 1将获得两个文件,reducer 2将获得一个文件

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


    一旦为作业完成映射任务,则保存输出,然后将其传输到该类。该类负责根据减缩器分离数据。例如,在您的例子中,您有3台机器正在运行2个reducer。然后partitioner类的getpartition()方法负责分割该2个reducer的映射输出Ex-> 你好1//1 字1//2 数据1//1

    因此,现在将为每个reducer创建两个单独的文件。在每个mapper节点上创建的这些文件的数量取决于map输出是否包含每个reducer的数据,请记住,到目前为止,所有这些文件仍在mapper节点上

    调用该类后,该类负责对2个文件中的每个文件中的数据进行排序,并负责对它们进行分组。完成后,生成的文件就可以发送到集群中的各个节点

    在执行此洗牌和排序后,所有映射节点在各自的reducer节点上发送生成的输出文件,然后在reducer上合并从所有映射器接收的文件并进行排序Ex->,因此有2个映射器和2个reducer,一个映射器为reducer 1和reducer 2生成数据,另一个仅生成一个输出文件,用于reducer 1,然后reducer 1将获得两个文件,reducer 2将获得一个文件

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


    映射器输出按关键字(在您的情况下按单词)进行局部排序,然后将其划分为几个块(如果此特定映射器输出没有特定还原器的关键字,则块的数量等于或小于还原器的数量)。在这之后,每个块都会进入相应的reducer(它也会从其余的映射器接收数据块),在那里它会与来自其他映射器的其他块合并,然后所有的块都会作为reducer的输入

    映射器输出按关键字(在您的示例中按单词)进行局部排序,然后将其划分为多个块(如果此特定映射器输出没有特定还原器的关键字,则块的数量等于或小于还原器的数量)。在这之后,每个数据块都会转到相应的reducer(它也会接收数据piec)