如何编写“仅地图”hadoop 作业?

Posted

技术标签:

【中文标题】如何编写“仅地图”hadoop 作业?【英文标题】:How to write 'map only' hadoop jobs? 【发布时间】:2012-03-12 18:11:34 【问题描述】:

我是 hadoop 的新手,我对 map-reduce 编程的风格很熟悉,但现在我遇到了一个问题:有时我只需要 map 的工作,我只需要直接将 map 结果作为输出,这意味着这里不需要减少阶段,我怎样才能做到这一点?

【问题讨论】:

查看Map-only Jobs 【参考方案1】:

如果您使用 oozie 作为调度程序来管理您的 hadoop 作业,那么您只需将属性 mapred.reduce.tasks(这是每个作业的默认减少任务数)设置为 0。您可以将映射器添加到属性mapreduce.map.class,也不需要添加属性mapreduce.reduce.class,因为不需要reducer。

<configuration>
   <property>
     <name>mapreduce.map.class</name>
     <value>my.com.package.AbcMapper</value>
   </property>
   <property>
     <name>mapred.reduce.tasks</name>
     <value>0</value>
   </property>
   .
   .
   .
<configuration>

【讨论】:

【参考方案2】:

当您需要仅从终端使用映射器启动作业时,它会很有帮助。您可以通过在 hadoop jar 命令中隐式指定 0 个减速器来关闭减速器:

-D mapred.reduce.tasks=0 

所以结果命令如下:

hadoop jar myJob.jar -D mapred.reduce.tasks=0 -input myInputDirs -output myOutputDir

为了向后兼容,Hadoop 还支持“-reduce NONE”选项,相当于“-D mapred.reduce.tasks=0”。

【讨论】:

现在 hadoop 对 -D mapred.reduce.tasks 给出折旧警告,并建议改用 -D mapreduce.job.reduce。【参考方案3】:

这会关闭减速器。

job.setNumReduceTasks(0);

http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapreduce/Job.html#setNumReduceTasks(int)

【讨论】:

谢谢Thomas,还有一个问题:将reduce任务的数量设置为0后,如何将地图结果保存在hdfs上? (我的意思是如何将地图结果写入part-m-*****之类的文件) Hadoop 为你做这件事,你不需要关心它。 这种情况下是否需要指定reduce输出key和value?【参考方案4】:

您也可以使用 IdentityReducer:

http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/mapred/lib/IdentityReducer.html

【讨论】:

谢谢Peter,我看了IdentityReducer的源码,确实是我的本意,但是有没有什么方法可以不用reduce直接将map结果输出到HDFS呢? (你知道 shuffle 阶段会消耗大量带宽和 cpu/内存资源) IdentityMapper 可以在有或没有后续减速器的情况下使用。如果您使用身份映射器直接跳转到reduce 阶段,您仍然有排序和洗牌和i/o 开销,因此如果您不需要reducer,使用Thomas 提到的方法是正确的方法。 对不起,omnisis,但这是不正确的:将reduce任务的数量设置为零将忽略任何排序。 ***.com/questions/10630447/…

以上是关于如何编写“仅地图”hadoop 作业?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 hbase 作为 hadoop 流作业的来源

如何在Hortonworks沙箱Hadoop平台中运行mapreduce作业

如何编写映射的输出将作业直接减少到分布式缓存,以便将其传递给另一个作业

如何修复 hadoop 中的“非法分区”错误?

如何使用Python为Hadoop编写一个简单的MapReduce程序

如何使用Python为Hadoop编写一个简单的MapReduce程序