什麼是資料傾斜:
由於資料分布不均勻,造成資料大量的集中到一點,造成資料熱點
資料傾斜的表現:
任務進度長時間維持在 99%或者 100%的附近,檢視任務監控頁面,發現只有少量 reduce 子任務未完成,因為其處理的資料量和其他的 reduce 差異過大。 單一 reduce 處理的記錄數和平均記錄數相差太大,通常達到好幾倍之多,最長時間遠大 於平均時長。
資料傾斜的原因:
a:key 分布不均勻
b:業務資料本身的特性
c:建表考慮不周全
d:某些 hql 語句本身就存在資料傾斜
資料傾斜產生的情形:
(1)空值產生的資料傾斜
場景:在日誌中,常會有資訊丟失的問題,比如日誌中的 user_id,如果取其中的 user_id 和使用者表中的 user_id 相關聯,就會碰到資料傾斜的問題。
解決方案 1:user_id 為空的不參與關聯
select * from log a join user b on a.user_id is not null and a.user_id = b.user_id
union all
select * from log c where c.user_id is null;
解決方案 2:賦予空值新的 key 值
select * from log a left outer join user b on
case when a.user_id is null then concat(『hive』,rand()) else a.user_id end = b.user_id
(2)不同資料型別關聯產生資料傾斜
場景說明:使用者表中 user_id 欄位為 int,log 表中 user_id 為既有 string 也有 int 的型別, 當按照兩個表的 user_id 進行 join 操作的時候,預設的 hash 操作會按照 int 型別的 id 進 行分配,這樣就會導致所有的 string 型別的 id 就被分到同乙個 reducer 當中
把數字型別 id 轉換成 string 型別的 id
select * from user a left outer join log b on b.user_id = cast(a.user_id as string)
(3)大小表關聯查詢產生資料傾斜
map join 概念:將其中做連線的小表(全量資料)分發到所有 maptask 端進行 join,從 而避免了 reducetask,前提要求是記憶體足以裝下該全量資料
以大表 a 和小表 b 為例,所有的 maptask 節點都裝載小表 b 的所有資料,然後大表 a 的 乙個資料塊資料比如說是 a1 去跟 b 全量資料做鏈結,就省去了 reduce 做彙總的過程。 所以相對來說,在記憶體允許的條件下使用 map join 比直接使用 mapreduce 效率還高些, 當然這只限於做 join 查詢的時候。
在 hive 中,直接提供了能夠在 hql 語句指定該次查詢使用 map join,map join 的用法是 在查詢/子查詢的select關鍵字後面新增/*+ mapjoin(tablelist) */提示優化器轉化為map join(早期的 hive 版本的優化器是不能自動優化 map join 的)。其中 tablelist 可以是乙個 表,或以逗號連線的表的列表。tablelist 中的表將會讀入記憶體,通常應該是將小表寫在 這裡。
在 hive0.11 版本以後會自動開啟 map join 優化,由兩個引數控制:
set hive.auto.convert.join=true; //設定 mapjoin 優化自動開啟
set hive.mapjoin.smalltable.filesize=25000000 //設定小表不超過多大時開啟 mapjoin 優化
如果是大大表關聯呢?那就大事化小,小事化了。把大表切分成小表,然後分別 map join。
大資料中的資料傾斜
文章結構 先大致解釋一下什麼是資料傾斜 再根據幾個場景來描述一下資料傾斜產生的情況 詳細分析一下在hadoop和spark中產生資料傾斜的原因 如何解決 優化 資料傾斜問題?簡單的講,資料傾斜就是我們在計算資料的時候,資料的分散度不夠,導致大量的資料集中到了一台或者幾台機器上計算,這些資料的計算速度...
大資料學習 資料傾斜
2017 10 23 細柳條小秀才翻譯鋪 前言 資料傾斜是日常大資料查詢中 的乙個bug,遇不到它時你覺得資料傾斜也就是書本部落格上的乙個無病呻吟的偶然案例,但當你遇到它是你就會懊悔當初怎麼不多了解一下這個赫赫有名的事故。當然你和資料傾斜的緣分深淺還是看你公司的業務邏輯和資料量有沒有步入資料傾斜的領...
大資料 「資料傾斜」的問題
解決資料傾斜的辦法,前輩已經寫得非常完整了,我這裡就直接搬磚吧 建議先看這個鏈結文章,非常好 下面是自己的總結 什麼是資料傾斜?見下圖 簡單來說資料傾斜就是資料的key 的分化嚴重不均,造成一部分資料很多,一部分資料很少的局面。舉個 word count 的入門例子 它的map 階段就是形成 aaa...