2011-06-12 61 views
4

我有一個關於在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);

所以總而言之,如果我想要使用更多映射器同時連接多對文件,應該如何構建正確的表達式?

回答

1

我認爲你錯過了這一點。你不控制mappers的數量。這是您控制的減速器數量。只需從您的映射器發出正確的密鑰。然後運行10個減速器。

+0

確定可以控制映射器的數量,您必須將n個文件放入輸入目錄並作爲fileinputformat提交。 – 2011-06-15 15:19:33

4

有地圖和減少邊連接。 您建議使用地圖邊連接,該地圖邊連接在映射器內部執行,而不是在它之前執行。 雙方必須具有相同的鍵和值類型。所以你不能加入LongWritableText,儘管它們可能具有相同的值。

有微妙的更多的事情需要注意:

  • 輸入文件進行排序,所以它有可能是減速機的輸出
  • 你可以控制你的加入-MAP-映射器的數量通過設置在作業減速器的數量階段應該已經排序的數據集

整個過程基本上是這樣的:你有數據集A和集B,二者共享同一個密鑰,比方說LongWritable

  1. 運行兩個作業那種兩個datasetsby他們的鑰匙,這兩個作業必須減速機的數量設置同等數量的,說2
  2. 這將導致2 分類文件每個數據集
  3. 現在你設置了加入數據集的工作,這個工作將會產生2個映射器。如果你在之前的工作中設置更高的數字,這可能會更多。
  4. 在縮小步驟中做任何你喜歡的事情。

如果要加入的文件數量不相等,則會在作業設置過程中導致異常。

設置連接有點痛苦,主要是因爲如果您的版本低於0.21.x,您必須使用舊API for mapper和reducer。

This document describes very well how it works.一直滾動到底部,遺憾的是這個文檔在最新的Hadoop文檔中有些遺漏。

另一個很好的參考資料是「Hadoop權威指南」,其中更詳細地解釋了所有這些和示例。

相關問題