当前位置:   article > 正文

Flink进阶与调优_execution.buffer-timeout

execution.buffer-timeout

【知识点1】Flink在处理网络传输时,通过 NetworkBuffer来实现攒批,权衡吞吐和延迟的关系。Flink 1.10 及以后的版本直接通过配置参数 execution.buffer-timeout: 100ms 可以设置,Flink 1.10 之前通过代码 env.setBufferTimeout(100)设置 。当设置为 0 时表示没有 timeout 策略,即:每条数据来了都认为 buffer 满了,将这一条数据单独发送给下游。保障了实时性,但吞吐可能会下降。要想吞吐不下降,就需要消耗更多的资源。100ms 是 Flink 权衡过的 timeout 默认值,既能保证吞吐,又能保障延迟控制在 100ms 以内。

触发buffer向Netty Server发送数据的三个条件:

  • buffer写满了(默认大小为32KB)
  • buffer超时了(默认为100ms)
  • 遇到特殊的Event,例如Checkpoint barrier

【调优1】Flink的高并发任务(超过500并行度)在使用keyBy或者rebalance的情况下,将bufferTimeout设置为1s可以节省30~50%的CPU消耗,中等并发任务也会有不少收益。

【参考链接1】https://mp.weixin.qq.com/s/IXOlYQBVj30daybPvYYLPw

 

【知识点2】Flink的manage state分为算子状态和键控状态。在处理包含无限多键的数据时,要考虑到 keyed 状态保留策略(通过 TTL 定时器来在给定的时间之后清理未使用的数据)是很重要的。如果你的 keyed 状态包含在某个 Flink 的默认窗口中,则将是安全的:即使未使用  TTL,在处理窗口的元素时也会注册一个清除计时器,该计时器将调用 clearAllState 函数,并删除与该窗口关联的状态及其元数据。如果要使用 Keyed State Descriptor来管理状态,可以很方便地添加 TTL 配置,以确保在状态中的键数量不会无限制地增加。但是,你可能会想使用更简便的 mapWithState 方法,该方法可让你访问 valueState 并隐藏操作的复杂性。虽然这对于测试和少量键的数据来说是很好的选择,但如果在生产环境中遇到无限多键值时,会引发问题。由于状态是对你隐藏的,因此你无法设置 TTL,并且默认情况下未配置任何 TTL。这就是为什么值得考虑做一些额外工作的原因,如声明诸如 RichMapFunction 之类的东西,这将使你能更好的控制状态的生命周期。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/919066
推荐阅读
相关标签
  

闽ICP备14008679号