1. 程式人生 > >《spark常見調優》

《spark常見調優》

一:開發調優

原則1:對多次使用的RDD進行持久化,共享同一個RDD

原則2:經過filter運算元過後使用coalesce優化分割槽數量。分割槽少並且資料量大是通過repartition重分割槽增大併發。

原則3:讀取hbase或插入資料庫時使用foreachPartition代替foreach並且使用批量讀取和插入,可大幅提升讀寫效能。

原則4:儘量避免shuffle運算元,大表關聯小表可使用Broadcast+map的方式,實際應用中,習慣把維表初始化到hashmap中分割槽中進行操作。

二:資源調優

Excutor的記憶體主要分為三塊:

第一塊是讓task執行我們自己編寫的程式碼使用,預設是佔Excutor總記憶體的20%

第二塊是讓task通過shuffle過程拉取了上一個stage的task的輸出後,進行聚合等操作時使用,預設也是20%

第三塊是讓RDD持久化時使用,預設佔Excutor總記憶體的60%

1:合理設定

num-excutors,實際應用中可跟kafka的分割槽數保持一致。

2:合理設定excutor-memory,它的20%要大於每個分割槽的佔用時間,否則會記憶體溢位

3:合理設定spark-streaming任務的批次間隔執行時間。根據業務的需求和壓力測試的qps效能指標綜合考慮。

 

三:資料傾斜調優

1:資料傾斜的現象:絕大多數task執行得都非常快,但個別task執行極慢,並且可能出現記憶體溢位的情況。

      資料傾斜的原因:任務在進行shuffle的時候,某個key的對應的資料量非常大,就會發生資料傾斜。

2:如何定位資料傾斜的程式碼:資料傾斜只會發生在shuffle過程中。可以通過SparkWeb UI來檢視當前執行到了第幾個stage。進入當前stage介面就可以看到每個task的執行情況(包括執行的資料量和佔用空間)

     檢視導致資料傾斜Key的分佈情況:可以先使用sample抽樣的方式,減少運算量,然後使用countByKey運算元統計出每個key出現的次數,降序即可檢視哪些Key出現了資料傾斜。

3:資料傾斜的解決方案:

   1)過濾少量導致傾斜的key(key為空值的情況,不影響結果的情況下)

   2)提高shuffle操作的並行度,增大記憶體(只能緩解)

   3)大表和小表關聯可使用map join的方式。

   4)取樣傾斜key並拆分join操作。