看完下面这篇关于Hadoop-权威指南第4版(page-204)的文章后,我感到很困惑
-
在写入磁盘之前,线程首先将数据分成与它们最终将成为的reducer相对应的分区发送到。
-
在每个分区内,后台线程执行一个在内存中按键排序,如果有组合函数,则运行它关于排序的输出。
-
运行组合器功能使a更紧凑的映射输出,因此写入本地磁盘的数据更少
我的疑问是:
1)谁将执行第一个合并器或分区!!
2)当自定义合并器和自定义分区存在时,那么执行步骤的层次结构是怎样的?
3)我们可以提供压缩数据(avro,序列等)到自定义组合器,如果是,然后如何!!
寻找一个简短而深入的解释!!
提前感谢。
1/响应已经在这一部分中指定:"在每个分区中,后台线程执行内存中按键排序,如果有组合函数,则在排序的输出上运行。"
首先在内存中创建分区,如果有自定义组合器,它将在内存中执行,最后结果将溢出到磁盘。
2/自定义组合器和自定义分区在驱动程序类上指定时将存在。
job.setCombinerClass(MyCombiner.class);
job.setPartitionerClass(MyPartitioner.class);
如果没有指定自定义组合,则不执行组合。如果没有指定自定义分区,那么默认执行的分区是"HashPartitioner"(请参阅221页)。
是的,这是可能的。不要忘记组合机的机构与减速器是一样的。减速器可以使用压缩数据。如果使用者使用压缩的数据,这意味着输入文件格式被压缩了。为此,您可以在驱动程序类上指定指令:
Sequence File case: job.setInputFormatClass(SequenceFileInputFormat.class);
Avro File case: job.setInputFormatClass(AvroKeyInputFormat.class);
你的问题的直接答案是=> COMBINER
详细信息:在映射阶段,组合器可以看作是迷你的减少器。它们在进一步分布映射器结果之前对它们执行local-reduce。一旦Combiner功能被执行,它就会被传递给Reducer进行进一步的工作。
,
当我们处理不止一个Reducer时,就会出现Partitioner。因此,分区者决定哪个reducer负责一个特定的键。它们基本上采用Mapper Result(如果使用Combiner,则使用Combiner Result)并根据键将其发送给负责的Reducer。为了更好地理解,你可以参考下面的图片,这是我从雅虎Hadoop开发者教程中获取的。图4.6:插入MapReduce数据流的Combiner步骤
下面是教程
这是完整的MR作业流程。你的 1。)和 2) 回答。
- Mapper读取数据并处理。该输出将进入一个中间输出文件。
- 一旦映射器完成所有的键、值对。使用默认分区器"HashPartitioner"或自定义分区器将中间输出分区为"R"分区。
- 每个分区文件被排序。
- 任何可选的组合代码都在排序的'R'分区上执行。只有指定了合并步骤才会执行。
- Reducers伸出映射器并拉出相应的分区文件。
- 所有mapper任务完成后,所有中间数据被复制到所有reducer。reducer对数据再执行一次排序。
- 然后reducer逐个处理它们各自的键、值对。
答案3:是,合并器可以处理压缩数据。combiner函数在map阶段的输出上运行,用作过滤或聚合步骤,以减少传递给reducer的中间键的数量。在大多数情况下,reducer类被设置为组合器类。区别在于这些类的输出。组合器类的输出是传递给reducer的中间数据,而reducer的输出则传递给磁盘上的输出文件。job的组合符可以这样设置:
job.setCombinerClass(CustomCombiner.class);
分区在组合符之前运行。a)制图员将数据处理成b)紧随其后的分区器(默认或自定义)将根据键根据需求对数据进行分区。c)然后对键进行排序,这将由后台线程/进程负责。d)如果存在组合:然后是combinor,这将在排序键的输出上运行e)然后是Reducer,对输入的数据再运行一次sort,然后是Reducer进程。
我想总结一下整个流程:
- Mapper读取数据并处理。该输出将进入一个中间输出文件。
- 一旦映射器完成所有的键、值对。
- Mapper首先写入内存缓冲区的输出,
- 当缓冲区即将溢出时,然后溢出到本地目录,然后在内存中创建分区["在每个分区中,后台线程按键执行内存排序,中间输出使用默认分区器'HashPartitioner'或自定义分区器划分为'R'分区]
- 溢出数据按照Partitioner进行分区,在每个分区中对结果进行排序,
- 如果有一个自定义的合并器,它将在内存中执行,结果将在最后溢出到磁盘。
- Reducers伸出映射器并拉出相应的分区文件。
- 所有mapper任务完成后,所有中间数据被复制到所有reducer。reducer对数据再执行一次排序。
- 然后reducer逐个处理它们各自的键、值对。
如果我的理解有什么不一致的地方请提出建议