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")
注意:
  1. 反压机制真正起作用时需要至少处理一个批:由于反压机制需要根据当前批的速率,预估新批的速率,所以反压机制真正起作用前,应至少保证处理一个批。
  2. 如何保证反压机制真正起作用前应用不会崩溃:要保证反压机制真正起作用前应用不会崩溃,需要控制每个批次最大摄入速率。若为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

posted @ 2021-03-15 20:09  麦油  阅读(144)  评论(0)    收藏  举报