我正在R中编写Hadoop流媒体作业,我遇到了一个相当奇怪的情况,我找不到任何文档。我想运行一个直接传递到另一个映射器的reduce工作(不需要mapper)。是否可以在没有初始映射器的reduce作业之后直接堆叠地图作业?如果我写一个身份映射器将输出传递给我的reduce作业,那么我可以将reduce输出传递给另一个mapper,如果是的话,怎么做?我目前的代码是:
$HADOOP_HOME/bin/hadoop jar /opt/cloudera/parcels/CDH-5.3.2-1.cdh5.3.2.p0.10/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming.jar \
-reduce myreducer.r \
-input myinput/ \
-output myoutputdir \
-file file1.r \
-file file2.Rdata
这不起作用。
答案 0 :(得分:2)
我会回答你的问题,然后提出我的建议。
您无法将reduce输出直接发送到映射器。它总是映射,然后减少。就是它的工作方式。但是,您可以拥有两个MapReduce作业。让reducer写出HDFS,然后启动第二个只读地图的作业,读取第一个作业的输出数据。
一般来说,如果你想在减少之后做一个地图,你几乎总是可以将它们折叠成同一个东西。想想看:如果你要从reducer中映射每个输出记录,为什么不在reducer的末尾运行那个“map”代码呢?这比运行两个MapReduce作业更有效。如果你真的不想编写一个新的R脚本来执行此操作,可以将其包装在bash脚本中,使它看起来像是一个脚本。