資料傾斜的解決辦法
產生原因
- 資料的key分化嚴重不均,造成一部分資料很多,一部分資料很少的局面
- 機器配置和資料量比例不合理,總會有key的數量超出機器處理能力,導致reduce卡頓
- 業務邏輯不合理導致:
- 分組 注:group by 優於distinct group 情形:group by 維度過小,某值的數過多 後果:處理某值的reduce非常耗時
- 去重 distinct count(distinct xx) 情形:某特殊值過多 後果:處理此特殊值的reduce耗時
- 連線 join 情形1:其中一個表較小,但是key集中 後果1:分發到某一個或幾Reduce上的資料遠高於平均值
- 連線 join 情形2:大表與大表,但是分桶的判斷欄位0值或空值過多 後果2:這些空值都由一個reduce處理,非常慢
具體表現(以常見的平臺Hadoop和Spark為例)
Hadoop中的資料傾斜
Hadoop中直接貼近使用者使用使用的時Mapreduce程式和Hive程式,雖說Hive最後也是用MR來執行(至少目前Hive記憶體計算並不普及),但是畢竟寫的內容邏輯區別很大,一個是程式,一個是Sql,因此這裡稍作區分。Hadoop中的資料傾斜主要表現在ruduce階段卡在99.99%,一直99.99%不能結束。 這裡如果詳細的看日誌或者和監控介面的話會發現:
- 有一個多幾個reduce卡住
- 各種container報錯OOM
- 讀寫的資料量極大,至少遠遠超過其它正常的reduce
- 伴隨著資料傾斜,會出現任務被kill等各種詭異的表現。
- Hive的資料傾斜,一般都發生在Sql中Group和On上,而且和資料邏輯繫結比較深。
Spark中的資料傾斜
Spark中的資料傾斜也很常見,這裡包括Spark Streaming和Spark Sql,表現主要有下面幾種:
- Executor lost,OOM,Shuffle過程出錯
- Driver OOM
- 單個Executor執行時間特別久,整體任務卡在某個階段不能結束
- 正常執行的任務突然失敗
- 補充:在Spark streaming程式中,資料傾斜更容易出現,特別是在程式中包含一些類似sql的join、group這種操作的時候。 因為Spark Streaming程式在執行的時候,我們一般不會分配特別多的記憶體,因此一旦在這個過程中出現一些資料傾斜,就十分容易造成OOM。
如何解決傾斜問題
調優引數
- hive.map.aggr=true:在map中會做部分聚集操作,效率更高但需要更多的記憶體。
- hive.groupby.skewindata=true:資料傾斜時負載均衡,當選項設定為true,生成的查詢計劃會有兩個MRJob。第一個MRJob 中,Map的輸出結果集合會隨機分佈到Reduce中,每個Reduce做部分聚合操作,並輸出結果,這樣處理的結果是相同的GroupBy Key有可能被分發到不同的Reduce中,從而達到負載均衡的目的;第二個MRJob再根據預處理的資料結果按照GroupBy Key分佈到Reduce中(這個過程可以保證相同的GroupBy Key被分佈到同一個Reduce中),最後完成最終的聚合操作。
- 起至關作用的是第二項,他分為了兩個mapreduce,第一個在shuffle過程中partition時隨機給key打標記,使其分佈在不同的reduce上計算,但不能完成全部運算,所以需要第二次mapreduce整合迴歸正常的shuffle,由於資料分佈不均問題在第一次時得到改善,所以基本解決資料傾斜問題。
針對key
- 在 map 階段將造成傾斜的key 先分成多組,例如 aaa 這個 key,map 時隨機在 aaa 後面加上 1,2,3,4 這四個數字之一,把 key 先分成四組,先進行一次運算,之後再恢復 key 進行最終運算。
group操作
- 能先進行 group 操作的時候先進行 group 操作,把 key 先進行一次 reduce,之後再進行 count 或者 distinct count 操作。
join操作
- join 操作中,使用 map join 在 map 端就先進行 join ,免得到reduce 時卡住。
- 以上4中方式,都是根據資料傾斜形成的原因進行的一些變化。要麼將 reduce 端的隱患在 map 端就解決,要麼就是對 key 的操作,以減緩reduce 的壓力。總之瞭解了原因再去尋找解決之道就相對思路多了些,方法肯定不止這4種。
資料傾斜解決辦法
相關文章
- Spark 資料傾斜及其解決方案Spark
- Hive千億級資料傾斜解決方案Hive
- Spark SQL三種join和資料傾斜的產生和解決辦法SparkSQL
- 【Spark篇】---Spark解決資料傾斜問題Spark
- IoT資料傾斜如何解決
- 大資料SQL優化之資料傾斜解決案例全集大資料SQL優化
- 實戰 | Hive 資料傾斜問題定位排查及解決Hive
- 一種自平衡解決資料傾斜的分表方法
- Spark學習——資料傾斜Spark
- 如何解決 Redis 資料傾斜、熱點等問題Redis
- hive優化-資料傾斜優化Hive優化
- hadoop 透過cachefile來避免資料傾斜Hadoop
- 【Hive】資料傾斜優化 shuffle, join, group byHive優化
- PostgreSQL DBA(193) - 資料傾斜下的HashJoinSQL
- Redis 切片叢集的資料傾斜分析Redis
- Oracle面對“資料傾斜列使用繫結變數”場景的解決方案Oracle變數
- 如何解決Hive中經常出現的資料傾斜問題Hive
- Spark效能最佳化篇三:資料傾斜調優Spark
- 解決Mysql資料庫插入資料出現問號(?)的解決辦法MySql資料庫
- 五款傾斜攝影與三維資料處理工具介紹:GISBox、Cesiumlab、OSGBLab、靈易智模、傾斜伴侶
- Redis 資料傾斜與 JD 開源 hotkey 原始碼分析揭秘Redis原始碼
- 資料庫 Table is marked as crashed and should be repaired 解決辦法資料庫AI
- AWS建立AMI映像資料丟失解決辦法
- Cesium傾斜模型單體化模型
- Oracle資料傾斜導致的問題-無繫結變數Oracle變數
- Oracle資料傾斜導致的問題-有繫結變數Oracle變數
- salesforce零基礎學習(九十九)Salesforce Data Skew(資料傾斜)Salesforce
- SQLServer資料庫恢復掛起的解決辦法SQLServer資料庫
- 資料庫無法註冊至監聽服務解決辦法資料庫
- PIoU Loss:傾斜目標檢測專用損失函式,公開超難傾斜目標資料集Retail50K | ECCV 2020 Spotlight函式AI
- Navicat還原資料庫不完整的解決辦法資料庫
- SQLServer附加資料庫是隻讀模式的解決辦法SQLServer資料庫模式
- springboot接收Date型別資料異常與解決辦法Spring Boot型別
- MySQL 與 Elasticsearch 資料不對稱問題解決辦法MySqlElasticsearch
- discuz資料庫搬家,改密碼後無法訪問解決辦法資料庫密碼
- 數倉效能最佳化:傾斜最佳化-表示式計算傾斜的hint最佳化
- MYSQL資料庫匯入資料時出現亂碼的解決辦法MySql資料庫
- github慢解決辦法Github