组合器适用的用例有哪些,组合器不适用的用例又有哪些。我知道组合器的功能,但我正在努力理解组合器有意义的不同用例。
来源:Hadoop权威指南:
运行组合器功能可以实现更紧凑的映射输出,因此写入本地磁盘和传输到减速器的数据更少。
如果只有一个或两个溢出,那么映射输出大小的潜在减少不值得调用组合器的开销,因此它不会为该映射输出再次运行。
什么是溢出:每个映射任务都有一个循环内存缓冲区,它将输出写入缓冲区。当缓冲区的内容达到一定的阈值大小(80%)时,后台线程将开始将内容溢出到磁盘。
如果组合器符合标准(交换和关联),IMO总是运行组合器。Hadoop框架将决定是否运行合并器(基于映射输出大小/溢出次数),因此您不必担心性能降低。
在处理下面的文件时,单词计数示例的Normal Map输出是
文件1:
这是一本书
这是一个书架
映射o/p:
这个1
是1
a 1
第1册
这个1
是1
a 1
书架1
现在为了避免网络中如此巨大的数据传输,使用了组合器,这是一个正常的reducer代码,所以如果我们要编写自定义组合器,映射o/p将是:
这个1,1
为1,1
a 1,1
第1册
书架1
从而减少了网络中向reducer节点的数据传输。
2.关于降低性能:在上面的例子中,如果文件中的总行非常大,那么为了避免大的数据传输,合并器是有用的,但如果它的总行只有2,那么合并器将增加其执行开销。
组合器主要用于减少Reducer需要处理的数据量。它们被称为小型减速器。
一个更好解释的用例:
映射器的输出,在没有组合器的情况下输入到还原器 映射器->组合器的输出,该输出被输入到具有组合器能的精简器 即使在这个小示例中,也可以明显地看到使用组合器可以减少数据传输量。想象一下,百万个单词和万亿字节的数据的场景,你可以看到巨大的网络带宽节约。 何时使用组合器 您可以使用"组合器"进行字数统计示例。 组合器只能用于可交换的函数(a.b=b.a)和关联 什么时候不应该使用Combiner 很简单。如果上述情况无效。例如,将字数示例替换为计算员工列表中的平均(平均)年龄。如果将所有值从Mapper传递到Reducer,则会得到不同的年龄平均值。如果您发送来自各个映射器的数据子集,您将获得不同的年龄平均值。 合路器和减速器之间的差异可以在此处检查, 当不使用组合器时,可以在此处检查<What,1> <do,1> <you,1> <mean,1> <by,1> <Object,1>
<What,1> <do,1> <you,1> <know,1> <about,1> <Java,1>
<What,1> <is,1> <Java,1> <Virtual,1> <Machine,1>
<How,1> <Java,1> <enabled,1> <High,1> <Performance,1>
<What,1,1,1> <do,1,1> <you,1,1> <mean,1> <by,1> <Object,1>
<know,1> <about,1> <Java,1,1,1>
<is,1> <Virtual,1> <Machine,1>
<How,1> <enabled,1> <High,1> <Performance,1>