可以举个简单的例子来解释下。比如wordcount程序,对这样的语句"daddy finger, daddy finger, where are you, here I am, here I am, how do you do"进行workcount。有两个map分别处理三个短句,map1的输出结果是:<daddy, 1> <finger, 1> <daddy, 1> <finger, 1> <where, 1> <are, 1> <you, 1>;map2的输出结果是:<here, 1> <I, 1> <am ,1> <here, 1> <I, 1> <am, 1> <how, 1> <do, 1> <you, 1> <do, 1>。有一个reduce来处理count操作。如果不采用combiner的话,总共有17条记录传递给reduce task。如果采用combiner的话,combiner会对map task本地端的结果进行combine操作(这里是wordcount),这样map端的数据结果就是combiner之后的结果,比如map1的输出结果就变成<daddy, 2> <finger, 2> <where, 1> <are, 1> <you, 1>;map2的输出结果就变成<here, 2> <I, 2> <am ,2> <how, 1> <do, 2> <you, 1>。这样总共有11条记录传递给reduce task,比之前的少。所以combier主要目的是减少map输出。
当map生成的数据过大时,带宽就成了瓶颈,怎样精简压缩传给Reduce的数据,又不影响最终的结果呢。有一种方法就是使用Combiner,Combiner号称本地的Reduce,Reduce最终的输入,是Combiner的输出。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。