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