我想知道分区器和组合器之间是先运行吗?
我认为它首先是分离器然后是组合器,然后键被重定向到不同的reducer,它们看起来像分区器,所以我很困惑。 请帮我理解。
答案 0 :(得分:26)
您问题的直接答案是=> COMBINER
详细说明: 可以在地图阶段将组合器视为迷你减速器。它们在进一步分发之前对映射器结果执行local-reduce。一旦执行了Combiner功能,它就会被传递给Reducer以进行进一步的工作。
其中
当我们在减速器上工作时,分区器会出现在图片中。因此,分区程序决定哪个reducer负责特定键。它们基本上采用Mapper结果(如果使用Combiner然后使用Combiner Result)并根据密钥将其发送到负责的Reducer。
为了更好地理解,您可以参考下面的图片,我从Hadoop的Yahoo Developer Tutorial中获取了这些图片。
这是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)
timeZone
在var 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。
我通过运行自定义Combiner
和Combiner
的字数统计程序并使用时间戳记录来检查它:
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 - >减速器