2015-04-03 86 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腳本中,以便它看起來像是一個腳本。