Spark作业优化总结
1 、首先初始化配置文件
val conf = new SparkConf().setAppName("spark-demo")
2、针对Spark-Streaming作业
1) 数据接收并行度调优,除了创建更多输入DStream和Receiver以外,还可以考虑调节block interval。通过参数,spark.streaming.blockInterval,可以设置block interval,默认是200ms。对于大多数Receiver来说,在将接收到的数据保存到Spark的BlockManager之前,都会将数据切分为一个一个的block。而每个batch中的block数量,则决定了该batch对应的RDD的partition的数量,以及针对该RDD执行transformation操作时,创建的task的数量。每个batch对应的task数量是大约估计的,即batch interval / block interval。
conf.set("spark.streaming.blockInterval", "50ms")
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.set("spark.memory.useLegacyMode", "true")
conf.set("spark.locality.wait", "6000")
conf.set("spark.streaming.kafka.maxRatePerPartition", "15000")
6)executor分配给缓存的内存比例,默认为0.6即60%,剩下40%为task运行的内存,实际上40%是偏小的,在Spark-1.6版本需要设置spark.memory.useLegacyMode为true.
conf.set("spark.storage.memoryFraction", "0.3")
参考文章:
Spark性能优化:JVM参数调优
查看Spark进程的JVM配置及内存使用
//shuffle优化 //spark.shuffle.consolidateFiles:是否开启shuffle block file的合并,默认为false conf.set("spark.shuffle.consolidateFiles", "true") //spark.reducer.maxSizeInFlight:reduce task的拉取缓存,默认48m conf.set("spark.reducer.maxSizeInFlight", "150m") //spark.shuffle.file.buffer:map task的写磁盘缓存,默认32k conf.set("spark.shuffle.file.buffer", "128k") // 拉取失败的最大重试次数,默认3次 conf.set("spark.shuffle.io.maxRetries", "8") //拉取失败的重试间隔,默认5s conf.set("spark.shuffle.io.retryWait", "6s") //用于reduce端聚合的内存比例,默认0.2,超过比例就会溢出到磁盘上 conf.set("spark.shuffle.memoryFraction", "0.3") //提高 spark-sql中shuffle的并行度 conf.set("spark.sql.shuffle.partitions", "1000")