2013-06-18 19 views
5

我們有一個小的(16M行)不同的表和一個大的(6B行)歪斜表之間的豬連接。 定期加入在2小時內完成(經過一些調整)。我們嘗試using skewed並能夠將性能提高到20分鐘。豬歪斜加入大表導致「拆分元數據大小超過10000000」

然而,當我們嘗試一個更大的傾斜表(19B行),我們從取樣作業此消息:

Split metadata size exceeded 10000000. Aborting job job_201305151351_21573 [ScriptRunner] 
at org.apache.hadoop.mapreduce.split.SplitMetaInfoReader.readSplitMetaInfo(SplitMetaInfoReader.java:48) 
at org.apache.hadoop.mapred.JobInProgress.createSplits(JobInProgress.java:817) [ScriptRunner] 

這每一次我們試圖using skewed時間是可重複的,並且當我們使用不會發生經常加入。

我們試過設置mapreduce.jobtracker.split.metainfo.maxsize=-1,我們可以看到它在job.xml文件中,但它不會改變任何東西!

這裏發生了什麼?這是由using skewed創建的分佈示例的錯誤嗎?爲什麼它不能幫助將參數更改爲-1

+0

決定提交一個jira bug:https://issues.apache.org/jira/browse/PIG-3411,將更新 – ihadanny

+0

我們發現改變了mapreduce.jobtracker.split.metainfo。已知maxsize不能在工作級別工作,只能在jobTracker級別工作,請參閱https://groups.google.com/a/cloudera.org/forum/#!topic/cdh-user/UWBMKplvGkg – ihadanny

+0

曾經找到解決這個問題的辦法?我們正面臨類似的問題。 – KennethJ

回答

1

1MB的小表格足夠小以適應內存,請嘗試複製連接。 複製連接僅爲Map,不會導致Reduce階段與其他類型的連接一樣,因此不受連接鍵中的歪斜影響。它應該很快。

big = LOAD 'big_data' AS (b1,b2,b3); 
tiny = LOAD 'tiny_data' AS (t1,t2,t3); 
mini = LOAD 'mini_data' AS (m1,m2,m3); 
C = JOIN big BY b1, tiny BY t1, mini BY m1 USING 'replicated'; 

大表總是第一個在聲明中。

更新1: 如果原來的形式小表不適合到內存中,不是作爲一個工作,你身邊需要你的小桌子劃分成足夠小,以適應到內存分區,比應用相同的分區到大表,希望你可以添加相同的分區算法到創建大表的系統,這樣你就不會浪費時間重新分區了。 分區後,您可以使用複製連接,但需要分別爲每個分區運行豬腳本。

+0

不錯的想法,但小表不是1MB(編輯問題),並且不適合在hadoop緩存中(嘗試它) – ihadanny

+0

已更新答案。請參閱更新1. – alexeipab

+0

再次感謝,但我正在尋找原始問題的解釋。這是一個很酷的解決方法,但我不會去,直到我明白傳統加入的問題 – ihadanny

0

在Hadoop的(> = 2.4.0,但也許甚至更早),你應該能夠通過以下配置屬性在作業級別設置最大劃分大小的新版本:

mapreduce.job.split .metainfo.maxsize = -1

相關問題