flink spark strom 反压机制

2019-08-02  本文已影响0人  邵红晓

strom 反压

实现原理

Storm 是通过监控 Bolt 中的接收队列负载情况,如果超过高水位值就会将反压信息写到 Zookeeper ,Zookeeper 上的 watch 会通知该拓扑的所有 Worker 都进入反压状态,最后 Spout 停止发送 tuple

spark 反压

解决办法

  1. 静态限速 spark 1.5 以前
    sparkConf.set("spark.streaming.kafka.maxRatePerPartition","10")
  2. 开启动态反压
    .set("spark.streaming.backpressure.enabled","true")

实现原理

在原架构的基础上加上一个新的组件RateController,这个组件负责监听“OnBatchCompleted”事件,然后从中抽取processingDelay 及schedulingDelay信息. Estimator依据这些信息估算出最大处理速度(rate),最后由基于Receiver的Input Stream将rate通过ReceiverTracker与ReceiverSupervisorImpl转发给BlockGenerator(继承自RateLimiter).


image.png

流量控制点

当Receiver开始接收数据时,会通过supervisor.pushSingle()方法将接收的数据存入currentBuffer等待BlockGenerator定时将数据取走,包装成block. 在将数据存放入currentBuffer之时,要获取许可(令牌)。如果获取到许可就可以将数据存入buffer, 否则将被阻塞,进而阻塞Receiver从数据源拉取数据。

其令牌投放采用令牌桶机制进行, 原理如下图所示:

image.png
令牌桶机制:

大小固定的令牌桶可自行以恒定的速率源源不断地产生令牌。如果令牌不被消耗,或者被消耗的速度小于产生的速度,令牌就会不断地增多,直到把桶填满。后面再产生的令牌就会从桶中溢出。最后桶中可以保存的最大令牌数永远不会超过桶的大小。当进行某操作时需要令牌时会从令牌桶中取出相应的令牌数,如果获取到则继续操作,否则阻塞。用完之后不用放回。

flink 反压

链路演示

flink 反压原理

  1. product 发送3个,consumer 消费1个,reveive window size 剩余3个,发送ack,可接受数量3
  2. product接受到ack,滑动window,再发送3个,comsumer此时已经慢了,可接受数量0个,发送ack和可接受数量0个
  3. product接受到ack,不在发送0个给consumer,并且周期性探测

代码实现

您可以使用以下配置键配置JobManager的样本数:

web.backpressure.refresh-interval:刷新时间间隔(默认值:60000,1分钟)。
web.backpressure.num-samples:用于确定backpressure的堆栈跟踪样本数(默认值:100个)。
web.backpressure.delay-between-samples:跟踪样本延迟时间(默认值:50  ms)。

flink 反压机制不一定触发

image.png
上一篇 下一篇

猜你喜欢

热点阅读