如果在hadoopmapreduce中定义了自定义分区器,那么默认的散列分区器还能工作吗?

6vl6ewon  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(420)

由于我是hadoop的新手,我尝试了http://www.tutorialspoint.com/map_reduce/map_reduce_partitioner.htm 我发现这个程序根据年龄组使用了3个不同的分区,并且还使用了3个减缩器,这是预期的。但是在reducer代码中(这里的gender是键male/female),我仍然得到,,我假设这个值列表的创建是由hash分区器完成的。但是我已经定义了getpartitions(),谁来创建这个列表?

qcbq4gxm

qcbq4gxm1#

在上面的示例代码中,我们在run方法中有下面的驱动程序代码--

Configuration conf = getConf();

  Job job = new Job(conf, "topsal");
  job.setJarByClass(PartitionerExample.class);

  FileInputFormat.setInputPaths(job, new Path(arg[0]));
  FileOutputFormat.setOutputPath(job,new Path(arg[1]));

  job.setMapperClass(MapClass.class);

  job.setMapOutputKeyClass(Text.class);
  job.setMapOutputValueClass(Text.class);

  //set partitioner statement

  job.setPartitionerClass(CaderPartitioner.class);
  job.setReducerClass(ReduceClass.class);
  job.setNumReduceTasks(3);
  job.setInputFormatClass(TextInputFormat.class);

  job.setOutputFormatClass(TextOutputFormat.class);
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(Text.class);

  System.exit(job.waitForCompletion(true)? 0 : 1);
  return 0;

在这里您可以看到,它将caderpartitioner类设置为上述先生的分区器,并且按照map reduce规范,如果我们的程序没有设置任何自定义分区器,那么只有在这种情况下,identity分区器才会出现。
因此,在上述场景中,caderpartitioner将对上述mr进行分区,因为它有3个条件,它将把输入键分成3个不同的组,并将这些单独的组发送到不同的reducer,reducer将相应地进行。
希望这有帮助。

sczxawaw

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到分区中,然后谁将在单独的缩减器中结束。

相关问题