主頁 > 資料庫 > 大資料SQL資料傾斜與資料膨脹的優化與經驗總結

大資料SQL資料傾斜與資料膨脹的優化與經驗總結

2023-06-19 08:24:12 資料庫

本文主要基于團隊實際開發經驗與積累,并結合了業界對大資料SQL的使用與優化,嘗試給出相對系統性的解決方案,

背景

目前市面上大資料查詢分析引擎層出不窮,如Spark,Hive,Presto等,因其友好的SQL語法,被廣泛應用于各領域分析,公司內部也有優秀的ODPS SQL供用戶使用,
筆者所在團隊的專案也借用ODPS SQL去檢測業務中潛在的安全風險,在給業務方使用與答疑程序中,我們發現大多含有性能瓶頸的SQL,主要集中在資料傾斜與資料膨脹問題中,因此,本文主要基于團隊實際開發經驗與積累,并結合業界對大資料SQL的使用與優化,嘗試給出相對系統性的解決方案,
本文主要涉及業務SQL執行層面的優化,暫不涉及引數優化,若設定引數,首先確定執行層面哪個階段(Map/Reduce/Join)任務執行時間較長,從而設定對應引數,
本文主要分為以下三個部分:第一部分,會引入資料傾斜與資料膨脹問題,第二部分,介紹當資料傾斜與資料膨脹發生時,如何排查與定位,第三部分,會從系統層面給出常見優化思路,

問題篇

資料傾斜

資料傾斜是指在分布式計算時,大量相同的key被分發到同一個reduce節點中,針對某個key值的資料量比較多,會導致該節點的任務資料量遠大于其他節點的平均資料量,運行時間遠高于其他節點的平均運行時間,拖累了整體SQL執行時間,
其主要原因是key值分布不均導致的Reduce處理資料不均勻,本文將從Map端優化,Reduce端優化和Join端優化三方面給出相應解決方案,

資料膨脹

資料膨脹是指任務的輸出條數/資料量級比輸入條數/資料量級大很多,如100M的資料作為任務輸入,最后輸出1T的資料,這種情況不僅運行效率會降低,部分任務節點在運行key值量級過大時,有可能發生資源不足或失敗情況,

排查定位篇

本節主要關注于業務SQL本身引起的長時間運行或者失敗,對于集群資源情況,平臺故障本身暫不考慮在內,
1.首先檢查輸入資料量級,與其他天相比有無明顯量級變化,是否因為資料量級的問題天然引起任務運行時間過長,如雙11,雙十二等大促節點,
2.觀察執行任務拆分后各個階段運行時間,與其他天相比有無明顯量級變化;在整個執行任務中時間耗時占比情況,
3.最耗時階段中,觀察各個Task的運行情況,Task串列中,觀察是否存在某幾個Task實體耗時明顯比平均耗時更長,是否存在某幾個Task實體處理輸入/輸出資料量級比平均資料量級消費產出更多,
4.根據步驟3中定位代碼行數,定位問題業務處理邏輯,

優化篇

資料傾斜

1. Map端優化

1.1 讀取資料合并

在資料源讀取查詢時,動態磁區數過多可能造成小檔案數過多,每個小檔案至少都會作為一個塊啟動一個Map任務來完成,對于檔案數量而言,等于 map數量 * 磁區數,對于一個Map任務而言,其初始化的時間可能遠遠大于邏輯處理時間,因此通過調整Map引數把小檔案合并成大檔案進行處理,避免造成很大的資源浪費,

1.2 列裁剪

減少使用select * from table陳述句,過多選擇無用列會增加資料在集群上傳輸的IO開銷;
對于資料選擇,需要加上磁區過濾條件進行篩選資料,

1.3 謂詞下推

在不影響結果的情況下,盡可能將過濾條件運算式靠近資料源位置,使之提前執行,通過在map端過濾減少資料輸出,降低集群IO傳輸,從而提升任務的性能,

1.4 資料重分布

在Map階段做聚合時,使用隨機分布函式distribute by rand(),控制Map端輸出結果的分發,即map端如何拆分資料給reduce端(默認hash演算法),打亂資料分布,至少不會在Map端發生資料傾斜,

2. Reduce端優化

2.1 關聯key空值檢驗

部分實體發生長尾效應,很大程度上由于null值,空值導致,使得Reduce時含有臟值的資料被分發到同一臺機器中,
針對這種問題SQL,首先確認包含無效值的資料源表是否可以在Map階段直接過濾掉這些例外資料;如果后續SQL邏輯仍然需要這些資料,可以通過將空值轉變成隨機值,既不影響關聯也可以避免聚集,

SELECT  ta.id
FROM    ta
LEFT JOIN tb
ON      coalesce(ta.id , rand()) = tb.id;

2.2 排序優化

Order by為全域排序,當表資料量過大時,性能可能會出現瓶頸;Sort by為區域排序,確保Reduce任務內結果有序,全域排序不保證;Distribute by按照指定欄位進行Hash分片,把資料劃分到不同的Reducer中;CLUSTER BY:根據指定的欄位進行分桶,并在桶內進行排序,可以認為cluster by是distribute by+sort by,
對于排序而言,嘗試用distribute by+sort by確保reduce中結果有序,最后在全域有序,

-- 原始腳本
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小表

通過將需要join的小表分發至map端記憶體中,將Join操作提前至map端執行,避免因分發key值不均勻引發的長尾效應,復雜度從(M*N)降至(M+N),從而提高執行效率,ODPS SQL與Hive SQL使用mapjoin,SPARK使用broadcast,

圖片

3.2 大表join大表

長尾效應由熱點資料導致,可以將熱點資料加入白名單中,通過對白名單資料和非白名單資料分別處理,再合并資料,

具體表現為打散傾斜key,進行兩端聚合(針對聚合)或者拆分傾斜key進行打散然后再合并資料,

資料膨脹

1. 避免笛卡爾積

Join關聯條件有誤,表Join進行笛卡爾積,造成資料量爆炸,

2. 關聯key區分度校驗

關注JoinKey區分度,key值區分度越低(distinct數量少),越有可能造成資料爆炸情況,如用戶下的性別列,交易下的省市列等,

3. 聚合操作誤用

部分聚合操作需要將中間結果記錄下來,最后再生成最終結果,這使得在select操作時,按照不同維度去重Distinct、不同維度開窗計算over Partition By可能會導致資料膨脹,針對這種業務邏輯,可以將一個SQL拆分成多個SQL分別進行處理操作,

總結

大資料SQL優化是一項涉及知識面較廣的作業,除了分析現有執行計劃之外,還需要學習相應查詢分析引擎設計原理,針對我們日常遇到的問題現總結分享給大家,供大家查閱,

參考資料:

ODPS SELECT語法:https://help.aliyun.com/document_detail/73777.html?utm_content=g_1000230851&spm=5176.20966629.toubu.3.f2991ddcpxxvD1#section-ag9-2c4-t0e
Presto Query Lifecycle:https://varada.io/blog/presto/accelerate-presto-trino-queries-data-lake/
A Definitive Guide To Hive Performance Tuning- 10 Excellent Tips:https://www.hdfstutorial.com/blog/hive-performance-tuning/
Presto Performance: Speed, Optimization & Tuning:https://ahana.io/learn/presto-performance/
Hive Optimizing Joins:https://docs.cloudera.com/HDPDocuments/HDP2/HDP-2.0.0.2/ds_Hive/optimize-joins.html
作者|霖玉

本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/Optimization-and-experience-summary-of-Big-data-SQL-data-skew-and-data-expansion.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/555520.html

標籤:大數據

上一篇:使用 Easysearch 還原 Elasticsearch 快照資料

下一篇:返回列表

標籤雲
其他(161254) Python(38240) JavaScript(25505) Java(18246) C(15237) 區塊鏈(8271) C#(7972) AI(7469) 爪哇(7425) MySQL(7256) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4603) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2436) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1968) 功能(1967) Web開發(1951) C++(1941) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 大資料SQL資料傾斜與資料膨脹的優化與經驗總結

    本文主要基于團隊實際開發經驗與積累,并結合了業界對大資料SQL的使用與優化,嘗試給出相對系統性的解決方案。 ......

    uj5u.com 2023-06-19 08:24:12 more
  • 使用 Easysearch 還原 Elasticsearch 快照資料

    本文主要驗證 Elasticsearch 快照在 [Easysearch](http://www.infinilabs.com/docs/latest/easysearch/overview) 中進行資料恢復。 ## 準備測驗資料 ### 索引 ![](https://www.infinilabs. ......

    uj5u.com 2023-06-18 08:08:32 more
  • 使用 Easysearch 還原 Elasticsearch 快照資料

    本文主要驗證 Elasticsearch 快照在 [Easysearch](http://www.infinilabs.com/docs/latest/easysearch/overview) 中進行資料恢復。 ## 準備測驗資料 ### 索引 ![](https://www.infinilabs. ......

    uj5u.com 2023-06-18 08:07:05 more
  • 曝光!Apache SeaTunnel Catalog 功能設計為何能大大簡化用戶啟用

    ![file](https://img2023.cnblogs.com/other/3195851/202306/3195851-20230616175541667-1729991882.jpg) Catalog(目錄)提供了關于資料庫、表格和訪問資料所需的資訊的元資料,以及統一的 API 來管理元 ......

    uj5u.com 2023-06-17 08:15:34 more
  • Committer 迎新!這次是來自阿里云的同學

    ![file](https://img2023.cnblogs.com/other/2685289/202306/2685289-20230616173226789-2009691483.jpg) > 截至今天,Apache DolphinScheduler 專案在 GitHub 上的 Star 數 ......

    uj5u.com 2023-06-17 08:15:25 more
  • 和必應對話之mysql磁區分表

    > mysql單表資料量太大 導致查詢緩慢問題如何解決 您好,這是Bing。根據網路搜索結果,mysql單表資料量太大導致查詢緩慢的問題有以下幾種可能的解決方案: - 使用索引。索引是一種資料結構,可以幫助資料庫高效地獲取資料。索引可以根據WHERE和JOIN中出現的列創建,以提高查詢效率。索引的種 ......

    uj5u.com 2023-06-17 08:15:21 more
  • 華為云蘇光牛:堅持產品能力的升級,做金融數字化的堅實資料底座

    摘要:華為全球智慧金融峰會2023上,華為云資料庫服務產品部總經理蘇光牛帶來了《華為云分布式資料庫GaussDB,做金融數字化的堅實資料底座》的主題分享。 6月7日,華為全球智慧金融峰會2023在上海順利舉行,華為云資料庫服務產品部總經理蘇光牛帶來了《華為云分布式資料庫GaussDB,做金融數字化的 ......

    uj5u.com 2023-06-17 08:15:13 more
  • Mysql基本命令

    查看資料庫 show databases; 創建資料庫 create database db1; 創建資料庫db1 洗掉資料庫 drop database db1; 洗掉資料庫db1 切換進入資料庫 use user 進入user資料庫 查看資料庫中的表 show tables; 創建表 創建表的方 ......

    uj5u.com 2023-06-17 08:15:01 more
  • 華為云蘇光牛:堅持產品能力的升級,做金融數字化的堅實資料底座

    摘要:華為全球智慧金融峰會2023上,華為云資料庫服務產品部總經理蘇光牛帶來了《華為云分布式資料庫GaussDB,做金融數字化的堅實資料底座》的主題分享。 6月7日,華為全球智慧金融峰會2023在上海順利舉行,華為云資料庫服務產品部總經理蘇光牛帶來了《華為云分布式資料庫GaussDB,做金融數字化的 ......

    uj5u.com 2023-06-17 08:13:27 more
  • 和必應對話之mysql磁區分表

    > mysql單表資料量太大 導致查詢緩慢問題如何解決 您好,這是Bing。根據網路搜索結果,mysql單表資料量太大導致查詢緩慢的問題有以下幾種可能的解決方案: - 使用索引。索引是一種資料結構,可以幫助資料庫高效地獲取資料。索引可以根據WHERE和JOIN中出現的列創建,以提高查詢效率。索引的種 ......

    uj5u.com 2023-06-17 08:11:43 more