hive 已經(jīng)自動mapjoin優(yōu)化,將小表載入到內(nèi)存礁遵;不需要再mapjoin 設(shè)置轻绞。
但是skewjoin 還是得手動設(shè)置(你可每次都添加此設(shè)置,沒看見有副作用)
參考:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
官方參考太長佣耐,根據(jù)2/8定律政勃,將常用的梳理如下:
參考:http://www.cnblogs.com/xd502djj/p/3799432.html
優(yōu)化效果舉例:
mapjoin的使用方法是在提交hive任務(wù)的時候,加上--hiveconf hive.auto.convert.join=true兼砖,這個參數(shù)會自動識別小表的數(shù)據(jù)并 在map之前把數(shù)據(jù)加到hashtable里奸远。
適用場景是:當(dāng)join的兩個表是一個比較小的表和一個特別大的表的時候,可以用mapjoin對hive執(zhí)行過程進(jìn)行優(yōu)化讽挟。其思想是把比較小的表直接放到內(nèi)存中去懒叛,然后再對較大的表進(jìn)行map操作,join就發(fā)生在map階段并不會涉及reduce操作耽梅,避免大表的數(shù)據(jù)有數(shù)據(jù)傾斜在reduce階段jion導(dǎo)致內(nèi)存溢出薛窥。
優(yōu)化前,join在reduce階段,單個結(jié)點(diǎn)數(shù)據(jù)傾斜內(nèi)存溢出導(dǎo)致任務(wù)失敗诅迷,跑了15分鐘
優(yōu)化后佩番,沒有reduce過程,在map已經(jīng)完成jion罢杉,沒有數(shù)據(jù)傾斜的問題趟畏,運(yùn)行時間縮短到了不到2分鐘
還有其他幾種join優(yōu)化方法我都嘗試了下,但都沒有解決這個場景下數(shù)據(jù)傾斜的問題滩租,可能并不適用于這個場景赋秀,但在其他場景下可以參考:
- 在JOIN操作的時候,分區(qū)過濾(如:ds=$yday)需要放到 ON語句 或子查詢 里面持际,不能放到ON后面的WHERE里沃琅,這樣會全表掃描哗咆,最后才判斷分區(qū)蜘欲,也就是說程序會先執(zhí)行JOIN操作,才會執(zhí)行最后的WHERE操作晌柬。
2.執(zhí)行join操作的時候姥份,盡量把小表放前面,大表放在后面年碘。大表放前面可能會因?yàn)閮?nèi)存溢出而出錯澈歉;
3.skew join,其原理把join的key是0的特殊值先不在reduce端計(jì)算掉屿衅,而是先寫入hdfs埃难,然后啟動一輪map join專門做這個特殊值的計(jì)算,期望能提高計(jì)算這部分值的處理速度涤久。當(dāng)然你要告訴hive這個join是個skew join涡尘,即:set hive.optimize.skewjoin = true;還有要告訴hive如何判斷特殊值,根據(jù)hive.skewjoin.key設(shè)置的數(shù)量hive可以知道响迂,比如默認(rèn)值是100000考抄,那么超過100000條記錄的值就是特殊值。