Hadoop MapReduce:关于减缩器数量的澄清

Hadoop MapReduce:关于减缩器数量的澄清,hadoop,mapreduce,reducers,Hadoop,Mapreduce,Reducers,在MapReduce框架中,映射器生成的每个键都使用一个reducer 因此,您可能认为在Hadoop MapReduce中指定还原程序的数量没有任何意义,因为它依赖于程序。但是,Hadoop允许您指定要使用的还原程序的数量(-D mapred.reduce.tasks=#个还原程序) 这是什么意思?减速机数量的参数值是否指定有多少机器资源流向减速机,而不是实际使用的减速机数量 映射器生成的每个关键点使用一个减缩器 这个评论是不正确的。对分组比较器分组的每个键执行一次reduce()方法调用。r

在MapReduce框架中,映射器生成的每个键都使用一个reducer

因此,您可能认为在Hadoop MapReduce中指定还原程序的数量没有任何意义,因为它依赖于程序。但是,Hadoop允许您指定要使用的还原程序的数量(-D mapred.reduce.tasks=#个还原程序)

这是什么意思?减速机数量的参数值是否指定有多少机器资源流向减速机,而不是实际使用的减速机数量

映射器生成的每个关键点使用一个减缩器


这个评论是不正确的。对分组比较器分组的每个键执行一次reduce()方法调用。reducer(任务)是一个处理零个或多个reduce()调用的进程。您提到的属性是关于reducer任务的数量。

要简化@Judge Mental(非常准确)的回答,请稍微回答一下:一个reducer任务一次可以处理多个键,但是mapred.reduce.tasks=#参数声明为特定作业同时运行多少个reducer任务

例如,如果您的mapred.reduce.tasks=10:
您有2000个关键点,每个关键点有50个值(对于均匀分布的10000 k:v对)。 每个减速器应能大致处理200个键(1000 k:v对)

例如,如果您的mapred.reduce.tasks=20:
您有2000个关键点,每个关键点有50个值(对于均匀分布的10000 k:v对)。 每个减速器应能大致处理100个键(500 k:v对)


在上面的例子中,每个减速器必须使用的键越少,整个工作就越快。。。当然,只要集群中有可用的reducer资源。

如果我的映射器只输出一个键怎么办?由于在减缩器之间分配工作的键太少,减缩器的数量是否无关紧要?这就是所谓的数据倾斜,这可能是一个问题,具体取决于您的数据大小。解决或减轻数据倾斜的最常用方法是创建自定义分区器。这允许数据以不同的方式分布在减速器中。在Yahoo Hadoop教程网站上有一个关于分区数据的不错的描述:这个答案非常有用