MaxComputeSql性能调优
摘要: 轉載自xiaorui 部分用戶(尤其對外輸出)使用MaxCompute(原Odps)時,由于對產品的使用層面和執行層面了解程度不同,導致提交的任務執行時間過長、占用了較多集群資源;嚴重的會導致失敗、不僅需要投入支持同學精力協助解決、也影響了用戶正常業務。 合并整理部分性能提升方法方
轉載自xiaorui
部分用戶(尤其對外輸出)使用MaxCompute(原Odps)時,由于對產品的使用層面和執行層面了解程度不同,導致提交的任務執行時間過長、占用了較多集群資源;嚴重的會導致失敗、不僅需要投入支持同學精力協助解決、也影響了用戶正常業務。 合并整理部分性能提升方法方便支持用戶查詢和優化Sql,提高效率;部分需要原來手動調優的如mapjoin、ppd謂詞下推注意分區位置等原有的調優設置在不斷衍進的產品中都已實現了自動化調優、 不同階段的產品調優參數和細節會有不一致、但是熟悉了調優思路和方法后可以做到舉一反三、逐步深入。
一. 整體思路
整體上,調優從底層到sql可以有多個層面的調優,隨著產品的不斷完善,部分調優已經實現了自動化。如果用戶能熟悉常見的調優機制和執行原理,在開發執行sql、業務邏輯和相關參數設置調整來提高性能、可以做到事半功倍。
1. 硬件及操作系統層面調優:包括磁盤I/O調優(多路復用等)、網絡調優(緩沖區大小、連接數放大等)、內存調優(虛擬內存設置、內存控制等);
2. 分布式計算平臺及存儲層面調優:存儲格式設置、壓縮格式設置、RPC調用設置、連接數控制設置、調度機制設置、block及分片設置、執行資源設置等;
3. 業務邏輯層面及參數調整,除整體執行的調優外,對不同類型的操作進行參數級別的調優、針對聚合、連接、一讀多寫等修改為不同的sql或者設置不同的參數可以極大的提高性能;
4. Sql層面及應用層面的調優,重構sql寫法、合并sql,大小表連接修改為mapjoin等,在odps2.0中已處理了自動mapjoin等、目前未升級用戶及對外輸出的用戶仍需要修改sql來支持;
不同層面調優及優缺點見下:
二. 場景及調優列舉
1. 大小表關聯修改為mapjoin,增加Mapjoin hint
方法及注意事項:
所有指定的小表占用的內存總和不超過 512M
多表Join時,最左邊的兩個表,不能同時是 Mapjoin 的表
不同的關聯方式(left/right/inner),對表的順序有要求
left outer join 左表必須為大表
right outer join 右表必須為大表
inner join 左右表皆可為大表
full outer join 不能直接使用 mapjoin,修改為mapjoin + union all
最新的發布版本上已經支持了automapjoin,可以根據join表的大小自動把小表轉為mapjoin,對部分沒有顯示增加hint的sql和中間結果為小表的sql進行自動優化
2 數據傾斜
數據傾斜表現:
任務進度長時間維持在99%,查看監控,只有少量 reduce 子任務未完成
單一 reduce 記錄數與平均記錄數差異多大,最長時長遠大于平均時長
優化方法及注意事項:
聚合傾斜,設置參數:set odps.sql.groupby.skewindata=true
關聯傾斜,設置參數:set odps.sql.skewinfo=tab1:(col1,col2)[(v1,v2),(v3,v4),…|(v1,v2),(v3,v4),…];set odps.sql.optimize.skewjoin=true
關聯傾斜,同時大小表,考慮修改為mapjoin
具體問題具體分析:因為聚合key值null引起的數據傾斜,可以修改null為隨機值,打撒數據分發到不同的instance執行
3. Map 端一讀多寫
場景及優化:
多次讀取同一張物理表,執行不同操作,寫入多張表;考慮與multiinsert 的聯系和區別,是否合適做修改
建立臨時表,實現臨時表的并行化
注意事項:
優點:大大節省了集群的計算資源和磁盤I/O資源
缺點:寫的次數非常多時,可能導致性能問題,影響任務整體執行效率
4 分區裁剪
場景:事實表很多分區,數據量大
優化:避免全表掃描,減少資源浪費;關注分區裁剪有無生效,見下注意事項:從表設計、使用上注意,盡量讓分區裁剪生效
注意事項:
過濾條件中的分區列上有UDF 則分區裁剪生效
表關聯時關聯條件中包含分區列:
出現在 on 條件中,分區裁剪生效
出現在 where 條件中,主表分區裁剪生效,其余可能失敗
5. SQL 合并
場景:
1. 多次讀取相同的數據且源數據數據量大、性能差、費用高
2. 統一業務流程前后關聯sql或統計多種指標、篩選不同數據的sql
優化方法及注意事項:通過修改sql,合并為1個sql執行,盡量減少對相同數據源的讀取次數,達到一次掃描計算多個基礎統計量,一次掃描,處理多個篩選條件;以下調整列舉:
CASE … WHEN…:合并相同數據源的不同子查詢的關聯
動態分區&多路插入等:將滿足不同條件的會員統計信息插入到不同的表或表分區中去
前后流程sql合并為1個sql執行
6 使用窗口函數優化SQL
窗口函數:
1. 可以進行靈活的分析處理工作
2. 使用 partition by 開窗,order by 排序
3. 可以用 rows 指定開窗范圍
4. 豐富的開窗函數
優化及注意事項:合理使用窗口函數,可以減少Join次數,提高運行性能;不用窗口函數處理需要寫復雜sql的功能,用開窗函數可以高效執行得到預期結果。
原文鏈接
干貨好文,請關注掃描以下二維碼:
總結
以上是生活随笔為你收集整理的MaxComputeSql性能调优的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云MaxCompute(大数据)公开
- 下一篇: 代码整洁之道(一)最佳实践小结