Flink Checkpoint超时问题

Flink Checkpoint超时问题

问题现象

业务部门最近使用Flink来做数据实时同步,通过同步工具把CDC消息接入Kafka,其中上百张表同步到单个topic里,然后通过Flink来消费Kafka,做数据解析、数据分发、然后发送到目标数据库(mysql/oracle),整个链路相对比较简单,之前通过Jstorm来实现,最近才迁移到Flink,通过Flink DataStream API来实现。代码里仅用到Kafka Source、Map、Process几个简单的算子,发送目标库的逻辑在Process的逻辑里实现,因此process的逻辑里涉及数据库连接的创建与清理、通过队列来缓存数据,创建额外线程来启动发送和消费队列的逻辑,先不说整个逻辑是否合理,本文主要基于此案例来阐述遇到的问题和排查思路以及解决方法。
在这里插入图片描述

业务部门使用的Flink版本为1.11.2,部署模式采用Standalone。出问题的是单机环境,即有一个JobManager进程和一个TaskManager进程。

问题现象是通过web页面观察发现启动任务后很短时间任务就发生重启,同时还会出现重启去Cancel任务的时候无法Cancel,一直处于CANCELING状态(正常会很快变成CANCELED)。并且过一段时候后TaskManager进程挂掉,导致任务一直处于无法申请Slot的状态,最终导致数据无法正常同步。因此,问题主要有以下几个现象:

  1. Checkpoint超时
  2. 子任务长时间处于CANCELING,任务长时间处于RESTARTING状态
  3. 一段时间后TaskManager进程挂掉
  4. 数据无法正常同步

问题分析

问题1:TaskManager进程挂掉

看到问题的第一反应是首先看TaskManager进程为什么会挂掉,这个问题比较严重,因为涉及到集群层面而不单单是任务了。查看Taskmanager日志,发现有以下片段:

// 日志1
ERROR org.apache.flink.runtime.taskexecutor.TaskExecutor           [] - Task did not exit gracefully within 180 + seconds.
org.apache.flink.util.FlinkRuntimeException: Task did not exit gracefully within 180 + seconds.
	at org.apache.flink.runtime.taskmanager.Task$TaskCancelerWatchDog.run(Task.java:1572) [flink-dist_2.11-1.11.2.jar:1.11.2]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
2021-03-05 04:09:30,816 ERROR org.apache.flink.runtime.taskexecutor.TaskManagerRunner      [] - Fatal error occurred while executing the TaskManager. Shutting it down...
org.apache.flink.util.FlinkRuntimeException: Task did not exit gracefully within 180 + seconds.
	at org.apache.flink.runtime.taskmanager.Task$TaskCancelerWatchDog.run(Task.java:1572) [flink-dist_2.11-1.11.2.jar:1.11.2]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
// 日志2
WARN  org.apache.flink.runtime.taskmanager.Task                    [] - Task 'Source: Custom Source -> Map -> Process (1/1)' did not react to cancelling signal for 30 seconds, but is stuck in method:
 org.apache.flink.streaming.runtime.tasks.StreamTaskActionExecutor$SynchronizedStreamTaskActionExecutor.runThrowing(StreamTaskActionExecutor.java:91)
org.apache.flink.streaming.runtime.tasks.mailbox.Mail.run(Mail.java:78)
org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.processMail(Mai
<think>我们正在讨论Flink在HDFS上进行Checkpoint以及高可用(HA)的配置。根据用户提供的引用,我们知道Flink HA集群需要HDFS支持,并且需要在Flink集群的机器上安装Hadoop(无需启动)并配置环境变量。下面我将详细介绍Flink在HDFS上配置Checkpoint和HA的步骤和原理。 ### 1. Flink Checkpoint 到 HDFS 的配置 CheckpointFlink实现容错的核心机制,定期将任务状态持久化到外部存储系统(如HDFS)中。当任务失败时,可以从最近一次Checkpoint恢复状态。配置到HDFS的步骤如下: #### 1.1 配置HDFS路径 在`flink-conf.yaml`中设置Checkpoint存储目录为HDFS路径: ```yaml # 设置Checkpoint存储目录 state.checkpoints.dir: hdfs://namenode:8020/flink/checkpoints # 可选:设置Savepoint的默认目录(Savepoint是手动触发的Checkpoint) state.savepoints.dir: hdfs://namenode:8020/flink/savepoints ``` #### 1.2 在代码中启用CheckpointFlink应用程序中,需要设置Checkpoint的间隔时间和模式(精确一次或至少一次): ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 每10秒触发一次Checkpoint env.enableCheckpointing(10000); // 设置Checkpoint模式为精确一次(EXACTLY_ONCE) CheckpointConfig checkpointConfig = env.getCheckpointConfig(); checkpointConfig.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE); // 设置Checkpoint超时时间 checkpointConfig.setCheckpointTimeout(60000); // 设置两次Checkpoint之间的最小间隔时间,防止过于频繁 checkpointConfig.setMinPauseBetweenCheckpoints(500); // 设置最大同时进行的Checkpoint数量 checkpointConfig.setMaxConcurrentCheckpoints(1); // 开启外部化Checkpoint,这样在作业取消后Checkpoint不会被删除 checkpointConfig.enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION); ``` #### 1.3 依赖Hadoop HDFS Flink需要能够访问HDFS,因此需要在Flink的`lib`目录下添加Hadoop依赖。根据Hadoop版本选择对应的依赖包(如`flink-shaded-hadoop-3-uber.jar`)。同时,确保所有Flink节点(包括JobManager和TaskManager)都能访问HDFS集群。 ### 2. 高可用(HA)配置 Flink HA集群允许多个JobManager实例,其中一个作为Leader,其余作为Standby。当Leader失败时,Standby实例会接管工作。HA需要ZooKeeper来协调选举,以及HDFS来存储JobManager的元数据和状态。 #### 2.1 配置ZooKeeper 在`flink-conf.yaml`中配置ZooKeeper: ```yaml # 开启HA模式 high-availability: zookeeper # 设置HA存储路径(HDFS路径) high-availability.storageDir: hdfs://namenode:8020/flink/ha # 配置ZooKeeper集群地址 high-availability.zookeeper.quorum: zk1:2181,zk2:2181,zk3:2181 # 可选:设置ZooKeeper根节点 high-availability.zookeeper.path.root: /flink # 设置集群ID(每个Flink集群一个唯一的ID) high-availability.cluster-id: /cluster_one ``` #### 2.2 配置JobManager HA 配置多个JobManager节点(如引用[2]中的集群规划,节点r3, s3, s4): - 在`masters`文件中指定所有JobManager的主机和端口: ``` r3:8081 s3:8081 s4:8081 ``` - 启动集群时,Flink会启动多个JobManager,并通过ZooKeeper选举Leader。 #### 2.3 配置TaskManager TaskManager只需配置连接到JobManager的地址(实际连接时会通过ZooKeeper获取当前Leader地址): ```yaml # 在flink-conf.yaml中,TaskManager配置连接到JobManager的RPC地址 jobmanager.rpc.address: r3 # 初始地址,但HA下实际会通过ZK获取Leader ``` #### 2.4 配置Hadoop环境 根据引用[1],在Flink集群的每台机器上安装Hadoop(无需启动),并配置环境变量: - 下载与HDFS集群版本匹配的Hadoop包,解压到Flink机器上。 - 配置环境变量(例如在`~/.bashrc`中): ```bash export HADOOP_HOME=/path/to/hadoop export PATH=$PATH:$HADOOP_HOME/bin ``` - 将Hadoop配置文件(如`core-site.xml`和`hdfs-site.xml`)放到Flink的`conf/`目录下,或者设置`HADOOP_CONF_DIR`环境变量指向Hadoop的配置目录。 ### 3. 验证HA和Checkpoint - **启动集群**:在Flink安装目录下运行`./bin/start-cluster.sh`(Standalone模式)。 - **提交作业**:提交一个作业并触发Checkpoint- **模拟失败**:手动杀死当前的JobManager Leader,观察Standby JobManager是否接管作业,并从最近的Checkpoint恢复。 ### 关键要点 - **Checkpoint与HA的关系**:HA机制保障了JobManager的故障转移,而Checkpoint保障了TaskManager状态的可恢复性。两者结合实现端到端的容错。 - **HDFS的作用**: - 存储Checkpoint和Savepoint数据。 - 存储HA所需的元数据(如JobGraph、恢复所需的Checkpoint路径)。 - **ZooKeeper的作用**:负责选举Leader JobManager,并存储少量集群状态(如当前Leader地址)。 ### 常见问题排查 1. **无法访问HDFS**:确保Flink集群所有节点都有Hadoop客户端配置,且网络连通。 2. **ZooKeeper连接失败**:检查`high-availability.zookeeper.quorum`配置和防火墙设置。 3. **Checkpoint失败**:检查HDFS目录权限,以及TaskManager是否有足够资源(如内存)。 §§相关问题§§ 1. Flink Checkpoint 和 Savepoint 有什么区别? 2. 如何监控和调试 FlinkCheckpoint 过程? 3. 在HA集群中,如何手动触发故障转移? [^1]: 引用自安装Flink 1.18 Standalone高可用HA集群并配置HDFS的说明。 [^2]: 引用自Flink实战 - 搭建HA高可用集群的集群规划部分。 </think>### Flink 在 HDFS 上实现 Checkpoint 与高可用(HA)详解 Flink 利用 HDFS 实现 **Checkpoint(状态快照)** 和 **高可用(HA)** 是其容错机制的核心。下面从原理到实践详细说明: --- ### 一、Checkpoint 在 HDFS 上的工作原理 #### 1. **Checkpoint 流程** - **触发机制**:JobManager 定期(如每 10 秒)向所有 TaskManager 发送 Checkpoint 触发信号。 - **状态快照**:TaskManager 将算子状态(如窗口数据、Kafka 消费位点)异步写入 **HDFS**。 - **一致性保障**:使用 **Chandy-Lamport 算法** 确保分布式状态的一致性[^1]。 - **元数据保存**:Checkpoint 的元数据(路径、大小、时间戳)存入 HDFS。 #### 2. **HDFS 配置关键项** 在 `flink-conf.yaml` 中配置: ```yaml # 设置 Checkpoint 存储到 HDFS state.backend: filesystem state.checkpoints.dir: hdfs://namenode:8020/flink/checkpoints # 设置 Savepoint 目录(手动触发的 Checkpoint) state.savepoints.dir: hdfs://namenode:8020/flink/savepoints # Checkpoint 间隔(毫秒) execution.checkpointing.interval: 10000 ``` #### 3. **目录结构示例** ```bash hdfs://namenode:8020/flink/checkpoints ├── job-id-1 │ ├── chk-1000 # Checkpoint 数据 │ ├── chk-1001 │ └── _metadata # 元数据文件 └── job-id-2 ``` --- ### 二、高可用(HA)实现机制 #### 1. **HA 核心组件** - **ZooKeeper**:负责选举主 JobManager 和存储集群状态。 - **HDFS**:持久化 JobManager 的元数据(如 JobGraph、恢复点路径)[^1][^2]。 #### 2. **配置步骤(以 Standalone HA 集群为例)** **步骤 1:修改 `flink-conf.yaml`** ```yaml # 启用 ZooKeeper HA high-availability: zookeeper high-availability.storageDir: hdfs://namenode:8020/flink/ha # ZooKeeper 集群地址 high-availability.zookeeper.quorum: zk1:2181,zk2:2181,zk3:2181 # 集群唯一 ID high-availability.cluster-id: /flink-cluster ``` **步骤 2:修改 `masters` 文件** 指定所有 JobManager 节点(至少两个): ``` node1:8081 node2:8081 ``` **步骤 3:配置 Hadoop 环境**(关键!) - 在所有 Flink 节点安装 Hadoop 客户端(无需启动服务)。 - 配置环境变量: ```bash export HADOOP_HOME=/path/to/hadoop export HADOOP_CLASSPATH=`$HADOOP_HOME/bin/hadoop classpath` ``` - 将 Hadoop 配置文件(`core-site.xml`, `hdfs-site.xml`)放入 Flink 的 `conf/` 目录[^1]。 **步骤 4:启动集群** ```bash ./bin/start-cluster.sh # 自动激活主 JobManager 和备用节点 ``` --- ### 三、故障恢复流程 1. **JobManager 故障** - ZooKeeper 选举新的主 JobManager。 - 新 JobManager 从 HDFS 的 `high-availability.storageDir` 加载元数据。 - 从最近一次 Checkpoint 恢复任务状态。 2. **TaskManager 故障** - JobManager 重新调度受影响的任务到健康节点。 - 使用 HDFS 上的 Checkpoint 数据恢复状态。 --- ### 四、最佳实践与优化 1. **Checkpoint 调优** - 调整间隔:业务容忍度 vs 恢复速度。 - 增量 Checkpoint:仅保存变化部分,减少写入量: ```yaml state.backend.incremental: true ``` - 对齐超时:避免背压阻塞 Checkpoint: ```yaml execution.checkpointing.aligned-checkpoint-timeout: 60000 ``` 2. **HDFS 优化** - 使用高可用 HDFS 集群(多 NameNode)。 - 设置副本数(默认 3): ```xml <!-- hdfs-site.xml --> <property> <name>dfs.replication</name> <value>3</value> </property> ``` 3. **ZooKeeper 容错** - 部署至少 3 个节点,避免脑裂问题- 监控会话超时时间: ```yaml high-availability.zookeeper.session-timeout: 60000 ``` --- ### 五、验证方法 1. **手动触发 Checkpoint** ```bash ./bin/flink savepoint <job-id> hdfs://... # 生成 Savepoint ``` 2. **模拟故障恢复** - 杀死主 JobManager:观察备用节点是否接管。 - 重启任务:指定 Savepoint 路径恢复: ```bash ./bin/flink run -s hdfs://.../savepoint-1 app.jar ``` --- ### 关键总结 - **HDFS 作用**:存储 Checkpoint 数据 + HA 元数据,保障持久性。 - **ZooKeeper 作用**:协调主节点选举,保障连续性。 - **确保成功**:Hadoop 环境配置是核心(依赖 + 配置文件)[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值