數據傾斜通常指hive根據key值hash分發到各個節點,相同的key值會分發到一個執行節點中,由于某些key值對應的數據量比其它key值的數據量大很多,導致某些執行節點的運行時間遠大于其它節點,從而導致整個job執行時間較長。
在hive中執行的sql會有map和reduce兩個階段,map階段的數據傾斜主要為數據從磁盤讀入內存時、join,reduce階段數據傾斜主要有join、group by、count distinct,針對于這些操作有不同的處理方式來避免數據傾斜。
一、map階段
1.由于map讀入數據的文件大小分布不均勻,并且小文件特別多,導致某些map讀取并處理的數據特別多
這種情況可通過參數調整防止由于小文件過多導致每個map讀取的數據量不均勻,mapred.max.split.size=256000000(每個map可以處理的最大文件大小,可調大該值來減少map數)
二、reduce階段
1.join
數據表在進行join時有兩種情況會出現傾斜:
(1)小表和大表join的傾斜
這種情況,可以直接使用hint(如/ + mapjoin(a) /)將小表全部加載到內存中后順序掃描大表完成join(mapjoin有使用限制,必須是join中的從表較小時才可用,從表主要指left join中的右表,right join中的左表,小表最大為2GB)
(2)大表和大表join的傾斜
這種情況,需要具體原因具體分析:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。