Spark Streaming调优经验
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中的数据,数据高可靠。
- 处理器调优
Streaming的底层由Spark执行,因此大部分对于Spark的调优措施,都可以应用在Streaming之中,例如:
- 数据序列化
- 配置内存
- 设置并行度
- 使用External Shuffle Service提升性能
- 日志归档调优 参数“spark.eventLog.group.size”用来设置一个应用的JobHistory日志按照指定job个数分组,每个分组会单独创建一个文件记录日志,从而避免应用长期运行时形成单个过大日志造成JobHistory无法读取的问题,设置为“0”时表示不分组。 大部分Spark Streaming任务属于小型job,而且产生速度较快,会导致频繁的分组,产生大量日志小文件消耗磁盘I/O。建议增大此值,例如改为“1000”或更大值。