精选Flink面试题

本文涵盖了Flink应用架构、压力测试与监控、选用Flink的原因、checkpoint机制、exactly-once语义、状态管理、watermark机制等13个面试重点。解答涉及Flink的Yarn模式、高可用配置、背压处理、状态后端RocksDB、Bloom Filter去重、Watermark处理乱序事件以及如何在数据高峰时确保系统稳定等实践策略。

1、应用架构
        问题:公司怎么提交的实时任务,有多少 Job Manager?

        解答:

        1. 我们使用 ​​yarn ​​​Per-job or Application Mode 模式提交任务。每次提交都会创建一个新的 Flink 集群,任务之间互相独立,互不影响, 方便管理。任务执行完成之后创建的集群也会消失。线上命令脚本如下:

        2. 集群默认只有一个 Job Manager。但为了防止单点故障,我们配置了高可用。 我们公司一般配置一个主 Job Manager,两个备用 Job Manager,然后结合 ZooKeeper 的使用,来达到高可用。

2、压测和监控
        问题:怎么做压力测试和监控?

        解答:我们一般碰到的压力来自以下几个方面:

        一,产生数据流的速度如果过快,而下游的算子消费不过来的话,会产生背压。 背压的监控可以使用 Flink Web UI(localhost:8081) 来可视化监控,一旦报警就能知道。一般

### Flink 的 Checkpoint 机制及其工作原理 Flink 的 Checkpoint 机制是其容错能力的核心,旨在确保在发生故障时能够恢复状态并保证 Exactly-Once 处理语义。该机制通过周期性地对作业的状态进行快照,并将其存储到可靠的持久化存储系统中,例如分布式文件系统(如 HDFS)或对象存储(如 S3)[^3]。 在 Checkpoint 过程中,Flink 使用一种称为 **checkpoint barrier** 的机制来标记数据流中的检查点位置。这些 barrier 被插入到数据流中,并随着数据流传播到所有算子。每个算子在接收到 barrier 后,会触发本地状态的快照操作,并将当前状态写入持久化存储。在分布式快照过程中,Flink 使用 **Chandy-Lamport 算法** 的变种来确保全局一致性[^1]。 ### Checkpoint 流程 1. **触发 Checkpoint**:JobManager 定期发送 Checkpoint 触发消息给所有 Source Task。 2. **插入 Barrier**:Source Task 接收到触发消息后,在其输出流中插入一个 barrier,该 barrier 将数据流划分为不同的 Checkpoint 阶段。 3. **传播 Barrier**:Barrier 随着数据流传播到下游 Task。 4. **本地快照**:每个 Task 在接收到 barrier 后,会暂停处理后续数据,直到当前 barrier 所属 Checkpoint 的所有上游 barrier 都被接收。然后,该 Task 对本地状态进行快照,并将快照信息写入外部存储。 5. **确认完成**:Task 完成快照后,向 JobManager 发送确认信息。 6. **完成 Checkpoint**:当 JobManager 收到所有 Task 的确认信息后,本次 Checkpoint 完成。 ### Checkpoint 的功能 Flink 的 Checkpoint 机制主要用于实现以下功能: - **Exactly-Once 语义**:确保每条数据仅被处理一次,即使在故障恢复时也能避免数据丢失或重复。 - **状态一致性**:在作业失败时,能够恢复到最近一次 Checkpoint 的状态,确保状态的一致性。 - **容错能力**:通过持久化状态,Flink 能够在发生故障时从 Checkpoint 恢复,从而提高系统的可用性[^3]。 ### Barrier 机制 Checkpoint barrier 是 Flink 分布式快照的核心机制,它用于标识 Checkpoint 的边界。每个 barrier 对应一个特定的 Checkpoint ID,并且会随着数据流传播到所有算子。Barrier 机制确保所有算子在接收到 barrier 后,能够正确地进行状态快照,并且不会将属于不同 Checkpoint 的数据混合在一起[^1]。 ### 分布式快照算法及其工作原理 Flink 的分布式快照算法基于 Chandy-Lamport 算法,该算法通过插入 barrier 来协调所有 Task 的状态快照。具体工作原理如下: 1. **Barrier 插入**:JobManager 触发 Checkpoint 后,Source Task 在输出流中插入 barrier。 2. **Barrier 传播**:Barrier 随着数据流传播到下游 Task。 3. **状态快照**:每个 Task 在接收到 barrier 后,暂停处理后续数据,直到所有上游 barrier 都被接收。然后,Task 对本地状态进行快照,并将快照信息写入外部存储。 4. **Barrier 对齐**:为了确保状态一致性,Flink 会进行 barrier 对齐操作,即等待所有上游输入流的 barrier 到达后,才进行快照操作。 ### 数据不丢失的保证机制 Flink 通过以下方式确保数据在处理过程中不丢失: - **状态持久化**:通过 Checkpoint 机制,Flink 将状态定期写入可靠的持久化存储系统,确保在发生故障时能够恢复状态。 - **Exactly-Once 语义**:Flink 使用两阶段提交协议(Two-Phase Commit, 2PC)确保端到端的 Exactly-Once 语义,避免数据重复或丢失。 - **Barriers 对齐**:在 Checkpoint 过程中,Flink 会进行 barrier 对齐操作,确保所有输入流的 barrier 到达后才进行状态快照,从而保证状态的一致性[^2]。 ```java // 示例:Flink Checkpoint 配置 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.enableCheckpointing(5000); // 每5秒触发一次 Checkpoint env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE); env.getCheckpointConfig().setMinPauseBetweenCheckpoints(2000); // 最小间隔为2秒 env.getCheckpointConfig().setCheckpointTimeout(60000); // Checkpoint 超时时间为60秒 env.getCheckpointConfig().setMaxConcurrentCheckpoints(1); // 最大并发 Checkpoint 数量为1 env.getCheckpointConfig().enableExternalizedCheckpoints(ExternalizedCheckpointSettings.RETAIN_ON_CANCELLATION); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值