
# Spark Streaming调优
#### 操作场景
Streaming作为一种mini-batch方式的流式处理框架，它主要的特点是秒级时延和高吞吐量。因此Streaming调优的目标是在秒级延迟的情景下，提高Streaming的吞吐能力，在单位时间处理尽可能多的数据。
![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
本章节适用于输入数据源为Kafka的使用场景。
#### 操作步骤
一个简单的流处理系统由以下三部分组件组成：数据源 + 接收器 + 处理器。数据源为Kafka，接收器为Streaming中的Kafka数据源接收器，处理器为Streaming。
对Streaming调优，就必须使三个部件的性能都最优化。
- **数据源调优**
  在实际的应用场景中，数据源为了保证数据的容错性，会将数据保存在本地磁盘中，而Streaming的计算结果往往全部在内存中完成，数据源很有可能成为流式系统的最大瓶颈点。
  对Kafka的性能调优，有以下几个点：
  - 使用Kafka-0.8.2以后版本，可以使用异步模式的新Producer接口。
  
  - 配置多个Broker的目录，设置多个IO线程，配置Topic合理的Partition个数。
  
  
  详情请参见Kafka开源文档中的"性能调优"部分：<https://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开源文档：<https://kafka.apache.org/documentation.html>。
  
- **处理器调优**
  Streaming的底层由Spark执行，因此大部分对于Spark的调优措施，都可以应用在Streaming之中，例如：
  - 数据序列化
  
  - 配置内存
  
  - 设置并行度
  
  - 使用External Shuffle Service提升性能
  
  
  ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
  在做Spark Streaming的性能优化时需注意一点，越追求性能上的优化，Streaming整体的可靠性会越差。例如：
  "spark.streaming.receiver.writeAheadLog.enable"配置为"false"的时候，会明显减少磁盘的操作，提高性能，但由于缺少WAL机制，会出现异常恢复时，数据丢失。
  因此，在调优Streaming的时候，这些保证数据可靠性的配置项，在生产环境中是不能关闭的。
  
 
