如何书写';仅地图';hadoop作业?

如何书写';仅地图';hadoop作业?,hadoop,mapreduce,Hadoop,Mapreduce,我是hadoop的新手,我逐渐熟悉map reduce编程的风格,但现在我遇到了一个问题:有时我只需要一个作业的map,而我只需要map结果直接作为输出,这意味着这里不需要reduce阶段,我如何实现这一点?这关闭了reducer job.setNumReduceTasks(0); 您也可以使用IdentityReducer: 当您只需要从终端启动带有映射器的作业时,它会非常有用。您可以通过在hadoop jar命令中隐式指定0个减速器来关闭减速器: -D mapred.reduce.task

我是hadoop的新手,我逐渐熟悉map reduce编程的风格,但现在我遇到了一个问题:有时我只需要一个作业的map,而我只需要map结果直接作为输出,这意味着这里不需要reduce阶段,我如何实现这一点?

这关闭了reducer

job.setNumReduceTasks(0);

您也可以使用IdentityReducer:


当您只需要从终端启动带有映射器的作业时,它会非常有用。您可以通过在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”

如果使用oozie作为调度程序来管理hadoop作业,则只需将属性mapred.reduce.tasks(每个作业的reduce任务的默认数量)设置为0即可。您可以在属性mapreduce.map.class中添加映射器,也不需要添加属性mapreduce.reduce.class,因为不需要还原器

<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>

mapreduce.map.class
my.com.package.AbcMapper
mapred.reduce.tasks
0
.
.
.

谢谢Thomas,还有一个问题:将reduce任务数设置为0后,如何在hdfs上保存映射结果?(我的意思是如何将映射结果写入文件,如part-m-****)Hadoop为您做这件事,您不必关心。在这种情况下,我们需要指定reduce输出键和值吗?谢谢您,Peter,我阅读了IdentityReducer的源代码,这正是我的本意,但是有没有任何方法可以直接将map结果输出到HDFS而不使用reduce?(您知道洗牌阶段需要大量的带宽和cpu/内存资源)IdentityMapper可以使用,也可以不使用后续减速机。如果您使用身份映射器直接跳转到reduce阶段,您仍然会有排序和无序处理以及i/o开销,因此如果您不需要reducer,那么使用Thomas提到的方法是正确的。很抱歉,omnisis,但这不正确:将reduce任务数设置为零将忽略任何排序。检查此项,hadoop会为-D mapred.reduce.tasks发出折旧警告,并建议改为使用-D mapreduce.job.reduce。