这里写目录标题
Flink 与 Storm 的对比
其余还有高可用方面的一些功能:CheckPoint 机制保证容错 && 吞吐也比 Storm 要高很多
WaterMark 的理解
主要作用是:用来解决乱序,延迟事件
。因为对于 late element,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发 window 去进行计算了。这个特别的机制,就是watermark。
三个时间概念
机制特征
- Watermark 用于标记 Event-Time 的前进过程
- Watermark 跟随 DataStream Event-Time 变动,并自身携带 TimeStamp
- 表示比 watermark 更早(更老) 的事件都已经到达(没有比水位线更低的数据)
- 通常基于 watermark 来进行窗口触发计算的判断
更新的原理
- maxOutOfOrderness 表示多长时间范围内是有效的数据
基于 event-time 时间更新。如果 后面的 event-time 比前面的 元素大,那么就更新 Watermark。否则就不更新。
当然,在水位线之后,还会有更迟的迟到事件的到达,不会纳为窗口数据进行计算。这种 Flink 是怎么解决的呐?
比watermark更晚的数据如何解决
- 直接丢弃(默认)
- allowedLateness 指定允许数据延迟的时间(本质上应该是延长了 watermark 的时间范围)
- sideOutputLateData 收集迟到的数据(即旁路输出)
参考:一篇文章搞懂 Flink 的 watermark 机制
重启策略
有几种:
- 固定延迟重启策略(Fixed Delay Restart Strategy):
固定延迟重启策略尝试给定次数重新启动作业
。如果超过最大尝试次数,则作业最终会失败。在两次连续重启尝试之间,重启策略等待一段固定的时间。
举例:如何在Flink Job中设置固定延迟重启策略。如果发生故障,系统会尝试重新启动作业3次,并在连续重启尝试之间等待10秒。
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(
3, // 尝试重启的次数
Time.of(10, TimeUnit.SECONDS) // 延时
));
- 故障率重启策略(Failure Rate Restart Strategy):故障率重启策略在故障发生之后重启作业,但是
当故障率(每个时间间隔发生故障的次数)超过设定的限制时,作业会最终失败
。 在连续的两次重启尝试之间,重启策略等待一段固定长度的时间。
举例:延迟 10s 重启作业,没有最大启动次数限制,但是5min之内不能重启超过3次,如果超过就不再重启。
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
env.setRestartStrategy(RestartStrategies.failureRateRestart(
3, // 每个时间间隔的最大故障次数
Time.of(5, TimeUnit.MINUTES), // 测量故障率的时间间隔
Time.of(10, TimeUnit.SECONDS) // 延时
));
- 没有重启策略(No Restart Strategy)
- 后背重启策略(Fallback Restart Strategy)
使用集群定义的重启策略(即配置文件定义的)。 这对于启用了 checkpoint 的流处理程序很有帮助。 如果没有定义其他重启策略,默认选择固定延时重启策略,默认最大启动次数是Integer.MAX_VALUE
如何设置:
配置文件定义
通过 Flink 的配置文件 flink-conf.yaml 来设置默认的重启策略。配置参数 restart-strategy 定义了采取何种策略。
如果没有启用 checkpoint,不配置restart 策略的话,就采用“不重启”策略
。如果启用了 checkpoint 且没有配置重启策略,那么就采用固定延时重启策略
, 此时最大尝试重启次数由 Integer.MAX_VALUE 参数设置。
作业自己设置
除了定义默认的重启策略以外,还可以为每个 Flink 作业单独定义重启策略。 这个重启策略通过在程序中的 ExecutionEnvironment 对象上调用 setRestartStrategy 方法来设置。 当然,对于 StreamExecutionEnvironment 也同样适用。
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(
3, // 尝试重启的次数
Time.of(10, TimeUnit.SECONDS) // 延时
));