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

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

【问题讨论】:

标签: hadoop mapreduce


【解决方案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】:

    【讨论】:

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

    【讨论】:

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