Flink 常考面试题

本文深入探讨了Flink与Storm在处理实时数据流时的区别,重点分析了Flink的WaterMark机制如何解决乱序和延迟事件问题,以及其时间概念和更新原理。此外,还详细介绍了Flink的重启策略,包括固定延迟重启、故障率重启和无重启策略,并阐述了如何设置这些策略以确保系统的容错性和高吞吐量。同时,文章还提到了Flink的exactly-once语义保证及其状态管理。
摘要由CSDN通过智能技术生成

Flink 与 Storm 的对比

在这里插入图片描述
其余还有高可用方面的一些功能:CheckPoint 机制保证容错 && 吞吐也比 Storm 要高很多

WaterMark 的理解

主要作用是:用来解决乱序,延迟事件。因为对于 late element,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发 window 去进行计算了。这个特别的机制,就是watermark。

三个时间概念

Flink 中的时间概念

机制特征

  • Watermark 用于标记 Event-Time 的前进过程
  • Watermark 跟随 DataStream Event-Time 变动,并自身携带 TimeStamp
  • 表示比 watermark 更早(更老) 的事件都已经到达(没有比水位线更低的数据)
  • 通常基于 watermark 来进行窗口触发计算的判断

更新的原理

  • maxOutOfOrderness 表示多长时间范围内是有效的数据

基于 event-time 时间更新。如果 后面的 event-time 比前面的 元素大,那么就更新 Watermark。否则就不更新。

在这里插入图片描述
当然,在水位线之后,还会有更迟的迟到事件的到达,不会纳为窗口数据进行计算。这种 Flink 是怎么解决的呐?
在这里插入图片描述

比watermark更晚的数据如何解决

  1. 直接丢弃(默认)
  2. allowedLateness 指定允许数据延迟的时间(本质上应该是延长了 watermark 的时间范围)
  3. sideOutputLateData 收集迟到的数据(即旁路输出)

参考:一篇文章搞懂 Flink 的 watermark 机制

重启策略

有几种:

  1. 固定延迟重启策略(Fixed Delay Restart Strategy): 固定延迟重启策略尝试给定次数重新启动作业。如果超过最大尝试次数,则作业最终会失败。在两次连续重启尝试之间,重启策略等待一段固定的时间。
    举例:如何在Flink Job中设置固定延迟重启策略。如果发生故障,系统会尝试重新启动作业3次,并在连续重启尝试之间等待10秒
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(
  3, // 尝试重启的次数
  Time.of(10, TimeUnit.SECONDS) // 延时
));
  1. 故障率重启策略(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) // 延时
));
  1. 没有重启策略(No Restart Strategy)
  2. 后背重启策略(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) // 延时
));

exactly-once 的保证

Flink Exactly-Once 投递实现浅析

Flink state 有几种状态

Flink 状态管理与容错

CheckPoint 与 SavePoint(实现原理&区别)

Flink 状态管理与容错

参考

Flink面试题

Flink水位线是用来处理事件时间处理的一种机制,用于确定事件时间流的进度以及触发窗口操作的时机。在Flink中,水位线是由数据流中的时间戳和延迟阈值决定的一个特殊时间戳。 水位线的主要作用是确定窗口何时关闭以及触发窗口计算。当数据流中的时间戳达到或超过水位线时,Flink认为该窗口内的所有事件都已经到达,可以进行窗口计算操作了。 在面试中,常见的水位线面试题可能包括以下几个方面: 1. 解释水位线的概念和作用。 2. 如何确定水位线的时间戳和延迟阈值。 3. 水位线如何处理乱序事件。 4. 如何处理迟到事件。 答题时可以参考引用中提供的相关信息,其中介绍了Flink新版本不再提供At-Most-Once语义,并提到了水位线的概念。此外,引用也提到了水位线在任务反压中的作用。可以综合这些信息来回答关于Flink水位线的面试题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【先收藏,早晚用得到】100个Flink高频面试题系列(四)](https://blog.csdn.net/dajiangtai007/article/details/125260522)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值