由于我是hadoop的新手,我尝试了http://www.tutorialspoint.com/map_reduce/map_reduce_partitioner.htm 我发现这个程序根据年龄组使用了3个不同的分区,并且还使用了3个减缩器,这是预期的。但是在reducer代码中(这里的gender是键male/female),我仍然得到,,我假设这个值列表的创建是由hash分区器完成的。但是我已经定义了getpartitions(),谁来创建这个列表?
由于我是hadoop的新手,我尝试了http://www.tutorialspoint.com/map_reduce/map_reduce_partitioner.htm 我发现这个程序根据年龄组使用了3个不同的分区,并且还使用了3个减缩器,这是预期的。但是在reducer代码中(这里的gender是键male/female),我仍然得到,,我假设这个值列表的创建是由hash分区器完成的。但是我已经定义了getpartitions(),谁来创建这个列表?
2条答案
按热度按时间qcbq4gxm1#
在上面的示例代码中,我们在run方法中有下面的驱动程序代码--
在这里您可以看到,它将caderpartitioner类设置为上述先生的分区器,并且按照map reduce规范,如果我们的程序没有设置任何自定义分区器,那么只有在这种情况下,identity分区器才会出现。
因此,在上述场景中,caderpartitioner将对上述mr进行分区,因为它有3个条件,它将把输入键分成3个不同的组,并将这些单独的组发送到不同的reducer,reducer将相应地进行。
希望这有帮助。
sczxawaw2#
getpartition()方法的简单说明
如果您的作业有3个约简,那么它们也会被整数索引:0、1和2。
会议的目的
getPartition()
方法是将Map输出的每一对(键、值)作为参数,并决定该对是否应转到还原器0、1或2。这就是为什么getPartition()
方法的返回类型为int。所以所有的Map输出
getPartition()
)影响到reducer 2,将被写入同一分区,也被索引为2。该分区将位于Map器中,等待reducer 2获取它。你问,谁创建了这个分区?这是一个叫做
MapFileOutputFormat
,在一个名为getEntry()
根据我的发现。正如类名所示,可能是负责管理Map输出数据的类。这个
HashPartitioner
是默认的分区器,仅在未为作业定义任何分区器时使用。它仅基于(key,value)对的key的hashcode,因此具有相同key(即相同hashcode)的所有对最终都位于相同的分区器中,这是mapreduce中的默认行为。在教程中
您在教程中引用的代码使用自定义分区器,它的
getPartition()
该方法将年龄组与某些划分者联系起来(20岁以下至0号减速器,20至30岁至1号减速器等……)。这个自定义分区器(
CaderPatitioner
)是mapreduce作业的分区程序,因为它是使用job.setPartitionerClass()
. 一份工作只有一个人,所以HashPartitioner
从来没有用在这个工作中,所以它在你的情况下绝对没有任何作用。所以回答你的问题,如果我理解的很好,
CaderPatitioner
负责决定如何将输出Map到分区中,然后谁将在单独的缩减器中结束。