如果在Hadoop Map Reduce中定义了自定义分区器,那么默认的哈希分区器仍然有效吗?

如果在Hadoop Map Reduce中定义了自定义分区器,那么默认的哈希分区器仍然有效吗?,hadoop,mapreduce,partitioner,Hadoop,Mapreduce,Partitioner,由于我是hadoop新手,我尝试了hadoop中的示例代码,发现该程序根据年龄组使用了3个不同的分区,并且还使用了3个还原器,这是预期的。但是在reducer代码中(这里的性别是键Male/Female),我仍然得到,,,我假设这个值列表的创建是由hash分区器完成的。但是,正如我定义的getPartitions()一样,这个列表是由谁创建的 在上面的示例代码中,我们在run方法中有下面的驱动程序代码-- 在这里您可以看到,它将CaderPartitioner类设置为上述先生的分区器,并且按照M

由于我是hadoop新手,我尝试了hadoop中的示例代码,发现该程序根据年龄组使用了3个不同的分区,并且还使用了3个还原器,这是预期的。但是在reducer代码中(这里的性别是键Male/Female),我仍然得到,,,我假设这个值列表的创建是由hash分区器完成的。但是,正如我定义的getPartitions()一样,这个列表是由谁创建的

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

在这里您可以看到,它将CaderPartitioner类设置为上述先生的分区器,并且按照Map Reduce规范,如果我们的程序没有设置任何自定义分区器,那么只有在这种情况下,identity分区器才会出现

因此,在上述场景中,CaderPartitioner将发生,并为上述MR进行分区。因为它有3个条件,它将把输入键分成3个不同的组,并将这些单独的组发送到不同的reducer,reducer将相应地发生


希望这有帮助。

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

在这里您可以看到,它将CaderPartitioner类设置为上述先生的分区器,并且按照Map Reduce规范,如果我们的程序没有设置任何自定义分区器,那么只有在这种情况下,identity分区器才会出现

因此,在上述场景中,CaderPartitioner将发生,并为上述MR进行分区。因为它有3个条件,它将把输入键分成3个不同的组,并将这些单独的组发送到不同的reducer,reducer将相应地发生

希望这有帮助。

对getPartition()方法的简单解释 如果您的作业有3个减数,那么它们也会被整数索引:0、1和2

getPartition()
方法的目的是将映射输出中的每一对(键、值)作为参数,并决定该对是否应转到还原器0、1或2。这就是为什么
getPartition()
方法的返回类型是int

因此(经过
getPartition()
分析后)受Reducer 2影响的所有映射输出将被写入同一个分区,也被索引为2。该分区将位于映射器中,等待reducer 2获取它

你会问,谁创建了这个分区?根据我的发现,它是一个名为
MapFileOutputFormat
的类,使用名为
getEntry()
的方法。正如类名所示,可能是一个负责管理地图输出数据的类

HashPartitioner
是默认的分区器,仅在未为作业定义任何分区器时使用。它仅基于(key,value)对的key的hashcode,因此具有相同key(即相同hashcode)的所有对最终都位于相同的分区器中,这是MapReduce中的默认行为

在您的教程中 您在教程中提到的代码使用自定义分区器,其
getPartition()
方法的实现将年龄组与某些分区器相关联。(20岁以下至0号减速器,20至30岁至1号减速器等)

此自定义分区器(
caderPartitioner
)是MapReduce作业的分区器,因为它是使用
job.setPartitionerClass()
设置的。一个作业中只有一个分区器,因此此作业中从未使用过
HashPartitioner
,因此它在您的情况下完全不起任何作用

因此,为了回答您的问题,如果我理解得很好,
caderPartitioner
负责决定如何将映射输出分离到分区中,这些分区最终将被分离到单独的还原器中。

getPartition()方法的简单解释 如果您的作业有3个减数,那么它们也会被整数索引:0、1和2

getPartition()
方法的目的是将映射输出中的每一对(键、值)作为参数,并决定该对是否应转到还原器0、1或2。这就是为什么
getPartition()
方法的返回类型是int

因此(经过
getPartition()
分析后)受Reducer 2影响的所有映射输出将被写入同一个分区,也被索引为2。该分区将位于映射器中,等待reducer 2获取它

你会问,谁创建了这个分区?根据我的发现,它是一个名为
MapFileOutputFormat
的类,使用名为
getEntry()
的方法。正如类名所示,可能是一个负责管理地图输出数据的类

HashPartitioner
是默认的分区器,仅在未为作业定义任何分区器时使用。它仅基于(key,value)对的key的hashcode,因此具有相同key(即相同hashcode)的所有对最终都位于相同的分区器中,这是MapReduce中的默认行为

在您的教程中 您在教程中提到的代码使用自定义分区器,其
getPartition()
方法的实现将年龄组与某些分区器相关联。(20岁以下至0号减速器,20至30岁至1号减速器等)

此自定义分区器(
caderPartitioner
)是MapReduce作业的分区器,因为它是使用
job.setPartitionerClass()
设置的。一个作业中只有一个分区器,因此此作业中从未使用过
HashPartitioner
,因此它在您的情况下完全不起任何作用

因此,为了回答您的问题,如果我理解得很好,
CaderPatitioner
负责决定如何将映射输出分离到分区中,然后谁将在单独的还原器中结束

  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;