必须掌握的Spark调优技术点

在利用Spark处理数据时,若是数据量不大,那么Spark的默认配置基本就能知足实际的业务场景。可是当数据量大的时候,就须要作必定的参数配置调整和优化,以保证业务的安全、稳定的运行。而且在实际优化中,要考虑不一样的场景,采起不一样的优化策略。apache

1. 合理设置微批处理时间缓存

在SparkSreaming流式处理中,合理的设置微批处理时间(batchDuration)是很是有必要的。安全

若是batchDuration设置太短,会致使SparkStreaming频繁提交job。若是每一个batchDuration所产生的job不能在这个时间内完成处理,就会形成job不断堆积,最终致使SparkStreaming发生阻塞,甚至程序宕掉。微信

须要根据不一样的应用场景和硬件配置等肯定,能够根据SparkStreaming的可视化监控界面,观察Total Delay等指标来进行batchDuration的调整。app

2. 控制消费的最大速率性能

好比SparkStreaming和Kafka集成,采用direct模式时,须要设置参数spark.streaming.kafka.maxRatePerPartition以控制每一个Kafka分区最大消费数。该参数默认没有上线,即Kafka当中有多少数据它就会直接所有拉出。学习

但在实际使用中,须要根据生产者写入Kafka的速率以及消费者自己处理数据的速度综合考虑。大数据

同时还须要结合上面的batchDuration,使得每一个partition拉取的数据,要在每一个batchDuration期间顺利处理完毕,作到尽量高的吞吐量,该参数的调整需参考可视化监控界面中的Input Rate和Processing Time。优化

3. 缓存反复使用的"数据集"spa

Spark中的RDD和SparkStreaming中的DStream,若是被反复的使用,最好利用cache或者persist算子,将"数据集"缓存起来,防止过分的调度资源形成的没必要要的开销。

4. 合理的设置GC

JVM垃圾回收是很是消耗性能和时间的,尤为是stop world、full gc很是影响程序的正常运行。

关于JVM和参数配置,建议研读《JVM内存管理和垃圾回收》《JVM垃圾回收器、内存分配与回收策略》《内存泄漏、内存溢出和堆外内存,JVM优化配置参数》。

5. 合理设置CPU

每一个executor能够占用一个或多个core,能够经过观察CPU的使用率变化来了解计算资源的使用状况。

要避免CPU的使用浪费,好比一个executor占用多个core,可是总的CPU利用率却不高。此时建议让每一个executor占用相对以前较少的core,同时worker下面增长更多的executor进程来增长并行执行的executor数量,从而提升CPU利用率。同时要考虑内存消耗,毕竟一台机器运行的executor越多,每一个executor的内存就越小,容易产生OOM。

6. 使用Kryo进行序列化和反序列化

Spark默认使用Java的序列化机制,但这种Java原生的序列化机制性能却比Kryo差不少。使用Kryo须要进行设置:

//设置序列化器为KryoSerializerSparkConf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer")

//注册要序列化的自定义类型SparkConf.registerKryoClasses(Array(classOf[CustomClass1],classOf[CustomClass2]))

7. 使用高性能的算子

1)使用reduceByKey、aggregateByKey替代groupByKey

2)filter以后进行coalesce操做

3)使用repartitionAndSortWithinPartition

替代repartition与sort操做

4)使用mapPartition替代map

5)使用foreachPartition替代foreach

要结合实际使用场景,进行算子的替代优化。

除了上述经常使用调优策略,还有合理设置Spark并行度,好比参数spark.default.parallelism的设置等,全部这些都要求对Spark内核原理有深刻理解,这里再也不一一阐述。


 

关注微信公众号:大数据学习与分享,获取更对技术干货

相关文章
相关标签/搜索