谁将有机会先执行,Combiner 还是 Partitioner?

Who will get a chance to execute first , Combiner or Partitioner?

阅读以下有关 Hadoop 权威指南第 4 版(第 204 页)的文章后,我感到很困惑

这里是我的疑问:

1) 谁将首先执行组合器或分区!!

2) 当自定义组合器和自定义分区出现时,执行步骤层次结构如何以及如何?

3) 我们可以将压缩数据(avro、序列..等)提供给自定义组合器吗,如果是,那么如何!!

寻找简短而深入的解释!!

提前致谢。

1/ 此部分已指定响应:"Within each partition, the background thread performs an in-memory sort by key, and if there is a combiner function, it is run on the output of the sort."

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

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

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

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

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

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

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

详情:Combiner可以看作是map阶段的mini-reducer。在进一步分发之前,他们对映射器结果执行局部归约。一旦组合器功能被执行,它就会被传递给 Reducer 以进行进一步的工作。

其中

当我们处理的不仅仅是 Reducer 时,Partitioner 就会出现。因此,分区程序决定哪个 reucer 负责特定的键。他们基本上采用 Mapper Result(如果使用 Combiner,则使用 Combiner Result)并根据键将其发送到负责的 Reducer。

为了更好地理解,您可以参考下图,该图是我从 Hadoop 上的 Yahoo Developer Tutorial 中截取的。图 4.6:组合器步骤插入 MapReduce 数据流

这是教程。

这是完整的 MR 作业流程。您的 1.)2.) 在这里得到解答。

  1. Mapper读取数据并处理。此输出转到中间输出文件。
  2. 映射器完成所有键值对后。使用默认分区程序 'HashPartitioner' 或自定义分区程序将中间输出分区为 'R' 个分区。
  3. 每个分区的文件都排序。
  4. 任何可选的组合器代码都在排序后的 'R' 分区上执行。只有在指定的情况下才会执行组合器步骤。
  5. reducer 联系映射器并拉取它们适当的分区文件。
  6. 在所有映射器任务完成并且所有中间数据都被复制到所有缩减器之后。 reducer 对数据执行另一种排序。
  7. 然后 reducers 处理它们各自的键值对。

Answer-3: 是的,combiner可以处理压缩后的数据。 combiner 函数在 map 阶段的输出上运行,用作过滤或聚合步骤,以减少传递给 reducer 的中间键的数量。在大多数情况下,reducer class 被设置为 combiner class。区别在于这些 classes 的输出。 combiner class 的输出是传递给 reducer 的中间数据,而 reducer 的输出传递给磁盘上的输出文件。作业的组合器可以这样设置:

job.setCombinerClass(CustomCombiner.class);

组合器之前的分区 运行s。 a) mapper将数据处理成 b) 随后是分区程序(默认或自定义)将根据基于键的要求对数据进行分区。 c) 随后对将由后台处理的键进行排序 threads/process。 d) 如果组合存在: 然后是 combinor,这将 运行 放在排序后的键的输出上 e) 接下来是 Reducer,它将 运行 对输入数据再排序一次,然后是 reducer 进程。

我想总结一下整个流程:

  1. Mapper 读取数据并处理。此输出转到中间输出文件。
  2. 映射器完成所有键值对后。
  3. Mapper 的输出首先写入内存缓冲区,
  4. 当缓冲区即将溢出然后溢出到本地目录,然后在内存中创建分区["在每个分区中,后台线程按键执行内存中排序,并将中间输出分区为'R' 使用默认分区程序 'HashPartitioner' 或自定义分区程序]
  5. 的分区
  6. 溢出的数据按照Partitioner进行分区,每个分区的结果进行排序,
  7. 如果有自定义组合器,会在内存中执行,最后会溢出到磁盘。
  8. Reducers 联系映射器并提取它们适当的分区文件。
  9. 在所有映射器任务完成并且所有中间数据都被复制到所有减速器之后。 reducer 对数据执行另一种排序。
  10. 然后 reducer 逐一处理它们各自的键值对。

如果我的理解有任何不足,请提出建议