溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

hive中數據傾斜

發布時間:2020-06-14 19:17:24 來源:網絡 閱讀:810 作者:abebill 欄目:大數據

數據傾斜通常指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的傾斜
這種情況,需要具體原因具體分析:

  • 由某些特殊值引起的數據傾斜
    參數設置方式:hive.optimize.skewjoin=true; 將造成傾斜的特殊值先不處理直接寫入hdfs,然后新啟一個mapjoin專門處理特殊值;可以通過參數設置數據量超過多少默認為特殊值,如hive.skewjoin.key=10000,表名超過10000條的key會被認定為特殊值;
    特殊值的處理也可以在sql中進行優化,在sql中將特殊值與非特殊值分別處理,然后再通過union all拼接,但這樣會增加IO;
  • 由空值引起的數據傾斜
    將空值的key變為一個字符串加上隨機數,也可以借鑒特殊值的sql優化方式;
  • 不同數據類型關聯產生的數據傾斜
    如int型的用戶id與string類型的用戶id進行關聯,hive默認會將hash按int類型分配,string類型的數據會全部分配到一個reduce中,此時應將int型轉化為string再做關聯
    2.group by + count distinct
    當sql中出現這種情況時,需預先對group by的字段進行去重處理,然后再進行count
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女