我在阅读下面有关Hadoop-Definitive指南第4版(第204页)的文章后感到困惑
在写入磁盘之前,线程首先将数据分成 对应于它们最终将成为的reducer的分区 寄去。
在每个分区中,后台线程执行一个 内存按键排序,如果有组合器功能,则运行 在排序的输出上。
运行组合器功能可以实现 更紧凑的映射输出,因此写入本地磁盘的数据更少 并转移到减速机。
这是我的疑问:
1)谁将执行第一个组合器或分区!!
2)当自定义组合器和自定义分区存在时,执行步骤层次结构将如何以及将会是什么?
3)我们可以将压缩数据(avro,sequence ..etc)提供给Custom combiner,如果是,那么如何!!
寻找简短而深入的解释!
提前致谢。
答案 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。)会在此处得到解答。
答案3:是的,组合器可以处理压缩数据。组合器函数在映射阶段的输出上运行,并用作过滤或聚合步骤,以减少传递给reducer的中间键的数量。在大多数情况下,reducer类被设置为组合器类。不同之处在于这些类的输出。组合器类的输出是传递给reducer的中间数据,而reducer的输出则传递给磁盘上的输出文件。作业组合器可以设置如下:
job.setCombinerClass(CustomCombiner.class);
答案 3 :(得分:0)
分区在Combinor之前运行。 a)映射器将数据处理成 b)随后的分区程序(默认或自定义)将根据需要根据密钥对数据进行分区。 c)然后对密钥进行排序,这些密钥将由后台线程/进程处理。 d)如果存在组合: 然后是组合,这将在排序键的输出上运行 e)接下来是Reducer,它将再次对输入数据进行排序,然后是reducer进程。
答案 4 :(得分:0)
我想总结整个流程:
请在我的理解中建议是否存在差距