資料傾斜解決方法,通常從以下幾個方面進行考量:
業務上丟棄
• 不參與關聯:在on條件上直接過濾
• 隨機數打散:比如 null、空格、0等“Other”性質的特殊值
傾斜鍵記錄單獨處理
• Join:找出傾斜key,把對應資料插入臨時表,如果該表是小表,使用map join解決;
• Group by: set hive.groupby.skewindata = true
資料重分佈
• 語法:Distribute By
• 場景:為下一個Stage的Map輸入做負載均衡
• 代價:多一個Job
舉個例子:count distinct
–count(distinct ),在資料量大的情況下,效率較低,如果是多count(distinct )效率更低,因為count(distinct)是按group by 欄位分組,按distinct欄位排序,一般這種分佈方式是很傾斜的。
*淘寶一天30億的pv,按性別分組,分配2個reduce,每個reduce處理15億資料。
*58房產一天1.5億的pv,統計全國分二手房、租房等業務線的詳情頁pv、uv等指標,採用多case when的方式,僅分配一個reduce。
消除count disitnct,可以嘗試“使用者標籤”法。