如果在Hadoop Map Reduce中定义了自定义分区器,那么默认的哈希分区器仍然有效吗?
由于我是hadoop新手,我尝试了hadoop中的示例代码,发现该程序根据年龄组使用了3个不同的分区,并且还使用了3个还原器,这是预期的。但是在reducer代码中(这里的性别是键Male/Female),我仍然得到,,,我假设这个值列表的创建是由hash分区器完成的。但是,正如我定义的getPartitions()一样,这个列表是由谁创建的 在上面的示例代码中,我们在run方法中有下面的驱动程序代码-- 在这里您可以看到,它将CaderPartitioner类设置为上述先生的分区器,并且按照Map Reduce规范,如果我们的程序没有设置任何自定义分区器,那么只有在这种情况下,identity分区器才会出现 因此,在上述场景中,CaderPartitioner将发生,并为上述MR进行分区。因为它有3个条件,它将把输入键分成3个不同的组,并将这些单独的组发送到不同的reducer,reducer将相应地发生如果在Hadoop Map Reduce中定义了自定义分区器,那么默认的哈希分区器仍然有效吗?,hadoop,mapreduce,partitioner,Hadoop,Mapreduce,Partitioner,由于我是hadoop新手,我尝试了hadoop中的示例代码,发现该程序根据年龄组使用了3个不同的分区,并且还使用了3个还原器,这是预期的。但是在reducer代码中(这里的性别是键Male/Female),我仍然得到,,,我假设这个值列表的创建是由hash分区器完成的。但是,正如我定义的getPartitions()一样,这个列表是由谁创建的 在上面的示例代码中,我们在run方法中有下面的驱动程序代码-- 在这里您可以看到,它将CaderPartitioner类设置为上述先生的分区器,并且按照M
希望这有帮助。在上面的示例代码中,我们在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;