谁将有机会先执行,合并者或分区者?

时间:2015-08-20 06:26:22

标签: hadoop mapreduce hadoop-streaming hadoop-partitioning combiners

我在阅读下面有关Hadoop-Definitive指南第4版(第204页)的文章后感到困惑

  • 在写入磁盘之前,线程首先将数据分成 对应于它们最终将成为的reducer的分区 寄去。

  • 在每个分区中,后台线程执行一个 内存按键排序,如果有组合器功能,则运行 在排序的输出上。

  • 运行组合器功能可以实现 更紧凑的映射输出,因此写入本地磁盘的数据更少 并转移到减速机。

这是我的疑问:

1)谁将执行第一个组合器或分区!!

2)当自定义组合器和自定义分区存在时,执行步骤层次结构将如何以及将会是什么?

3)我们可以将压缩数据(avro,sequence ..etc)提供给Custom combiner,如果是,那么如何!!

寻找简短而深入的解释!

提前致谢。

5 个答案:

答案 0 :(得分:3)

1 /响应已在此部分中指定:"在每个分区中,后台线程按键执行内存中排序,如果有组合器功能,则在输出中运行。排序"

首先,分区是在内存中创建的,如果有自定义组合器,它将在内存中执行,结果将在最后溢出到磁盘。

2 /自定义组合器和自定义分区将在驱动程序类中指定时存在。

job.setCombinerClass(MyCombiner.class);
job.setPartitionerClass(MyPartitioner.class);

如果没有指定自定义组合器,则不执行组合器。 如果没有指定自定义分区程序,那么默认执行的分区程序是" HashPartitioner" (请参阅第221页。)

3 /是的,有可能。不要忘记组合器的机制与减速器相同。 reducer可以使用压缩数据。 如果使用者使用压缩数据,则意味着压缩输入文件格式。 为此,您可以在驱动程序类上指定指令:

Sequence File case: job.setInputFormatClass(SequenceFileInputFormat.class);
Avro File case: job.setInputFormatClass(AvroKeyInputFormat.class); 

答案 1 :(得分:1)

您问题的直接答案是=> COMBINER

详细信息:可以在地图阶段将组合器视为迷你减速器。它们在进一步分发之前对映射器结果执行local-reduce。一旦执行了Combiner功能,它就会被传递给Reducer以进行进一步的工作。

其中

当我们处理的不仅仅是减速机时,分区程序会出现在图片中。因此,分区程序决定哪个reucer负责特定键。它们基本上采用Mapper结果(如果使用Combiner然后使用Combiner Result)并根据密钥将其发送到负责的Reducer。

为了更好地理解,您可以参考下面的图片,我从Hadoop的Yahoo Developer Tutorial中获取了这些图片。图4.6:插入到MapReduce数据流中的组合器步骤

这是教程。

答案 2 :(得分:0)

这是完整的MR工作流程。您的 1。) 2。)会在此处得到解答。

  1. Mapper读取数据和进程。此输出转到中间输出文件。
  2. 一旦mapper完成所有键,值对。使用默认分区程序“HashPartitioner”或自定义分区程序将中间输出分区为“R”分区。
  3. 对每个分区文件进行排序。
  4. 在排序的“R”分区上执行任何可选的组合器代码。只有指定了组合器步骤才会执行。
  5. Reducers联系映射器并拉出相应的分区文件。
  6. 完成所有映射器任务并将所有中间数据复制到所有reducers之后。减速器对数据进行了一次排序。
  7. 然后Reducer逐个处理各自的键值对。
  8. 答案3:是的,组合器可以处理压缩数据。组合器函数在映射阶段的输出上运行,并用作过滤或聚合步骤,以减少传递给reducer的中间键的数量。在大多数情况下,reducer类被设置为组合器类。不同之处在于这些类的输出。组合器类的输出是传递给reducer的中间数据,而reducer的输出则传递给磁盘上的输出文件。作业组合器可以设置如下:

    job.setCombinerClass(CustomCombiner.class);
    

答案 3 :(得分:0)

分区在Combinor之前运行。 a)映射器将数据处理成 b)随后的分区程序(默认或自定义)将根据需要根据密钥对数据进行分区。 c)然后对密钥进行排序,这些密钥将由后台线程/进程处理。 d)如果存在组合:         然后是组合,这将在排序键的输出上运行 e)接下来是Reducer,它将再次对输入数据进行排序,然后是reducer进程。

答案 4 :(得分:0)

我想总结整个流程:

  1. Mapper读取数据和进程。此输出转到中间输出文件。
  2. 一旦mapper完成所有键,值对。
  3. Mapper的输出首先写入内存缓冲区,
  4. 当缓冲区即将溢出然后溢出到本地目录,然后在内存中创建分区[“在每个分区内,后台线程按键执行内存中排序,中间输出分区为'R'分区使用默认分区程序'HashPartitioner'或自定义分区程序]
  5. 根据分区程序将溢出数据分开,并在每个分区中对结果进行排序和
  6. 如果有自定义组合器,它将在内存中执行,结果将在最后溢出到磁盘。
  7. Reducers联系映射器并拉出相应的分区文件。
  8. 完成所有映射器任务并将所有中间数据复制到所有reducers之后。减速器对数据进行了一次排序。
  9. 然后Reducer逐个处理各自的键值对。
  10. 请在我的理解中建议是否存在差距