spark調優經驗(待續)

spark調優是需要根據業務需要調整的,並不是說某個設置是一成不變的,就比如機器學習一樣,是在不斷的調試中找出當前業務下更優的調優配置。下面零碎的總結了一些我的調優筆記。

spark 存儲的時候存在嚴重的分配不均的現象,有幾臺機器在過渡使用, 有幾臺機器卻很少被使用,有幾臺機器緩存了幾十個上百個RDD blocks  有的機器一個RDD blocks 都沒有,這樣存儲有RDD blocks 的可以進行運算,運算的tasks 最多爲該機器core數。

spark.storage.memoryFraction 分配給用於緩存RDD的內存的比例  

比如如果spark.executor.memory              30g  spark.storage.memoryFraction       0.5          則用於緩存的內存爲14G 多, 默認留一些做其他用。



每一個RDD blocks  的大小不一定是64兆 可能小於64兆,另外如果driver不是子節點,driver 程序運行的節點上的用於緩存的內存 ,就不會被使用。


事實上一個兩三G 的數據 需要用的緩存也至少需要兩三G,如果中間過程中還有產生RDD 且也需要緩存到內存,則需要分配更多的內存用於緩存。在緩存足夠多的情況的
更多的內存不足錯誤提示(OOM) 來源於計算的時候產生的一些中間對象即計算所需要的內存。


所以分配用於緩存的內存 應該是這麼算的, 比如我有10G的文件,4臺機器,則每臺機器至少2.5g緩存,如果每臺機器分配給excutor 的內存爲10g ,則memoryFraction 則至少爲0.25  最好配大一些,但不能太大, 太大會導致計算內存不夠。而且如果中間過程還有產生新的RDD,則需要根據實際情況調大memoryFraction。


RDD 緩存分佈不均勻 是影響spark 的很大的性能之一,爲什麼這麼說?

因爲有的機器分配給用於RDD 緩存的內存都用完了  ,這樣相對而言在這個機器上計算的開銷也會大,有的機器緩存佔用的內存很少,就算用這個機器來計算,還需要啓動Node_local 模式,這樣會影響計算的時間。


調優過程也遇到了一些問題,還沒解決,比如:
爲什麼一個2G 的數據,默認塊大小爲64M. default.parallelism 設置成100,可它總是不按這個數據來分,比如經常分成了108個blocks,影響partions個數的參數還有哪些?還有我明明有四個節點,但經常有節點被分配的RDD 和計算都很少很少,這種資源浪費的情況應該怎麼調解?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章