SQL規範與資料傾斜

2021-08-18 21:37:07 字數 2720 閱讀 8794

一.sql規範

1、sql編寫規範

逗號放欄位前面

對用到的表都用子查詢的形式,並且只取需要用到的字段

縮排(select/from/where …and …/group by/order by/join/on…)

符號前後留空格

對一些複雜的邏輯和需要注意的點加上注釋說明

別名 同級用1、2、3...區分(如 t1、t2、t3)

2.規範的好處

規範的好處邏輯結構清晰

便於除錯

便於模組化處理

美觀,條理清楚

3.誤區

覺得耗費時間,增加工作量

覺得都一樣,自己明白就行

二.資料傾斜(spark)

1、現象

1.1 絕大多數task執行得都非常快,但個別task執行極慢。比如,總共有1000個task,997個task都在10分鐘之內執行完了,但是剩餘兩三個task卻要一兩個小時。

1.2 之前能夠正常執行的spark作業,某天突然報出oom(記憶體溢位)異常

2、原理

2.1 聚合或join等(distinct、groupby、repartition)操作產生shuffle

2.2 拉取各個節點的key到某個節點上的乙個task來處理

2.3 整個spark作業的執行進度是由執行時間最長的那個task決定的

2.4 某個task的key特別多,就產生了資料傾斜

一.sql規範

1、sql編寫規範

逗號放欄位前面

對用到的表都用子查詢的形式,並且只取需要用到的字段

縮排(select/from/where …and …/group by/order by/join/on…)

符號前後留空格

對一些複雜的邏輯和需要注意的點加上注釋說明

別名 同級用1、2、3...區分(如 t1、t2、t3)

2.規範的好處

規範的好處邏輯結構清晰

便於除錯

便於模組化處理

美觀,條理清楚

3.誤區

覺得耗費時間,增加工作量

覺得都一樣,自己明白就行

二.資料傾斜(spark)

1、現象

1.1 絕大多數task執行得都非常快,但個別task執行極慢。比如,總共有1000個task,997個task都在10分鐘之內執行完了,但是剩餘兩三個task卻要一兩個小時。

1.2 之前能夠正常執行的spark作業,某天突然報出oom(記憶體溢位)異常

2、原理

2.1 聚合或join等(distinct、groupby、repartition)操作產生shuffle

2.2 拉取各個節點的key到某個節點上的乙個task來處理

2.3 整個spark作業的執行進度是由執行時間最長的那個task決定的

2.4 某個task的key特別多,就產生了資料傾斜

3、定位

3.1 通過log定位到哪乙個task發生了資料傾斜(時間特別長,資料量特別大)

3.2 由task得知對應的是哪乙個stage

3.3 根據stage劃分原理推算出是哪一塊**(這部分**肯定有shuffle類運算元)

4、排查

4.1 分析定位到的**塊涉及到的表或資料集

4.2 檢視其中的key分布情況

5、解決

方案一:過濾少數導致傾斜的key

適用場景:導致資料傾斜的key為個別幾個,而且對計算本身的影響不大

實現原理:將導致資料傾斜的key過濾掉之後,這些key不在參與shuffle計算,就不會產生傾斜

方案優點:實現簡單,可以完全規避掉資料傾斜

方案缺點:適用場景少

方案二:提高shuffle操作的並行度

適用場景:由不少的key導致傾斜,並且這些key的資料量差異不是特別大

方案原理:spark sql 中把引數 spark.sql.shuffle.partitions的值調大(預設是200),增加task數量,讓原本分配給乙個task的多個key分配給多個task,從而讓每個task處理比原來更少的資料

方案優點:實現簡單,只需設定引數

方案缺點:無法解決某些特殊情況,比如就某乙個key對應的資料量特別大,此時無論怎麼調參,這個key還是在某乙個task中做處理

方案三:兩階段聚合(區域性聚合+全域性聚合)

使用場景:使用聚合類操作而發生傾斜時

實現原理:

【區域性聚合】先給每個key打上個1~n的隨機數,然後進行聚合

【全域性聚合】對區域性聚合的結果去掉打上隨機數的字首,再進行全域性聚合

方案優點:對於聚合類導致的資料傾斜,效果非常不錯

方案缺點:僅適用於聚合類操作,對join類的操作不適用

方案四:(取樣)隨機字首和擴容表進行join

適用場景:有(少數)大量的key導致資料傾斜

方案優點:對join型別的資料傾斜基本可以處理,效果顯著

方案缺點:需要對資料進行擴容,對記憶體資源要求較高

6、解決

嘗試不同方案

尋找更多方案

多種方案組合使用

mysql資料傾斜 Hive SQL 資料傾斜總結

在海量資料下的資料查詢中,資料傾斜是乙個很恐怖的場景。常常看似很普通的資料查詢,執行了幾個小時也沒有結果,其原因往往是發生了資料傾斜。如果真對資料傾斜採取相應的解決方法,那麼查詢效率將會大大提高。所以,分析資料傾斜是一件相當有意義的任務。本文總結不同情況下的資料傾斜,並分別給出解決方法。資料傾斜 資...

什麼是資料傾斜,怎麼解決資料傾斜?

相信很多接觸mapreduce的朋友對 資料傾斜 這四個字並不陌生,那麼究竟什麼是資料傾斜?又改怎樣解決這種該死的情況呢?何為資料傾斜?正常的資料分布理論上都是傾斜的,就是我們所說的2 8原理 80 的財富集中在20 的人手中,80 的使用者只使用20 的功能,20 的使用者貢獻了80 的訪問量,不...

資料傾斜2

如何避免因空值或者無意義的異常值引起的資料傾斜?首先檢視是否是這些值導致的傾斜,用select key,count 1 from table group by key。如果是的話,解決方法為 在on時,如下寫 on case when length a.key 符合異常條件 then concat ...