2016-10-01 28 views
0

我試圖(內)加入HDFS分區由'天'(日期)多天(如2周)兩個表。兩個表都有100列,但我只是試圖查詢它們中的10個。每天有超過十億行。Hive查詢不斷失敗。如何最佳地加入非常大的桌子?

我的HIVE查詢看起來像下面。

INSERT OVERWRITE TABLE join1 partition (day) 
SELECT a.x1, a.x2, a.x3... a.xn, b.y1, b.y2.... b.ym, b.day 
from (
    select x1, x2, x3... xn 
    from table1 
    where day between day1 and day2 
) a 
join (
    select x1, y1, y2,... ym, day 
    from table2 where day between day1 and day2 
) b 
on a.x1=b.x1; 

第一個問題 - 即使是較短的時間(1-7天),也需要很長時間(12小時以上)才能完成此操作。

第二個問題 - 每次嘗試超過10天左右都會失敗。它使用大約504個映射器和250個減速器,這是默認的(我也試過500個減速器)。

Failure Info

我知道這個錯誤是不是真正的(What is Hive: Return Code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask),但即使是真正的錯誤並不是很有用(抱歉,我現在不能得到它)。

這是什麼原因導致崩潰?任何人都可以提出一個更好的方式來加入這麼大的表格嗎

+0

嘗試使用TEZ執行引擎運行您的查詢。並且添加'-hiveconf hive.root.logger = DEBUG,console'可以給你更多關於錯誤的細節。 – Ambrish

回答

0

這是太長的評論。

某些數據庫在優化子查詢時遇到問題。我可以想象這是Hive的問題。所以,我建議:

select a.x1, a.x2, a.x3... a.xn, b.y1, b.y2.... b.ym, b.day 
from table1 a join 
    table2 b 
    on a.x1 = b.x1 
where a.day between a.day1 and a.day2 and 
     b.day between b.day1 and b.day2; 

我也想知道,如果你想在on子句中的條件a.day = b.day。在連接中使用現有的分區鍵應該有助於提高性能。

+0

完全沒有改善。同樣的錯誤! –

0

關於錯誤:

由於使用動態分區上join1,你有沒有正確設置,可創建分區的最大數量?

關於速度:

是你的Table 1和Table這樣定義的?

CREATE table1 ( 
    x1 string, 
    x2 string, 
    : 
) PARTITIONED BY (day int) 
CLUSTERED BY ('x1') 
SORTED BY (x1) INTO 400 BUCKETS; 

,此表由天分隔,從而訪問任何一天只需要訪問相應的分區,而不是整個文件。這會加快你的內部查詢。 它也使用分水器,所以當你在x1上進行連接時,所有具有相同x1值的行在同一個地方粘在一起,這會加速你的連接,不介意這麼大的三角洲。只有在Map階段進行加入(感謝bucketing),才能看到差異。