《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操作。