由於一個業務,必須要進行笛卡爾積,但是速度太慢了,left join時左表大概4萬條數據,右表大概 3000多條數據,這樣大概就是一億多條數據,
這在大數據領域其實不算很大的數據量,但是hive中跑的特別慢。因為hive對笛卡爾積支持的不是很好,由於是全局的操作,所以只能在一個reduce中執行,導致速度比較慢。
然后想優化一下,嘗試了一些方法。
比較直接能想到的解決方案是使用mapjoin,hive較高版本中是默認開啟mapjoin的,在開啟狀態下會自動判斷是否使用mapjoin,
我看了一下我的任務,是開啟了mapjoin的
但是還是很慢,不知道是不是mapjoin沒有生效。我關了自動mapjoin試了一下,發現更慢了。。。。看來mapjoin還是有用的。。。。。
所以嘗試了一位網友的建議,很巧妙的一個想法:
注意使用這個最好把默認的自動mapjoin關掉,set hive.auto.convert.join=false,另外就是最好手動設置一下reduce的數量,若復制十倍,set mapred.reduce.tasks = 10,這樣比較保險,但是reduce數量也不是越大越好。
修改之后從mapjoin的600秒降到了不到300秒,大任務上可能效果明顯。