赞
踩
【知识点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发送数据的三个条件:
【调优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 之类的东西,这将使你能更好的控制状态的生命周期。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。