如何编写“仅地图”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 作业?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Hortonworks沙箱Hadoop平台中运行mapreduce作业
如何编写映射的输出将作业直接减少到分布式缓存,以便将其传递给另一个作业