記錄大數據面試歷程
數據傾斜
?大數據崗位 ,數據傾斜面試必問的一個問題。
一、數據傾斜的表現與原因
-
表現
-
某個或某幾個Task執行時間過長,其他Task快速完成。
-
Spark/MapReduce作業卡在某個階段(如
reduce
階段),日志顯示少數Task處理大量數據。 -
資源利用率不均衡(如CPU、內存集中在某些節點)。
-
-
常見場景
-
Key分布不均:如某些Key對應的數據量極大(如用戶ID為空的記錄、熱點事件)。
-
數據分區策略不合理:Hash分區時Key沖突,或Range分區時范圍劃分不均衡。
-
業務邏輯導致傾斜:如大表Join小表時小表廣播失敗,或笛卡爾積操作。
-
二、檢測數據傾斜的方法?
-
日志分析
-
查看任務執行時間分布(如Spark UI的Stage詳情)。
-
檢查Shuffle讀寫數據量(如
Shuffle Read/Write Records
)。
-
-
抽樣統計
-
對Key進行采樣,統計Top N高頻Key(如用
countByKey
或sample
)。
-
-
監控工具
-
使用Ganglia、Prometheus等監控節點資源負載。
-
三、通用解決方案
1. 預處理:過濾或隔離傾斜數據
-
過濾異常Key:直接刪除無意義的傾斜Key(如空值、測試數據)。
-
分離熱點數據:將高頻Key單獨處理,與非傾斜數據合并結果。
-- 示例:將熱點用戶的行為日志單獨處理
SELECT * FROM logs WHERE user_id = 'hot_user' -- 單獨處理
UNION ALL
SELECT * FROM logs WHERE user_id != 'hot_user' -- 正常處理?
?2. 調整Key分布
?增加隨機前綴(Salting):對Key添加隨機數,分散數據到不同分區。
# Spark示例:對傾斜Key添加隨機前綴
skewed_rdd = rdd.map(lambda x: (x[0] + "_" + str(random.randint(0, 9)), x[1]))?
?兩階段聚合:
-
對Key加隨機前綴,局部聚合;
-
去掉前綴,全局聚合。
3. 優化Shuffle過程?
-
提高并行度:增加分區數(如
spark.sql.shuffle.partitions=2000
)。 -
使用Combiner:在Map端預聚合(如ReduceByKey替代GroupByKey)。
-
廣播小表:在Join時,將小表廣播到所有Executor,避免Shuffle。
4. 使用特定框架優化?
-
Spark AQE(Adaptive Query Execution):
Spark 3.0+ 支持動態合并傾斜分區(spark.sql.adaptive.skewJoin.enabled=true
)。 -
Flink KeyBy前加鹽:類似Spark的隨機前綴方法。
-
Hive參數調優:
set hive.map.aggr=true;
?(Map端聚合)
set hive.groupby.skewindata=true;
?(生成兩個MR Job分散負載)。
?四、場景化解決方案
?場景1:Join操作傾斜
?方案1:將小表廣播
-- Spark SQL廣播Join
SELECT /*+ BROADCAST(small_table) */ *?
FROM big_table JOIN small_table ON big_table.key = small_table.key;?
?方案2:拆分傾斜Key
若大表和大表Join且某些Key傾斜:
-
提取傾斜Key單獨Join;
-
非傾斜Key正常Join;
-
合并結果
場景2:Group By/Aggregation傾斜?
方案:兩階段聚合(加鹽與去鹽?
-- 第一階段:對Key加隨機后綴,局部聚合
SELECT key || '_' || suffix AS salted_key, SUM(value)?
FROM table?
GROUP BY key || '_' || suffix;-- 第二階段:去除后綴,全局聚合
SELECT REPLACE(salted_key, '_*', '') AS key, SUM(sum_value)?
FROM temp_table?
GROUP BY REPLACE(salted_key, '_*', '');
?場景3:數據源傾斜
方案:調整文件分區?
-
寫入數據時使用合理的分區策略(如按時間+哈希混合分區)。
-
對小文件合并,對大文件拆分。
五、預防數據傾斜的設計原則?
-
合理選擇分區鍵:避免選擇基數低或分布不均的字段。
-
數據預分析:ETL階段提前統計Key分布,識別潛在傾斜。
-
動態調整:利用AQE(自適應查詢執行)等自動化優化機制。
?面試回答示例
問題:如何處理Spark作業中的數據傾斜?
回答:
-
定位傾斜:通過Spark UI查看Stage中Task的數據量分布,找到傾斜的Key。
-
過濾無效數據:如刪除空Key或異常值。
-
調整Key分布:對傾斜Key加隨機前綴,分兩階段聚合。
-
優化Shuffle:提高
shuffle.partitions
,使用廣播Join。 -
框架特性:開啟Spark AQE,自動合并傾斜分區。
-
舉例:在最近的項目中,某用戶行為日志的UserID存在熱點,通過加鹽將原本集中在1個分區的數據分散到10個分區,作業時間從2小時縮短至15分鐘。
數據傾斜調優?
更多信息請參?阿里云幫助中心?
?數據傾斜調優_云原生大數據計算服務 MaxCompute(MaxCompute)-阿里云幫助中心