生产环境下,应用模式部署flink任务,通过hdfs提交

前言

  通过通过yarn.provided.lib.dirs配置选项指定位置,将flink的依赖上传到hdfs文件管理系统


1. 实践

  (1)生产集群为cdh集群,从cm上下载配置文件,设置环境
在这里插入图片描述

export HADOOP_CONF_DIR=/home/conf/auth
export HADOOP_CLASSPATH=`hadoop classpath`

  (2)上传flink的lib和plugins、自己的jar包到hdfs上

hdfs dfs -put lib/ /flink-dist
hdfs dfs -
<think>我们正在讨论FlinkHDFS上进行Checkpoint以及高可用(HA)的配置。根据用户提供的引用,我们知道Flink HA集群需要HDFS支持,并且需要在Flink集群的机器上安装Hadoop(无需启动)并配置环境变量。下面我将详细介绍FlinkHDFS上配置Checkpoint和HA的步骤和原理。 ### 1. Flink Checkpoint 到 HDFS 的配置 Checkpoint是Flink实现容错的核心机制,定期将任务状态持久化到外部存储系统(如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 在代码中启用Checkpoint 在Flink应用程序中,需要设置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. 如何监控和调试 Flink 的 Checkpoint 过程? 3. 在HA集群中,如何手动触发故障转移? [^1]: 引用自安装Flink 1.18 Standalone高可用HA集群并配置HDFS的说明。 [^2]: 引用自Flink实战 - 搭建HA高可用集群的集群规划部分。 </think>### FlinkHDFS 上实现 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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值