操作場景
? ? ? ? Spark是內存計算框架,計算過程中內存不夠對Spark的執行效率影響很大。可以通過監控GC(Garbage Collection),評估內存中RDD的大小來判斷內存是否變成性能瓶頸,并根據情況優化。
? ? ? ? 監控節點進程的GC情況(在客戶端的conf/spark-default.conf配置文件中,在spark.driver.extraJavaOptions和spark.executor.extraJavaOptions配置項中添加參數:
"-verbose:gc?-XX:+PrintGCDetails -XX:+PrintGCTimeStamps"),如果頻繁出現Full ?GC,需要優化GC。把RDD做Cache操作,通過日志查看RDD在內存中的大小,如果數據太大,需要改變RDD的存儲級別來優化。
操作步驟
● 優化GC,調整老年代和新生代的大小和比例。在客戶端的conf/spark-default.conf配置文件中,在spark.driver.extraJavaOptions和spark.executor.extraJavaOptions配置項中添加參數:-XX:NewRatio。如,"
-XX:NewRatio=2",則新生代占整個堆空間的1/3,老年代占2/3。
● 開發Spark應用程序時,優化RDD的數據結構。
? ? ■ 使用原始類型數組替代集合類,如可使用fastutil庫。
? ? ■ 避免嵌套結構。
? ? ■ Key盡量不要使用String。
● 開發Spark應用程序時,建議序列化RDD。
? ? RDD做cache時默認是不序列化數據的,可以通過設置存儲級別來序列化RDD減小內存。例如:
testRDD.persist(StorageLevel.MEMORY_ONLY_SER)