首先运行的是:分区器还是组合器?

时间:2014-02-27 06:56:35

标签: hadoop

我想知道分区器和组合器之间是先运行吗?

我认为它首先是分离器然后是组合器,然后键被重定向到不同的reducer,它们看起来像分区器,所以我很困惑。 请帮我理解。

8 个答案:

答案 0 :(得分:26)

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

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

其中

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

为了更好地理解,您可以参考下面的图片,我从Hadoop的Yahoo Developer Tutorial中获取了这些图片。 Figure 4.6: Combiner step inserted into the MapReduce data flow

这是tutorial

答案 1 :(得分:5)

首先是分区。

根据“Hadoop,权威指南”,Mapper的输出首先写入内存缓冲区,然后当缓冲区即将溢出时溢出到本地目录。根据分区程序将溢出数据分开,并且如果给出了Combiner,则在每个分区中对结果进行排序和组合。

您只需修改wordcount MR程序即可验证它。我的结果是: (“快速的棕色狐狸跳过一只懒狗”)


Word,Step,Time

fox,Mapper,********** 754

fox,Partitioner,********** 754

fox,Combiner,********** 850

狐狸,减速器,********** 904


显然,Combiner在Partitioner之后运行。

答案 2 :(得分:3)

timeZonevar calendar = Calendar(identifier: .gregorian) calendar.timeZone = TimeZone(secondsFromGMT: 0)! let dateWithoutTime = calendar.startOfDay(for: Date()) print(dateWithoutTime) 之前运行:MapReduce Comprehensive Diagram

您可以拥有自定义分区逻辑,在对映射器结果进行分区后,将对分区进行排序,并将Partitioner应用于已排序的分区。

请参阅Hadoop MapReduce Comprehensive Description

我通过运行自定义CombinerCombiner的字数统计程序并使用时间戳记录来检查它:

Combiner

答案 3 :(得分:1)

组合器在分区器之前运行

组合器在map之后运行,以减少地图输出的项目数。所以它减少了网络过载。在分区器之后减少运行

答案 4 :(得分:1)

Combiner是地图侧缩减器。它意味着减速器执行组合器所做的一切。组合器的主要用途是调整/优化性能。在组合器优化代码之后,请求者分离并协助获得多个输出。 Combiner是可选的,但对于大文件非常值得推荐。

分区程序根据reducer的数量来划分数据,并取决于输出的要求。 例如:输出male,female,使用分区器分开2个输出。

First Combiner将来,Partitioner将会到来,两者都只来到Mapside,但不是在reducer方面。

答案 5 :(得分:0)

在Hadoop-权威指南第3版,第209页,我们有以下文字:

  

在写入磁盘之前,线程首先将数据划分为与最终将被发送到的reducer相对应的分区。在每个分区中,后台线程按键执行内存中排序,如果有组合器函数,则在排序的输出上运行。运行组合器功能可以实现更紧凑的映射输出,因此可以将更少的数据写入本地磁盘并传输到reducer。

     

每次内存缓冲区达到溢出阈值时,都会创建一个新的溢出文件,因此在map任务写入其最后一个输出记录后,可能会有多个溢出文件。在任务完成之前,溢出文件将合并到单个分区和排序的输出文件中。配置属性io.sort.factor一次控制要合并的最大流数;默认值为10.

     

如果至少有三个溢出文件(由min.num.spills.for.combine属性设置),则在写入输出文件之前再次运行组合器。回想一下,组合器可能会在输入上重复运行而不会影响最终结果。如果只有一个或两个溢出,则映射输出大小的潜在减少不值得调用组合器的开销,因此不会再次运行此映射输出。因此,在合并溢出文件期间运行组合器。

所以答案似乎是:

地图 - >分区程序 - >排序 - >组合器 - >溢出 - >组合器(如果溢出> = 3) - >合并。

但是,在Apache Tutorial中有以下字词:

  

对Mapper输出进行排序,然后根据Reducer进行分区。

内容与权威指南不同。这里的答案似乎是:

地图 - >排序 - >组合器 - >分区程序 - >溢出 - >组合器(如果溢出> = 3) - >合并。

哪一个是正确的?我倾向于接受Apache教程中的后一个,但不太确定。

答案 6 :(得分:0)

Combiner不会更改输出映射任务的键值对。它基于相同的密钥组合并发出相同的密钥/列表值对。

分区程序从map / combiner(如果存在)获取输入,然后对数据进行分段,并且在进程中可以发出新的K List Value对。

所以Map - > Combine-> Partition - > Reduce。

答案 7 :(得分:-1)

Mapper - >组合器 - > Partitionar - >减速器