SparkStreaming 性能调优

在开发Spark Streaming应用程序时,要结合集群中各节点的配置状况尽量地提升数据处理的实时性。在调优的过程当中,一方面要尽量利用集群资源来减小每一个批处理的时间;另外一方面要确保接收到的数据能及时处理掉。ide


运行时间优化工具


  • 设置合理的批处理时间和窗口大小性能


Spark Streaming中做业之间一般存在依赖关系,后面的做业必须确保前面的做业执行结束后才能提交,若前面的做业的执行时间超过了设置的批处理时间间隔,那么后续的做业将没法按时提交执行,形成做业的堵塞。也就是说若想Spark Streaming应用程序稳定地在集群中运行,对于接收到的数据必须尽快处理掉。例如若设定批处理时间为1秒钟,那么系统每1秒钟生成一个RDD,若是系统计算一个RDD的时间大于1秒,那么当前的RDD还没来得及处理,后续的RDD已经提交上来在等待处理了,这就产生了堵塞。所以须要设置一个合理的批处理时间间隔以确保做业可以在这个批处理时间间隔时间内结束。许多实验数据代表,500毫秒对大多Spark Streaming应用而言是较好的批处理时间间隔。测试


相似地,对于窗口操做,滑动时间间隔对于性能也有很大的影响。当单批次数据计算代价太高时,能够考虑适当增大滑动时间间隔。优化


对于批处理时间和窗口大小的设定,并无统一的标准。一般是先从一个比较大的批处理时间(10秒左右)开始,而后不断地使用更小的值进行对比测试。若是Spark Streaming用户界面中显示的处理时间保持不变,则能够进一步设定更小的值;若是处理时间开始增长,则可能已经达到了应用的极限,再减少该值则可能会影响系统的性能。spa


  • 提升并行度orm


提升并行度也是一种减小批处理所消耗时间的常见方法。有如下三种方式能够提升并行度。一种方法是增长接收器数目。若是获取的数据太多,则可能致使单个节点来不及对数据进行读入与分发,使得接收器成为系统瓶颈。这时能够经过建立多个输入DStream来增长接收器数目,而后再使用union来把数据合并为一个数据源。第二种方法是将收到的数据显式地从新分区。若是接收器数目没法再增长,能够经过使用DStream.repartition、spark.streaming.blocklnterval等参数显式地对Dstream进行从新分区。第三种方法是提升聚合计算的并行度。对于会致使shuffle的操做,例如reduceByKey、reduceByKeyAndWindow等操做,可经过显示设置更高的行度参数确保更为充分地使用集群资源。接口


内存使用与垃圾回收内存


  • 控制批处理时间间隔内的数据量资源


Spark Streaming会把批处理时间间隔内获取到的全部数据存放在Spark内部可用的内存中。所以必须确保在当前节点上SparkStreaming可用的内存容量至少能容下一个批处理时间间隔内全部的数据。好比一个批处理时间间隔是1秒,可是1秒产生了1GB的数据,那么要确保当前的节点上至少有可供SparkStreaming使用的1GB内存。


  • 及时清理再也不使用的数据


对于内存中处理过的、再也不须要的数据应及时清理,以确保Spark Streaming可以拥有足够的内存空间可使用。一种方法是能够经过设置合理的spark.cleaner.ttl时长来及时清理超时的无用数据,但该方法应慎重使用,以避免后续数据在须要时被错误清理。另外一种方法是将spark.streaming.unpersist设置为true,系统将自动清理已经不须要的RDD。该方法能显著减小RDD对内存的须要,同时潜在地提升GC的性能。此外用户还能够经过配置参数streamingContext.remember为数据设置更长的保留时间。


  • 减小序列化与反序列化的负担


SparkStreaming默认将接收到的数据序列化后放入内存,以减小内存使用。序列化和反序列化须要更多的CPU资源,所以使用适当的序列化工具(例如Kryo)和自定义的序列化接口能够更高效地使用CPU。除了使用更好的序列化工具外还能够结合压缩机制,经过配置spark.rdd.compress,以CPU的时间开销来换取内存资源,下降GC开销。

相关文章
相关标签/搜索