Spark Streaming调优
操作场景
Streaming作为一种mini-batch方式的流式处理框架,它主要的特点是秒级时延和高吞吐量。因此Streaming调优的目标是在秒级延迟的情景下,提高Streaming的吞吐能力,在单位时间处理尽可能多的数据。
本章节适用于输入数据源为Kafka的使用场景。
操作步骤
一个简单的流处理系统由以下三部分组件组成:数据源 + 接收器 + 处理器。数据源为Kafka,接收器为Streaming中的Kafka数据源接收器,处理器为Streaming。
对Streaming调优,就必须使三个部件的性能都最优化。
- 数据源调优
在实际的应用场景中,数据源为了保证数据的容错性,会将数据保存在本地磁盘中,而Streaming的计算结果往往全部在内存中完成,数据源很有可能成为流式系统的最大瓶颈点。
对Kafka的性能调优,有以下几个点:
- 使用Kafka-0.8.2以后版本,可以使用异步模式的新Producer接口。
- 配置多个Broker的目录,设置多个IO线程,配置Topic合理的Partition个数。
详情请参见Kafka开源文档中的“性能调优”部分:http://kafka.apache.org/documentation.html。
- 接收器调优
Streaming中已有多种数据源的接收器,例如Kafka、Flume、MQTT、ZeroMQ等,其中Kafka的接收器类型最多,也是最成熟一套接收器。
Kafka包括三种模式的接收器API:
- KafkaReceiver:直接接收Kafka数据,进程异常后,可能出现数据丢失。
- ReliableKafkaReceiver:通过ZooKeeper记录接收数据位移。
- DirectKafka:直接通过RDD读取Kafka每个Partition中的数据,数据高可靠。
从实现上来看,DirectKafka的性能会是最好的,实际测试上来看,DirectKafka也确实比其他两个API性能好。因此推荐使用DirectKafka的API实现接收器。
数据接收器作为一个Kafka的消费者,对于它的配置优化,请参见Kafka开源文档:http://kafka.apache.org/documentation.html。
- 处理器调优
Streaming的底层由Spark执行,因此大部分对于Spark的调优措施,都可以应用在Streaming之中,例如:
- 数据序列化
- 配置内存
- 设置并行度
- 使用External Shuffle Service提升性能
在做Spark Streaming的性能优化时需注意一点,越追求性能上的优化,Streaming整体的可靠性会越差。例如:
“spark.streaming.receiver.writeAheadLog.enable”配置为“false”的时候,会明显减少磁盘的操作,提高性能,但由于缺少WAL机制,会出现异常恢复时,数据丢失。
因此,在调优Streaming的时候,这些保证数据可靠性的配置项,在生产环境中是不能关闭的。