3

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

  • 在写入磁盘之前,线程首先将数据划分为与它们最终将被发送到的减速器相对应的分区。

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

  • 运行 combiner 函数可以得到更紧凑的 map 输出,因此写入本地磁盘和传输到 reducer 的数据更少。

这是我的疑问:

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

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

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

寻求简短而深入的解释!

提前致谢。

4

5 回答 5

3

1/ 这部分已经指定了响应:“在每个分区内,后台线程执行内存中的key排序,如果有combiner函数,则在排序的输出上运行。”

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

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

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

如果没有指定自定义组合器,则不执行组合器。如果没有指定自定义分区器,则默认执行的分区器为“HashPartitioner”(请参见第 221 页)。

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

Sequence File case: job.setInputFormatClass(SequenceFileInputFormat.class);
Avro File case: job.setInputFormatClass(AvroKeyInputFormat.class); 
于 2015-08-20T09:05:55.383 回答
1

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

详细信息:Combiner 可以看作是 map 阶段的 mini-reducer。在进一步分发之前,它们对映射器结果执行本地缩减。一旦执行了Combiner 功能,它就会被传递给Reducer 以进行进一步的工作。

然而

当我们的工作不仅仅是在 Reducer 上时,Partitioner 就会出现。因此,partitioner 决定哪个 reucer 负责特定的 key。他们基本上采用 Mapper Result(如果使用 Combiner,则使用 Combiner Result)并根据密钥将其发送给负责的 Reducer。

为了更好地理解,您可以参考以下图片,该图片来自 Yahoo Developer Tutorial on Hadoop。图 4.6:插入 MapReduce 数据流的组合器步骤

这是教程。

于 2015-08-20T09:38:06.660 回答
0

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

  1. Mapper 读取数据并处理。此输出转到中间输出文件。
  2. 一旦映射器完成所有键值对。使用默认分区器“HashPartitioner”或自定义分区器将中间输出分区为“R”分区。
  3. 对每个分区文件进行排序。
  4. 任何可选的组合器代码都在排序的“R”分区上执行。只有在指定时才会执行组合器步骤。
  5. Reducers 与映射器联系并提取其适当的分区文件。
  6. 在所有 mapper 任务完成并将所有中间数据复制到所有 reducer 之后。reducer 对数据再执行一种排序。
  7. 然后,reducers 会一一处理各自的键值对。

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

job.setCombinerClass(CustomCombiner.class);
于 2015-08-20T13:48:34.630 回答
0

分区在组合器之前运行。a) 映射器将数据处理成 b) 后跟分区器(默认或自定义)将根据要求根据键对数据进行分区。c)然后对将由后台线程/进程处理的键进行排序。d)如果组合器存在:然后是组合器,这将在排序后的键的输出上运行 e)然后是减速器,它将对输入数据再运行一次排序,然后是减速器进程。

于 2015-09-17T09:46:06.910 回答
0

我想总结一下整个流程:

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

请提出我的理解是否有任何差距

于 2016-05-09T03:16:30.387 回答