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

     2023-04-18     125

关键词:

【中文标题】如果在 Hadoop Map Reduce 中定义了自定义分区器,默认哈希分区器是不是仍然有效?【英文标题】:Does the default hash partitioner still work if a custom partitioner is defined in Hadoop Map Reduce?如果在 Hadoop Map Reduce 中定义了自定义分区器,默认哈希分区器是否仍然有效? 【发布时间】:2015-11-24 20:09:23 【问题描述】:

由于我是hadoop新手,我尝试了http://www.tutorialspoint.com/map_reduce/map_reduce_partitioner.htm的示例代码,我发现该程序使用了3个基于年龄组的不同分区,并且还使用了3个reducer,这是意料之中的。但是在 reducer 代码中(这里的性别是男性/女性的关键)我仍然得到,我假设 这个值列表 创建是由哈希分区器完成的。但是正如我定义的 getPartitions() ,这个列表是谁创建的?

【问题讨论】:

【参考方案1】:

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

  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 类作为上述 MR 的分区器。根据 Map Reduce 规范,如果我们的程序没有设置任何自定义分区器,那么只有在这种情况下,身份分区器才会出现。

所以在上述场景中,CaderPartitioner 将发生并为上述 MR 进行分区。由于它有 3 个条件,它将输入键分成 3 个不同的组,并将这些单独的组发送到不同的减速器,减速器将相应地发生。

希望这会有所帮助。

【讨论】:

【参考方案2】:

getPartition()方法简单说明

如果您的作业有 3 个 reducer,它们也由整数索引:0、1 和 2。

getPartition() 方法的目的是将 map 输出的每个 (key, value) 对作为参数,并决定该对是否应该转到 reducers 0、1 或 2。这就是 getPartition() 方法的原因返回类型是 int

因此(在被 getPartition() 分析后)影响到 Reducer 2 的所有映射输出都将写入同一个分区,索引也为 2。该分区将位于映射器内部,等待减速器 2拿来。

你问谁创建了这个分区?根据我的发现,这是一个名为MapFileOutputFormat 的类,在一个名为getEntry() 的方法中。顾名思义,可能是一个负责管理地图输出数据的类。

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

在你的教程中

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

这个自定义分区器 (CaderPatitioner) 是 MapReduce 作业的分区器,因为它是使用 job.setPartitionerClass() 设置的。作业中只有一个分区器,因此 HashPartitioner 从未用于此作业,因此在您的情况下它绝对没有任何作用。

所以回答你的问题,如果我理解得很好,CaderPatitioner 负责决定如何将映射输出分成多个分区,然后这些分区将在单独的 reducer 中结束。

【讨论】:

hadoop中map和reduce的数量设置问题

...行运行来实现任务的分布式并行计算,从这个观点来看,如果将map和reduce的数量设置为1,那么用户的任务就没有并行执行,但是map和reduce的数量也不能过多,数量过多虽然可以提高任务并行度,但是太多的 查看详情

hadoop第五课:java开发map/reduce

配置系统环境变量HADOOP_HOME,指向hadoop安装目录(如果你不想招惹不必要的麻烦,不要在目录中包含空格或者中文字符)把HADOOP_HOME/bin加到PATH环境变量(非必要,只是为了方便)如果是在windows下开发,需要添加windows的库文件把... 查看详情

java示例代码_如何(在Hadoop中)将数据以正确的类型放入map和reduce函数中

java示例代码_如何(在Hadoop中)将数据以正确的类型放入map和reduce函数中 查看详情

如何在hadoop map reduce作业中有效地缓存大文件?

】如何在hadoopmapreduce作业中有效地缓存大文件?【英文标题】:howtoefficientlycachelargefileinhadoopmapreducejobs?【发布时间】:2014-10-3003:51:45【问题描述】:我的工作流程如下:我正在处理大量数据。我有一个需要缓存的MapFile。该文件... 查看详情

如何在本地测试 Map 和 Reduce 代码?

...pandReduceCode?【发布时间】:2017-02-1817:39:26【问题描述】:如果我有一个从多个csv文件读取并生成键值对的map.py文件,我如何将它们传递给我的reducer.py并在本地进行测试?【问题讨论】:以伪模式安装hadoop【参考方案1】:如果您... 查看详情

在 Hadoop Map-Reduce 中,是不是有任何类在排序之后和分区之前看到整个键列表?

】在HadoopMap-Reduce中,是不是有任何类在排序之后和分区之前看到整个键列表?【英文标题】:InHadoopMap-Reduce,doesanyclassseethewholelistofkeysaftersortingandbeforepartitioning?在HadoopMap-Reduce中,是否有任何类在排序之后和分区之前看到整个键... 查看详情

在 Hadoop 中链接多个 MapReduce 作业

】在Hadoop中链接多个MapReduce作业【英文标题】:ChainingmultipleMapReducejobsinHadoop【发布时间】:2011-01-3018:31:31【问题描述】:在您应用MapReduce的许多实际情况中,最终算法最终是几个MapReduce步骤。即Map1、Reduce1、Map2、Reduce2等。因此... 查看详情

hadoop map reduce中分组比较器有啥用

】hadoopmapreduce中分组比较器有啥用【英文标题】:Whatistheuseofgroupingcomparatorinhadoopmapreducehadoopmapreduce中分组比较器有什么用【发布时间】:2013-02-0611:54:53【问题描述】:我想知道为什么在mapreduce的二级排序中使用分组比较器。根... 查看详情

为啥我的 hadoop map reduce 程序中出现类转换异常?

】为啥我的hadoopmapreduce程序中出现类转换异常?【英文标题】:Whyamigettingclasscastexceptioninmyhadoopmapreduceprogram?为什么我的hadoopmapreduce程序中出现类转换异常?【发布时间】:2012-09-2114:31:14【问题描述】:为什么我的hadoopmapreduce程... 查看详情

Hadoop MapReduce 中的“Map”和“Reduce”函数

】HadoopMapReduce中的“Map”和“Reduce”函数【英文标题】:"Map"and"Reduce"functionsinHadoop\'sMapReduce【发布时间】:2013-03-2800:53:16【问题描述】:我一直在查看hadoop的这个字数统计示例:http://hadoop.apache.org/docs/r1.0.4/mapred_tu... 查看详情

在hadoop中链接多个mapreduce作业(代码片段)

...所以你不想在编写和读取这些键值对时花费太多精力。在Hadoop中推荐的方 查看详情

Hadoop 生态系统:Pig/Hive 所需的 Map Reduce

】Hadoop生态系统:Pig/Hive所需的MapReduce【英文标题】:HadoopEcosystem:MapReduceneededforPig/Hive【发布时间】:2018-05-0315:28:55【问题描述】:互联网上有很多hadoop生态系统图片,所以我很难理解这些工具是如何协同工作的。例如在附图中... 查看详情

Hadoop Map Reduce 程序

】HadoopMapReduce程序【英文标题】:HadoopMapReduceProgram【发布时间】:2011-07-2117:41:51【问题描述】:当我尝试基于Hadoop0.20API的HadoopinAction书中的MapReduce编程示例时,我收到了错误java.io.IOException:映射中的值类型不匹配:预期org.apache... 查看详情

hadoopmapreduce进程都有哪些

首先hadoop框架要求程序员将函数分成两部分,即map和reduce函数。map阶段:就是将输入通过map函数处理得出中间结果并通过hadoop框架分配到不同的reduce。reduce阶段:就是将中间结果通过reduce函数处理得到最后的结果。以wordcount为例... 查看详情

hadoop——在命令行下编译并运行map-reduce程序2

 hadoopmap-reduce程序的编译需要依赖hadoop的jar包,我尝试javac编译map-reduce时指定-classpath的包路径,但无奈hadoop的jar分布太散乱,根据自己写的程序来一个个指定jar包的位置又太麻烦,于是又尝试修改java的classpath配置文件,结果... 查看详情

hadoop——配置eclipse下的map-reduce运行环境1

...ap-reduce的eclipse插件eclipse的map-reduce插件可以很方便的创建hadoop项目(自动导入所依赖的map-reducejar包)和打开map-reduce视图(在里面可以像查看本机文件系统一样直观的看到hdfs文件系统的结构)安装详细步骤:i)查找ecl 查看详情

使用 Hadoop Map reduce 处理和拆分大数据?

】使用HadoopMapreduce处理和拆分大数据?【英文标题】:ProcessingandsplittinglargedatausingHadoopMapreduce?【发布时间】:2014-10-2001:02:57【问题描述】:我在文本文件中有大量数据(1,000,000行)。每行有128列。现在我正在尝试用这些大数据... 查看详情

hadoop如何分配job来map和reduce

】hadoop如何分配job来map和reduce【英文标题】:Howdoeshadoopdistributejobstomapandreduce【发布时间】:2015-06-0604:19:46【问题描述】:谁能解释一下hadoop是如何决定将作业传递给map和reduce的。Hadoop作业被传递到map和reduce,但我无法弄清楚它... 查看详情