並行度
對於*ByKey等需要shuffle而生成的RDD,其Partition數量依如下順序確定:1. 方法的第二個參數 > 2. spark.default.parallelism參數 > 3. 所有依賴的RDD中,Partition最多的RDD的Partition的數量。
對於其他的RDD則其依賴於父RDD的分區個數。對於讀取Hadoop文件的RDD,其默認的分區個數是HDFS塊個數。同時textFile函數也接受參數,指定分區個數,但不能小於HDFS塊個數——不使用HDFS塊個數。
優化內存
當內存不足時,Spark應用程序運行時,會出現超時而導致任務失敗。原因是內存不足,引起GC。而GC又引起通訊超時。其中的一種解決辦法如下:
1、減小用於cache的內存比例
將spark.storage.memoryFraction參數改為(默認為0.6)。
2、增加並行度
加大spark.default.parallelism參數。
以總數據大小為3.6G、只有兩個NodeManager節點(三個中扣掉一個要跑Driver,每節點1vCPU,480M可用內存)為例。3.6G=(3600M/並行度100)*2 CPU核=72M內存。則每節點內存為:72M/2=36M內存。
480M > 36M內存,所以足夠(這還沒有算上臨時對象等其他內存)。
常見配置
spark-defaults.conf:
spark.default.parallelism 100
spark.storage.memoryFraction 0.2
spark.executor.memory 480m
spark.yarn.am.memory 400m
#for yarn-clent mode
spark.yarn.am.cores 1
#for yarn-cluter mode
#spark.driver.cores 1
spark-env.sh:
JAVA_OPTS=" -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"