標籤:
廣播變數背景
一般Task大小超過10K時(Spark官方建議是20K),需要考慮使用廣播變數進行最佳化。
大表小表Join,小表使用廣播的方式,減少Join操作。
參考:Spark廣播變數與累加器
Local Dir背景
shuffle過程中,臨時資料需要寫入本地磁碟。本地磁碟的臨時目錄通過參數spark.local.dir配置。
效能最佳化點
spark.local.dir支援配置多個目錄。配置spark.local.dir有多個目錄,每個目錄對應不同的磁碟,這樣可以提升IO效率。另外,可以採用IO效能較高的磁碟作為local dir的磁碟。
注意:
- 如果使用YARN、Mesos等資源架構,此參數應該通過相應資源架構的參數來設定。
- 如果只有一個磁碟,配置了多個目錄,效能提升不大。
RDD操作:使用MapPartitions替代Map效能最佳化點
map方法是對RDD的每一條記錄逐一操作。mapPartitons是對整個RDD,以迭代器的方式逐一操作。比如對條記錄的開銷較大,比如需要串連、斷開資料庫。使用map方法需要對每一條記錄都串連、斷開資料庫,效率差。此時,可以改用mapPartitons操作,只需要整個Partition串連、斷開一次資料庫即可。
1 |
rdd.map{x => conn=getDBConn;conn.write(x.toString);conn.close} |
改為:
1 |
rdd.mapPartitions(records => conn.getDBConn;for(item <- records) write(item.toString); conn.close) |
RDD操作:使用coalesce減小空啟動並執行任務數量效能最佳化點
當對RDD進行多次過濾時,可能會形成很多空的、無資料的Partition。通過調用coalesce方法,可以減小Task個數。讓有的Task可以同時管理多個Partition。
當任務數過多的時候,Shuffle壓力太大導致程式掛住不動,或者出現linux資源受限的問題。此時,可以通過調用coalesce方法,可以減小Task個數,讓程式得以繼續運行。
coalesce()方法接受一個參數,為減小後的目標Partition個數。
RDD操作:collect
Collect操作會將Executor的資料發送的Driver端。需要確保Driver有足夠的記憶體。Driver的記憶體通過參數spark.driver.memory參數進行配置。
RDD操作:使用reduceByKey替代groupByKey
reduceByKey會在Map端做本地彙總,而groupByKey等Shuffle操作不會再Map端做彙總。 能使用reduceByKey的地方盡量使用該方式,避免出現.groupByKey().map(x=>(x.1,x.2.size))
對於資料
2015-05-01 13:00:00,B101,MEILIN2015-05-01 10:04:20,B101,GUANLAN2015-05-01 09:18:00,F301,MEILIN2015-05-01 12:00:00,B107,WUHE2015-05-01 18:20:00,F301,WUHE2015-05-02 12:00:02,T442,GUANLAN2015-05-01 07:00:00,B101,GUANLAN2015-05-01 21:31:00,M721,WUHE2015-05-01 09:00:00,Z007,MEILIN
現在要統計各個車牌(第二列)出現的次數,則應使用:
12345 |
var dataRDD = sc.textFile("file:///tmp/data.txt")var data2RDD = dataRDD.map(s => s.split(","))var data3RDD = data2RDD.map( a => (a(1),1) )var data4RDD = data3RDD.reduceByKey(_ + _)data4RDD.collect |
而不是:
123456 |
var dataRDD = sc.textFile("file:///tmp/data.txt")var data2RDD = dataRDD.map(s => s.split(","))var data3RDD = data2RDD.map( a => (a(1),Array(a(0),a(2))) )var data4RDD = data3RDD.groupByKey()var data5RDD = data4RDD.map(x => (x._1,x._2.size))data5RDD.collect |
避免資料扭曲如何檢測資料扭曲?
現象:沒有GC,各Task執行時間嚴重不一致。
效能最佳化點
- 重新設計key,以更小粒度的key使得Task大小合理化。
- 有時提升並行度,有助於解決資料扭曲
Spark效能最佳化(2)——廣播變數、本機快取目錄、RDD操作、資料扭曲