Spark Streaming应用程序调优

常见调优策略

1.降低数据处理时间
spark streaming的任务最终会转换成RDD的计算,因此降低处理时间可以采用spark core优化的方法,这里不赘述。

2.调整receiver并行度
spark streaming应用中默认只启动一个receiver,当数据流量很大时可能出现单个receiver处理能力瓶颈的问题,因此可以启动多个receiver来并行处理。下面以socketTextStream为例。

val line1 = ssc.socketTextStream("192.168.61.136", 9998)
val line2 = ssc.socketTextStream("192.168.61.136", 9999)
// line 为line1和line2合并后的Dstream
val lines = line1.union(line2)

2.调整block的产生周期
receiver接收的数据会定期生成一个Block,这个参数由spark.streaming.blockInterval控制,默认是200ms。一般生产建议不要低于50ms。

3.调整接收数据的速率
spark.streaming.receiver.maxRate用于控制receiver接收数据的速率,默认是Long.Maxvalue。建议根据实际情况进行配置,防止batch processing time大于batchinterval。

4.调整Dstream分区数
Dstream的分区数决定了执行的并行度,因此可以根据实际情况调整Dstream的分区数。

// 调整分区数为4
inputStream.repartition(4)

5.使用kryo序列化
kryo是一个高性能的序列化/反序列化工具,由于使用变长存储与字节码生成技术,它的性能比java原生方式会高出很多。

val conf = new SparkConf
conf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer")
// 注册要序列化的类,Test1和Test2为类名
conf.registerKryoClasses(Array(classOf[Test1], classOf[Test2]))    

7.foreachRDD 算子调优
foreachRDD算子可以灵活的自定义输出,内部建议使用foreachPartition。

dstream.foreachRDD { rdd =>
  rdd.foreachPartition { partitionOfRecords =>
    // 自定义输出
  }
}

8.反压机制
为了适应数据流量的动态变化,引入了反压机制。它会根据jobScheduler反馈作业的执行信息来动态调整receiver数据接收速率(spark.streaming.receiver.maxRate)。通过参数
spark.streaming.backpressure.enable控制是否启动反压机制。默认为false,不启动。

9.资源动态分配
spark 支持资源动态分配,当executor不够时分配多余的executor,executor空闲时回收。
通过参数spark.streaming.dynamicAllocation.enable控制是否开启资源动态分配。

猜你喜欢

转载自blog.csdn.net/cl2010abc/article/details/107637734
今日推荐