本文主要基於團隊實際開發經驗與積累,並結合了業界對大數據SQL的使用與優化,嘗試給出相對系統性的解決方案。 ...
本文主要基於團隊實際開發經驗與積累,並結合了業界對大數據SQL的使用與優化,嘗試給出相對系統性的解決方案。
背景
問題篇
數據傾斜
數據膨脹
排查定位篇
優化篇
數據傾斜
1. Map端優化
1.1 讀取數據合併
1.2 列裁剪
1.3 謂詞下推
1.4 數據重分佈
2. Reduce端優化
2.1 關聯key空值檢驗
SELECT ta.id
FROM ta
LEFT JOIN tb
ON coalesce(ta.id , rand()) = tb.id;
2.2 排序優化
-- 原始腳本
select *
from user_pay_table
where dt = '20221015'
order by amt
limit 500
;
-- 改進腳本
SELECT *
FROM user_pay_table
WHERE dt = '20221015'
DISTRIBUTE BY ( CASE
WHEN amt < 100 THEN 0
WHEN amt >= 100 AND age <= 2000 THEN 1
ELSE 2
END )
SORT BY amt
LIMIT 500
;
3. Join端優化
3.1 大表join小表
3.2 大表join大表
長尾效應由熱點數據導致,可以將熱點數據加入白名單中,通過對白名單數據和非白名單數據分別處理,再合併數據。
具體表現為打散傾斜key,進行兩端聚合(針對聚合)或者拆分傾斜key進行打散然後再合併數據。
數據膨脹
1. 避免笛卡爾積
Join關聯條件有誤,表Join進行笛卡爾積,造成數據量爆炸。
2. 關聯key區分度校驗
關註JoinKey區分度,key值區分度越低(distinct數量少),越有可能造成數據爆炸情況。如用戶下的性別列,交易下的省市列等。
3. 聚合操作誤用
部分聚合操作需要將中間結果記錄下來,最後再生成最終結果,這使得在select操作時,按照不同維度去重Distinct、不同維度開窗計算over Partition By可能會導致數據膨脹。針對這種業務邏輯,可以將一個SQL拆分成多個SQL分別進行處理操作。
總結
大數據SQL優化是一項涉及知識面較廣的工作,除了分析現有執行計劃之外,還需要學習相應查詢分析引擎設計原理。針對我們日常遇到的問題現總結分享給大家,供大家查閱。
參考資料:
本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/Optimization-and-experience-summary-of-Big-data-SQL-data-skew-and-data-expansion.html