spark調優之資料傾斜

2021-10-05 09:24:37 字數 2946 閱讀 3486

問題出現的原因

資料傾斜的表現

資料傾斜的表現

遇到這種方式問題莫慌看思路

問題:資料傾斜會導致資料溢位,可能是其中的某個task分配了大量的資料,執行出錯,導致資料傾斜,資料溢位.

1.方案一:聚合源資料

只針對常見的聚合操作的情況

2.方案二:使用過濾的方法

只針對只使用部分資料的情況

3.方案三:提高task的並行度的方法

資料量大且資料任務多的程式慎用

4.方案四:使用隨機key方式

groupbykey、reducebykey 比較適合使用這種方式

5.方案五:將reduce join轉換為map join

適合小表的記憶體可以存在集群的記憶體的時候

問題:資料傾斜會導致資料溢位,可能是其中的某個task分配了大量的資料,執行出錯,導致資料傾斜,資料溢位.

問題出現的原因

當我們在集群跑任務的時候,同乙個key的values,一定是分配到乙個reduce task中處理的,

當我們執行多個key對應的values,例如總共是100萬個數量,其中乙個key對應了了90萬條資料,

兩個key對應了1萬條資料,剩下的key平分了剩下的9萬條資料,這種情況下就會產生資料傾斜,

平分9萬的key執行完花了1分鐘,執行1萬的兩個key執行了10分鐘,執行90萬資料的那個key就

會執行10290=1800分鐘=30個小時=1天多,

大家可以發現資料傾斜就是乙個殺手,會不會殺了你但是會用時間拖死你!

資料傾斜的表現

1.你用client模式執行的時候,task執行成功的日誌跳的異常的慢,乙個task要執行乙個小時誇

慢,像小牛拉大車一樣,但是資料至少還能跑.

2.報錯 (1

)oom

(outofmenory) 資料溢位,(2

)task failed

(任務失敗)

,task lost

(任務迷失)

,resubmitting task

(任務重啟)反覆執行幾次都跑不通,最終因為(longtime)任務超時而掛掉,

程式因為資料傾斜引發的一系列異常,最終程式掛掉!

遇到這種方式問題莫慌看思路

解決思路:

1.根據log資訊去定位出現資料傾斜的原因,首要原因就是因為shuffle,某個task承擔了絕大多數的任務,

那哪些地方會產生shuffle呢?groupbykey、countbykey、reducebykey、join一般就是這幾個運算元不老實,

2.log一般會報是在你的哪一行的**,導致了oom異常,或者看看是執行到了第幾個stage

(階段)

哪乙個stage

(階段)生成的task特別慢,就用你的肉眼去對**進行stage

(階段)劃分看看到底**發生了資料傾斜.

1.方案一:聚合源資料

只針對常見的聚合操作的情況

思路:

說白了我們要處理的資料倉儲就是hive中的一堆表,這一堆表儲存在hdfs

(分布是儲存系統)中我們一般就是凌晨跑

昨天一天所產生的資料,這些資料發生了資料傾斜,我們首要的看日誌,肉眼分析階段,肉眼分析是不是groupbykey,

reducebykey等函式在聚合過程中產生的shuffle次數過多導致的資料傾斜,聚合資料來源,就是提前聚合,找一種沒有

sheffle的方式提前聚合,然後再切分還原資料本真,類似先列轉行(偽轉)聚合合理逃避sheffle,然後再map行轉

列(偽轉)恢復資料的本真!

1.另外在資料還沒有進入spark之前,寫乙個hive的sql指令碼,將value值提前合併,那麼就可以直接對資料進行map操作,不需要groupby操作了就沒有了shuffle了 就不會有資料傾斜的問題了

2.增大資料的粒度 就是減少了value的資料量 這樣也可以有效的減少資料傾斜的問題

2.方案二:使用過濾的方法

只針對只使用部分資料的情況

根據業務的需求 過濾掉不重要的資料
3.方案三:提高task的並行度的方法

資料量大且資料任務多的程式慎用

增加task的數量,減少每個task執行的資料量

增加並行度的數量 每個task的資料就會有所減少 這種方法治標不治本 有可能會避免記憶體溢位的情況

但資料傾斜的問題還在 就會造成有的task執行快 有的執行慢 浪費整體時間

4.方案四:使用隨機key打散方式

groupbykey、reducebykey 比較適合使用這種方式

在第一輪聚合的時候將同一組的key打散,加上字首字尾等  

然後在區域性聚合時恢復key,最後在全域性聚合

5.方案五:將reduce join轉換為map join

適合小表的記憶體可以存在集群的記憶體的時候

(

1)如果有兩個rdd join 其中乙個rdd資料較小時 可以將這個小的rdd廣播出去 這樣再進行map就不會產生shuffle 就不會有資料傾斜(2

)如果資料都很大的情況 記憶體放不下時 不能採用廣播的情況

Spark資料傾斜調優

一 資料傾斜發生的原理 1 確定資料傾斜發生在第幾個stage中。可以通過spark web ui來檢視當前執行到了第幾個stage。並深入看一下當前這個stage各個task分配的資料量及執行時間 2 根據stage劃分原理,推算出來發生傾斜的那個stage對應 中的哪一部分。3 分析一下那個執行...

spark效能調優 資料傾斜

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

Hive調優 資料傾斜

1 通常情況下,作業會通過input的目錄產生乙個或者多個map任務。主要的決定因素有 input的檔案總個數,input的檔案大小,集群設定的檔案塊大小 目前為128m,可在hive中通過set dfs.block.size 命令檢視到,該引數不能自定義修改 2 舉例 a 乙個大檔案 假設inpu...