2013-08-27 137 views
1

我需要把多個MapReduce的工作流,以便在大數據集進行一些計算。多個MapReduce作業

我打算以加快整體工作使用多個減速爲每個作業。作爲工作流調度程序,我使用Oozie。

這裏有一個例子,以澄清我的問題: 讓說,我有兩個文件

File 1:   File 2: 
A B 1   A B 3 
A C 4   C D 6 
B D 2   B D 1 

我想有兩個映射器和兩個減速,並得到了MapReduce工作的輸出如下:

Output: 
A B 4 
A C 4 
B D 3 
C D 6 

但是,這是不是在所有我所得到的,而不是我有部分款項。

這是我想的事情。

因爲我對每個MapReduce工作多減速器,下一個作業的輸入拆分成幾個文件。這些文件被提供給映射器,然後映射器將其輸出發送到reducer。看起來,映射器將它們的輸出發送到reducers,而不用等待整個輸入被處理,並用name1排序,例如,作爲鍵。

我讀過有關使用多個文件作爲輸入幾個線程,我不認爲這是執行地圖方聯接的問題。也許它做的分區,但我不完全理解包括在什麼分區。

有沒有辦法把它發送到減速前幾個映射器的輸出進行排序?或者我可以告訴Oozie合併多個reducer的輸出,以便只有一個文件作爲下一個MapReduce Job的輸入?

回答

0

我對MapReduce稍微有點新,但是看起來你的工作沒有正確處理鍵,如果你沒有根據你的例子得到想要的輸出。

默認情況下,Hadoop流式傳輸使用Tab作爲默認的字段分隔符,並將一行從第一個Tab字符開始作爲關鍵字。在你的情況,如果你的輸入格式實際上是「A [空格] B [空格] 1」,則需要

-D stream.map.output.field.separator= \ 
-D stream.num.map.output.key.fields=2 \ 

,以設置空間列分隔符添加到您的Hadoop流命令和前2列爲關鍵。這會將所有以「A B」開頭的行映射到同一個縮減器。更多信息可以發現here

+0

謝謝你的回答,但我的分隔符確實是一個選項卡,即使我在我的問題中使用了空格作爲分隔符。我用分區器解決了我的問題。 –