Spark-Streaming反压
一,作用
Spark Streaming在处理不断流入的数据是通过每间隔一段时间(batch interval),将这段时间内的流入的数据积累为一个batch,然后以这个batch内的数据作为job DAG的输入RDD提交新的job运行。当一个batch的处理时间大于batch interval时,意味着数据处理速度跟不上接受速度,此时在数据接收端(Receive一般数据接收端都运行在exector上)就会积累数据,而数据是通过BlockManager管理,如果数据存储采用MEMORY_ONLY模式就会导致OOM,采用MEMORY_AND_DISK多余的数据保存到磁盘上反而会增加数据读取时间。
为了解决这一问题Spark Streaming从1.5开始引入反压机制(back-pressure).通过动态控制数据控制数据接受速率来适配集群数据处理能力。
二,参数
- 
参数名称 默认值 说明 spark.streaming.backpressure.enabled false 是否启用反压机制 spark.streaming.backpressure.initialRate 无 初始最大接收速率。只适用于Receiver Stream,不适用于Direct Stream。 spark.streaming.backpressure.rateEstimator pid 速率控制器,Spark 默认只支持此控制器,可自定义。 spark.streaming.backpressure.pid.proportional 1.0 只能为非负值。当前速率与最后一批速率之间的差值对总控制信号贡献的权重。用默认值即可。 spark.streaming.backpressure.pid.integral 0.2 只能为非负值。比例误差累积对总控制信号贡献的权重。用默认值即可 spark.streaming.backpressure.pid.derived 0 只能为非负值。比例误差变化对总控制信号贡献的权重。用默认值即可 spark.streaming.backpressure.pid.minRate 100 只能为正数,最小速率  
//启用反压
conf.set("spark.streaming.backpressure.enabled","true")
//最小摄入条数控制
conf.set("spark.streaming.backpressure.pid.minRate","1")
//最大摄入条数控制
conf.set("spark.streaming.kafka.maxRatePerPartition","12")
注意:
- 反压机制真正起作用时需要至少处理一个批:由于反压机制需要根据当前批的速率,预估新批的速率,所以反压机制真正起作用前,应至少保证处理一个批。
 - 如何保证反压机制真正起作用前应用不会崩溃:要保证反压机制真正起作用前应用不会崩溃,需要控制每个批次最大摄入速率。若为Direct Stream,如Kafka Direct Stream,则可以通过spark.streaming.kafka.maxRatePerPartition参数来控制。此参数代表了 每秒每个分区最大摄入的数据条数。假设BatchDuration为10秒,spark.streaming.kafka.maxRatePerPartition为12条,kafka topic 分区数为3个,则一个批(Batch)最大读取的数据条数为360条(3*12*10=360)。同时,需要注意,该参数也代表了整个应用生命周期中的最大速率,即使是背压调整的最大值也不会超过该参数。
 
反压主要分为三个流程
1· 启动服务时注册rateCotroller
2 监听到批次结束事件后采样计算新的消费速率
3 提交job时利用消费速率计算每个分区的数据条数
https://www.cnblogs.com/lenmom/p/12022277.html
https://zhuanlan.zhihu.com/p/45954932

                
            
        
浙公网安备 33010602011771号