概述
Spark Streaming中的反压机制是Spark 1.5.0推出的新特性,可以根据处理效率动态调整摄入速率。
当批处理时间(Batch Processing Time
)大于批次间隔(Batch Interval,即 BatchDuration
)时,说明处理数据的速度小于数据摄入的速度,持续时间过长或源头数据暴增,容易造成数据在内存中堆积,最终导致Executor OOM或任务奔溃。
反压机制原理
根据流数据的处理效率动态调整摄入速率,以达到限流的目的。
反压机制相关参数
1. spark.streaming.backpressure.enabled
是否启用反压机制(spark1.5),启用后自动的动态调整摄入速率,默认值false。
2. spark.streaming.backpressure.initialRate
启用背压机制时每个receiving将接收第一批数据的初始最大接收速率,默认值无。
3. spark.streaming.kafka.maxRatePerPartition
使用新Kafka直接流API时(即:Direct模式),从每个Kafka分区读取数据的最大速率,默认没有设置。
4. spark.streaming.kafka.minRatePerPartition
使用新Kafka直接流API时(即:Direct模式),从每个Kafka分区读取数据的最小速率,默认是1。
5. spark.streaming.receiver.maxRate
每个接收器将接收数据的最大速率,配置设置为0或负数将对速率没有限制,仅在Receiver模式下有效,默认没有设置
注意:
1. 摄入速率指的是每秒每个分区最大摄入的数据条数
2. 当spark.streaming.backpressure.enabled值为true,spark.streaming.receiver.maxRate或 spark.streaming.kafka.maxRatePerPartition设置后,动态摄入速率设置的最大值等于 spark.streaming.receiver.maxRate或spark.streaming.kafka.maxRatePerPartition的值
3. spark.streaming.backpressure.initialRate参数,有些博客上写的是只适用于Receiver Stream。然而我在kafka的Direct模式下测试时发现该参数依然有效,不同的之处在于,Spark Streaming程序运行后的1、2两个批次数据都受限于该参数,而非仅第一个批次数据受限。后面有时间看下源码是什么情况。