2015-04-03 64 views
2

我正在R中编写Hadoop流式处理作业,而且我遇到了一个相当奇怪的情况,我找不到任何文档。我想运行一个减少工作(不需要映射器),直接传递给另一个映射器。没有初始映射器,是否可以在缩减作业之后直接堆叠地图作业?如果我编写一个身份映射器来将输出传递给我的reduce工作,那么我可以将reduce输出传递给另一个映射器,如果是这样,怎么办?我目前的代码是:Hadoop流式缩减器映射器

$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 

而这不起作用。

回答

2

我会回答你的问题,然后给我的建议。

您不能将减少的输出直接发送到映射器。它总是地图,然后减少。只是它的工作方式。但是,您可以拥有两个MapReduce作业。将Reducer写入HDFS,然后启动第二个仅用于地图的作业,以读取第一个作业的输出数据。

一般来说,如果你想在缩小后做一张地图,你几乎总是可以将它们折叠成相同的东西。考虑一下:如果你正在映射reducer的每个输出记录,为什么不直接在reducer的末尾运行这个“映射”代码呢?这比运行两个MapReduce作业更有效率。如果你真的不想编写一个新的R脚本来做到这一点,你可以将它包装在一个bash脚本中,以便它看起来像是一个脚本。

相关问题