Spark 4 為何要處理資料傾斜

2022-07-09 05:42:08 字數 1434 閱讀 5102

對spark/hadoop這樣的大資料系統來講,資料量大並不可怕,可怕的是資料傾斜。

何謂資料傾斜?資料傾斜指的是,並行處理的資料集中,某一部分(如spark或kafka的乙個partition)的資料顯著多於其它部分,從而使得該部分的處理速度成為整個資料集處理的瓶頸。

如果資料傾斜沒有解決,完全沒有可能進行效能調優,其他所有的調優手段都是乙個笑話。資料傾斜是最能體現乙個spark大資料工程師水平的效能調優問題。

資料傾斜如果能夠解決的話,代表對spark執行機制瞭如指掌。

資料傾斜倆大直接致命後果。

1 資料傾斜直接會導致一種情況:out of memory。

2 執行速度慢,特別慢,非常慢,極端的慢,不可接受的慢。

我們以100億條資料為列子。

個別task(80億條資料的那個task)處理過度大量資料。導致拖慢了整個job的執行時間。這可能導致該task所在的機器oom,或者執行速度非常慢。

資料傾斜是如何造成的

在shuffle階段。同樣key的資料條數太多了。導致了某個key(上圖中的80億條)所在的task資料量太大了。遠遠超過其他task所處理的資料量。

而這樣的場景太常見了。二八定律可以證實這種場景。

搞定資料傾斜需要:

1 搞定shuffle

2 搞定業務場景

3 搞定 cpu core的使用情況

4 搞定oom的根本原因等。

所以搞定了資料傾斜需要對至少以上的原理瞭如指掌。所以搞定資料傾斜是關鍵中的關鍵。

乙個經驗結論是:一般情況下,oom的原因都是資料傾斜。某個task任務資料量太大,gc的壓力就很大。這比不了kafka,因為kafka的記憶體是不經過jvm的。是基於linux核心的page.

資料傾斜的原理很簡單:在進行shuffle的時候,必須將各個節點上相同的key拉取到某個節點上的乙個task來進行處理,比如按照key進行聚合或join等操作。此時如果某個key對應的資料量特別大的話,就會發生資料傾斜。比如大部分key對應10條資料,但是個別key卻對應了100萬條資料,那麼大部分task可能就只會分配到10條資料,然後1秒鐘就執行完了;但是個別task可能分配到了100萬資料,要執行一兩個小時。因此,整個spark作業的執行進度是由執行時間最長的那個task決定的。

因此出現資料傾斜的時候,spark作業看起來會執行得非常緩慢,甚至可能因為某個task處理的資料量過大導致記憶體溢位。

下圖就是乙個很清晰的例子:hello這個key,在三個節點上對應了總共7條資料,這些資料都會被拉取到同乙個task中進行處理;而world和you這兩個key分別才對應1條資料,所以另外兩個task只要分別處理1條資料即可。此時第乙個task的執行時間可能是另外兩個task的7倍,而整個stage的執行速度也由執行最慢的那個task所決定。

由於同乙個stage內的所有task執行相同的計算,在排除不同計算節點計算能力差異的前提下,不同task之間耗時的差異主要由該task所處理的資料量決定。

為何 for只要 4 us

雖然 delaymicroseconds 很好用,可是常常有人喜歡用 for 來做 delay 延遲,然後就發現怪怪的 其實如下這句寫法是等於沒寫的 for int i 0 i 32000 i 如果你這樣測量 unsigned long begt micros for int i 0 i 32000...

Spark基礎 4 共享變數

廣播變數 broadcast variables 允許程式開發人員在每個機器上面快取乙個唯讀的變數,而不是為機器上的每個任務都生成乙個副本。spark的 行動 操作會跨越多個階段 stage 對於每個階段內的所有任務所需要的公共資料,spark都會自動進行廣播。可以通過sparkcontext.br...

Spark學習筆記4 spark執行機制

spark執行架構包括集群資源管理器 cluster manager 執行作業任務的工作節點 worker node 每個應用的任務控制節點 driver 和每個工作節點上負責具體任務的執行程序 executor 其中,集群資源管理器可以是spark自帶的資源管理器,也可以是yarn或mesos等資...