Spark效能優化指南 資料傾斜

2021-10-10 10:08:00 字數 1664 閱讀 9682

調優概述

有的時候,我們可能會遇到大資料計算中乙個最棘手的問題——資料傾斜,此時spark作業的效能會比期望差很多。資料傾斜調優,就是使用各種技術方案解決不同型別的資料傾斜問題,以保證spark作業的效能。

資料傾斜發生時的現象

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

原本能夠正常執行的spark作業,某天突然報出oom(記憶體溢位)異常,觀察異常棧,是我們寫的業務**造成的。這種情況比較少見。

資料傾斜發生的原理

資料傾斜的原理很簡單:在進行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所決定。

如何定位導致資料傾斜的**

資料傾斜只會發生在shuffle過程中。這裡給大家羅列一些常用的並且可能會觸發shuffle操作的運算元:distinct、groupbykey、reducebykey、aggregatebykey、join、cogroup、repartition等。出現資料傾斜時,可能就是你的**中使用了這些運算元中的某乙個所導致的。

某個task執行特別慢的情況

首先要看的,就是資料傾斜發生在第幾個stage中。

如果是用yarn-client模式提交,那麼本地是直接可以看到log的,可以在log中找到當前執行到了第幾個stage;如果是用yarn-cluster模式提交,則可以通過spark web ui來檢視當前執行到了第幾個stage。此外,無論是使用yarn-client模式還是yarn-cluster模式,我們都可以在spark web ui上深入看一下當前這個stage各個task分配的資料量,從而進一步確定是不是task分配的資料不均勻導致了資料傾斜。

比如下圖中,倒數第三列顯示了每個task的執行時間。明顯可以看到,有的task執行特別快,只需要幾秒鐘就可以執行完;而有的task執行特別慢,需要幾分鐘才能執行完,此時單從執行時間上看就已經能夠確定發生資料傾斜了。此外,倒數第一列顯示了每個task處理的資料量,明顯可以看到,執行時間特別短的task只需要處理幾百kb的資料即可,而執行時間特別長的task需要處理幾千kb的資料,處理的資料量差了10倍。此時更加能夠確定是發生了資料傾斜。

spark優化之資料傾斜

資料傾斜的概念 有的時候,我們可能會遇到大資料計算中乙個最棘手的問題 資料傾斜,此時spark作業的效能會比期望的差的多。資料傾斜調優,就是使用各種技術方案解決不同型別的資料傾斜問題以保證spark作業的效能 絕大多數task執行的都非常快,但個別task執行極慢,比如,總共有1000個task,9...

spark效能調優 資料傾斜

1.資料傾斜發生時的現象 絕大多數task執行得都非常快,但個別task執行極慢。比如,總共有1000個task,997個task都在1分鐘之內執行完了,但是剩餘兩三個task卻要一兩個小時。這種情況很常見。原本能夠正常執行的spark作業,某天突然報出oom 記憶體溢位 異常,觀察異常棧,是我們寫...

Spark效能優化指南 初級篇

我們使用spark submit提交乙個spark作業之後,這個作業就會啟動乙個對應的driver程序。該程序是向集群管理器 yarn,k8s 申請執行spark作業需要使用的資源,這裡的資源指的就是executor程序。yarn集群管理器會根據我們為spark作業設定的資源引數,在各個工作節點上,...