Spark streaming实时计算程序的性能优化

一、并行化数据接收

这个 方法在处理多个topic的数据是比较有效。

int numStreams = 5;

List> kafkaStreams = new ArrayList>(numStreams);

for (int i = 0; i < numStreams; i++) {

  kafkaStreams.add(KafkaUtils.createStream(...));

}

JavaPairDStream unifiedStream = streamingContext.union(kafkaStreams.get(0), kafkaStreams.subList(1, kafkaStreams.size()));

unifiedStream.print()

 

二、调节blockInterval参数

主旨:增加block数量,增加每个batch rdd的partition的数量,增加处理的并行度。

receiver从数据源源源不断地获取到数据,首先会按照block interval,将指定时间间隔的数据收集到一个block;默认时间是200ms,官方推荐不要小于50ms;然后会将指定batch interval时间间隔内的block合并为一个batch,创建为一个rdd,然后启动一个job去处理这个batch rdd中的数据。

batch rdd的partition数量的确定:一个batch有多少个block,就有多少个partition,就意味着并行度是多少,意味着每个batch rdd有多少个task会并行计算和处理。

我们希望可以闭默认的task数量和并行度再多一些,可以手动调节block interval,减少block interval的数值,让每个batch可以包含更多的block,有更多的partition,也就有更多的task并行处理每个batch rdd。

 

三、重分区

InputStream.repartition(),增加每个batch rdd的partition数量,这样可以提高指定的dstream的rdd的计算并行度。

 

四、调节并行度

调节参数:

spark.default.parallelism

reduceByKey(numPartitions)

 

五、使用Kryo序列化机制

提高序列化task发送到executor上执行的性能,如果task很多的时候,task序列化和反序列化的性能开销会比较可观。

默认输入数据的存储级别是StorageLevel.MEMORY_AND_DISK_SER_2,receiver接收到数据,默认就会进行持久化操作。首先持久化数据,存储到内存中;如果内存资源不够大,那么就写入磁盘;而且还会有一份冗余副本写到其他executor的block manager中。

 

六、设置batch interval

设置该参数,使每个batch的运行时间小于该参数。batch的运行时间可以通过spark ui进行查看。

如果发现batch的处理时间大于batch interval,必须调节batch interval,不要让batch的处理时间大于batch interval。

比如batch每隔5秒生成一次,batch的处理时间要达到6秒。这个时候,batch在内存中日积月累,一直囤积着,没法及时计算掉,释放资源;而且对内存空间的占用越来越大,导致内存空间快速消耗。

如果发现batch处理时间比batch interval大,尽量将batch interval调大一些。

 

 

你可能感兴趣的:(Spark,Streaming,性能优化,Spark,Streaming)