問題1:val rdd = data.filter(f1).filter(f2).reduceBy經過以上幾步會有很多空任務或者小任務,這樣的話將大量的開銷做了Task的準備工作。
解決:使用repartition去減少RDD中的partition數量。
問題2:每個記錄的開銷太大
rdd.map{x=>conn=getDBConn;conn.write(x.toString);conn.close}
解決:rdd.mapPartitions(records =>conn.getDBConn;for(item <-records))write(item.toString); conn.close)
就是寫代碼時批量操作數據庫。
問題3: 任務執行速度傾斜
解決:
1.數據傾斜:考慮并行處理方法,中間可以加入一步aggregation
具體的解決方法大概有6種。
2.Worker傾斜(在某些worker上的executor不給力)
設置spark.speculation=true 把那些持續不給力的node去掉
問題4:不設置spark.local.dir 這是spark寫shuffle輸出的地方 (這種方法用的不多!)
解決:設置一組磁盤
spark.local.dir=/mn1/spark, /mnt2/spar, /mnt3/spark 增加IO即加快速度
問題5: reducer數量不合適
解決:
太多的reducer,造成很多的小任務,以此產生很多啟動任務的開銷。
太少的reducer,任務執行慢!!
reduce的任務數還會影響到內存
問題6:collect輸出大大量結果慢
解決: 直接輸出到分布式?文件系統
問題7:序列化
Spark默認使用JDK自帶的ObjectOutputStream
兼容性好,體積大,速度慢
解決: 使?用Kryo serialization
體積小,速度快