Jstorm 反压(Backpressure)

简介: 限流控制,又称 反压 (backpressure), 这个概念现在在大数据中非常火爆, 尤其是最近Heron/Spark都实现了这个功能。其实在jstorm 0.9.0 时,底层netty的同步模式,即可做到限流控制, 即当接收端能处理多少tuple, 发送端才能发送多少tuple, 但随着大面积使

背景

限流控制,又称 反压 (backpressure), 这个概念现在在大数据中非常火爆, 尤其是最近Heron/Spark都实现了这个功能。其实在jstorm 0.9.0 时,底层netty的同步模式,即可做到限流控制, 即当接收端能处理多少tuple, 发送端才能发送多少tuple, 但随着大面积使用, 发现netty的同步模式会存在死锁问题, 故这种方式并没有被大量使用。

原理

后来自2015年6月,twitter发布了heron的一篇论文, 描叙了,当下游处理速度跟不上上游发送速度时, 他们采取了一种暴力手段,立即停止spout的发送。 这种方式, jstorm拿过来进行压测, 发现存在大量问题, 当下游出现阻塞时, 上游停止发送, 下游消除阻塞后,上游又开闸放水,过了一会儿,下游又阻塞,上游又限流, 如此反复, 整个数据流一直处在一个颠簸状态。

真正合适的状态时, 上游降速到一个特定的值后, 下游的处理速度刚刚跟上上游的速度

什么样才能触发反压

jstorm的限流机制, 当下游bolt发生阻塞时, 并且阻塞task的比例超过某个比例时(现在默认设置为0.1), 即假设一个component有100个并发,当这个component 超过10个task 发生阻塞时,才会触发启动反压限流

什么样的情况才能判断是阻塞

在jstorm 连续4次采样周期中采样,队列情况,当队列超过80%(可以设置)时,即可认为该task处在阻塞状态

触发谁限流

根据阻塞component,进行DAG 向上推算,直到推算到他的源头spout, 并将topology的一个状态位,设置为 “限流状态”

怎么限流

当task出现阻塞时,他会将自己的执行线程的执行时间, 传给topology master, 当触发阻塞后, topology master会把这个执行时间传给spout, 于是, spout每发送一个tuple,就会等待这个执行时间。storm 社区的人想通过动态调整max_pending达到这种效果,其实这种做法根本无效。

怎样解除限流

当spout降速后, 发送过阻塞命令的task 检查队列水位连续4次低于0.05时, 发送解除反应命令到topology master, topology master 发送提速命令给所有的spout, 于是spout 每发送一个tuple的等待时间--, 当spout的等待时间降为0时, spout会不断发送“解除限速”命令给 topology master, 而topology master确定所有的降速的spout都发了解除限速命令时, 将topology状态设置为正常,标志真正解除限速

如何使用

  • 反压总开关
topology.backpressure.enable: true
  • 高水位 -- 当队列使用量超过这个值时,认为阻塞
topology.backpressure.water.mark.high: 0.8
  • 低水位 -- 当队列使用量低于这个量时, 认为可以解除阻塞
topology.backpressure.water.mark.low: 0.05
  • 阻塞比例 -- 当阻塞task数/这个component并发 的比例高于这值时,触发反压
topology.backpressure.coordinator.trigger.ratio: 0.1
  • 反压采样周期, 单位ms
topology.backpressure.check.interval: 1000
  • 采样次数和采样比例, 即在连续4次采样中, 超过(不包含)(4 *0.75)次阻塞才能认为真正阻塞, 超过(不包含)(4 * 0.75)次解除阻塞才能认为是真正解除阻塞
topology.backpressure.trigger.sample.rate: 0.75
topology.backpressure.trigger.sample.number: 4
  • 动态调整

  1. update_topology topology-name -conf confpath

作者:glowd

原文:https://blog.csdn.net/zengqiang1/article/details/78451055
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章
|
5月前
|
消息中间件 缓存 监控
Flink背压原理以及解决优化
Flink背压原理以及解决优化
157 0
|
流计算 Java 监控
如何分析及处理 Flink 反压?
反压(backpressure)是实时计算应用开发中,特别是流式计算中,十分常见的问题。反压意味着数据管道中某个节点成为瓶颈,处理速率跟不上上游发送数据的速率,而需要对上游进行限速。
如何分析及处理 Flink 反压?
|
6月前
|
jstorm 分布式计算 搜索推荐
JStorm使用总结
JStorm使用总结
47 0
|
消息中间件 监控 Kafka
Flink 1.13.0 反压监控的优化
Flink 1.13.0 版本增加了很多新特征,具体可以参考前面一篇文章,在 Flink 1.13.0 版本之前,我们通常是通过 UI 上面的 BackPressure 或者 Metrics 里面的 inPoolUsage ,outPoolUsage 指标去分析反压出现的位置.在 Flink 1.13.0 版本中对反压监控新增了瓶颈检测,能够帮助我们快速定位反压的位置,因为性能分析的过程中第一个问题就是,哪个操作是瓶颈?为了帮助回答这个问题,Flink 公开了有关任务繁忙(正在执行工作)和反压(具有执行工作的能力,但不能执行任务的原因,因为其后继的算子无法接收更多数据)的度量标准。瓶颈的候选者
Flink 1.13.0 反压监控的优化
|
缓存 算法 数据处理
【Flink】(八)容错机制
【Flink】(八)容错机制
188 0
【Flink】(八)容错机制
|
存储 机器学习/深度学习 缓存
Flink 状态与容错
在 Flink 的框架中,进行有状态的计算是 Flink 最重要的特性之一。所谓的状态,其实指的是 Flink 程序的中间计算结果。Flink 支持了不同类型的状态,并且针对状态的持久化还提供了专门的机制和状态管理器。
186 0
Flink 状态与容错
|
存储 消息中间件 分布式计算
Apache Flink 进阶(七):网络流控和反压剖析
本文根据 Apache Flink 系列直播整理而成,由 Apache Flink Contributor、OPPO 大数据平台研发负责人张俊老师分享。主要内容如下: - 网络流控的概念与背景 - TCP的流控机制 - Flink TCP-based 反压机制(before V1.5) - Flink Credit-based 反压机制 (since V1.5) - 总结与思考
Apache Flink 进阶(七):网络流控和反压剖析
|
流计算 网络协议 Apache
咱们从头到尾讲一次 Flink 网络流控和反压剖析
文章将从网络流控的概念与背景、TCP的流控机制、Flink TCP-based 反压机制(before V1.5)、Flink Credit-based 反压机制 (since V1.5)、总结与思考等几个方面进行分享。
咱们从头到尾讲一次 Flink 网络流控和反压剖析
|
流计算 缓存 监控
深入了解 Flink 网络栈(二):监控、指标和处理背压
在之前的文章中,我们从高级抽象到底层细节各个层面全面介绍了 Flink 网络栈的工作机制。作为这一系列的第二篇文章,本文将在第一篇的基础上更进一步,主要探讨如何监视与网络相关的指标,从而识别背压等因素带来的影响,或找出吞吐量和延迟的瓶颈所在。
|
调度
Jstorm调度规则
Jstorm调度规则
539 0