我有一個關於在Hadoop中爲多個映射器配置Map/Side內部連接的問題。 假設我有兩個非常大的數據集A和B,我使用相同的分區和排序算法將它們分成更小的部分。對於A,假設我有(1)到(10),對於B我有b(1)到b(10)。確保a(1)和b(1)包含相同的密鑰,a(2)和b(2)具有相同的密鑰,依此類推。我想設置10個映射器,具體來說,映射器(1)映射器(10)。據我所知,Map/Side連接是mapper之前的一個預處理任務,因此,我想加入一個(1)和b(1)for mapper(1),加入一個(2)和b 2)用於映射器(2),等等。在Hadoop中爲多個映射器配置映射端加入Map/Reduce
在閱讀了一些參考資料後,我仍不清楚如何配置這10個映射器。據我所知,使用CompositeInputFormat我可以加入兩個文件,但似乎只配置一個映射器並在對(連續10個任務)後加入20個文件對。如何在真正的Map/Reduce(並行10個任務)中同時配置所有這10個映射器並加入10對?據我瞭解,10個映射器需要10個CompositeInputFormat設置,因爲要加入的文件都是不同的。我堅信這是實用可行的,但我無法弄清楚我應該使用什麼確切的命令。
任何暗示和建議是非常受歡迎和讚賞。
施
非常感謝您的答覆,大衛和托馬斯!
我很欣賞你對Map-side Join前提條件的重視。是的,我知道排序,API等等。在閱讀你的評論之後,我認爲我的實際問題是在CompositeInputFormat中加入兩個文件的多個拆分的正確表達式是什麼。例如,我有數據A和數據B排序和在2檔分別減少:
/A /數據A-R-00000
/A /數據A-R-00001
/B /數據B-R -00000
/B /數據B-R-00001
我現在使用中的表達命令是:
內(TBL(org.apache.hadoop.mapred.KeyValueTextInputFormat,「/ A /數據A -R-00000" ) ,tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,「/ B/dataB-r-00000」))
它可以工作,但正如你所提到的,它只啓動兩個映射器(因爲內部連接可以防止分裂)如果文件很大,可能效率很低。如果我想使用更多的映射器(也就是說另外兩個映射器加入dataA-r-00001和dataB-r-00001),我應該如何構造表達式,如下所示:
String joinexpression =「inner(tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat'/ A/dataA-r-00000'),tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,'/ B/dataB-r-00000'),tbl(org .apache.hadoop.mapred.KeyValueTextInputFormat'/ A/dataA-r-00001'),tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,'/ B/dataB-r-00001'))「;
但我認爲這可能是錯誤的,因爲上面的命令實際上執行四個文件的內部連接(由於文件* r-00000和* r-00001具有不重疊的鍵,這在我的情況下不會導致任何結果)。
或者我可以只使用兩個顯示目錄作爲輸入,如:
字符串joinexpression =「內(TBL(org.apache.hadoop.mapred.KeyValueTextInputFormat, '/ A /'),TBL(有機apache.hadoop.mapred.KeyValueTextInputFormat,'/ B /'))「;
內部連接會根據文件結尾自動匹配對,比如說「00000」到「00000」,「00001」到「00001」?我被困在這一點上,因爲我需要構造表達式並將它傳遞給
conf.set(「mapred.join.expr」,joinexpression);
所以總而言之,如果我想要使用更多映射器同時連接多對文件,應該如何構建正確的表達式?
確定可以控制映射器的數量,您必須將n個文件放入輸入目錄並作爲fileinputformat提交。 – 2011-06-15 15:19:33