1. 平臺全局配置序列化方式 : kyro
spark-default.conf : spark.serializer org.apache.spark.serializer.KryoSerializer
使用自定義類時,對類進行註冊,否則會存儲每個對象的全類名(full class name)
備註:如果序列化對象較大,提高 spark.kryoserializer.buffer 的值
2. 對多次使用的RDD進行持久化 / Checkpoint
3. 優化數據結構
- 優先使用數組以及字符串,而不是集合類
- 避免使用多層嵌套的對象結構
- 對於有些能夠避免的場景,儘量使用int替代String
4. 並行度設置
Spark官方推薦:設置集羣總CPU數量的兩倍到三倍的並行度
5. 廣播共享數據
6. 優先使用reduceByKey
只有在reduceByKey處理不了時,才用groupByKey().map()來替代
7. 其他進一步提升點
7. 1 設置 spark.locality 系列參數
調節Spark等待task可以進行數據本地化的時間
7. 2 調節executor內存比例
默認 60% 給 RDD 進行緩存,40% 給Task來存放運行期間動態創建的對象
Task內存空間小,會導致GC觸發頻繁
new SparkConf().set(“spark.storage.memoryFraction”, “0.5”)
7.3 降低FullGC的方法:
- 降低spark.storage.memoryFraction的比例,給年輕代更多的空間,來存放短時間存活的對象;
- 給Eden區域分配更大的空間,使用-Xmn即可,通常建議給Eden區域,預計大小的4/3;
- 如果使用的是HDFS文件,那麼很好估計Eden區域大小,如果每個executor有4個task,然後每個hdfs壓縮塊解壓縮後大小是3倍,此外每個hdfs塊的大小是128M,那麼Eden區域的預計大小就是:4 * 3 * 128MB,然後呢,再通過-Xmn參數,將Eden區域大小設置爲4 * 3 * 128 * 4/3。
7.4 針對Shuffle優化
有序補充詳細專題