[置顶] Spark作业优化总结

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")

2)a、Task序列化:使用Kryo序列化机制来序列化task,可以减小task的大小,从而减少发送这些task到各个Worker节点上的Executor的时间。
      b、执行模式:在Standalone模式下运行Spark,可以达到更少的task启动时间。

conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

3)  使用StaticMemoryManager内存管理机制,如果设置为true时,选择的实例为StaticMemoryManager实例,否则选择UnifiedMemoryManager实例.默认情况下这个值为false.

conf.set("spark.memory.useLegacyMode", "true")

4)在发布一个本地数据任务时候,放弃并发布到一个非本地数据的地方前,需要等待的时间。如果你的很多任务都是长时间运行的任务,并且看到了很多的脏数据的话,你就该增加这个值了。但是一般情况下缺省值就可以很好的工作了。

conf.set("spark.locality.wait", "6000") 

5)限制每秒钟从topic的每个partition最多消费的消息条数

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配置及内存使用


3、针对 Shuffle的优化

//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")


你可能感兴趣的:(spark)