实践数据湖iceberg 第二十三课 flink-sql从checkpoint重启

本文详细介绍了如何使用 Flink SQL 从 checkpoint 恢复任务,避免数据重复。通过创建 savepoint,制造并插入变更数据,然后从不同 savepoint 恢复,验证了恢复过程的有效性。测试结果显示,任务能够正确从 checkpoint 恢复,实时 CDC 能捕获新增数据,确保数据一致性。

系列文章目录

实践数据湖iceberg 第一课 入门
实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式
实践数据湖iceberg 第三课 在sqlclient中,以sql方式从kafka读数据到iceberg
实践数据湖iceberg 第四课 在sqlclient中,以sql方式从kafka读数据到iceberg(升级版本到flink1.12.7)
实践数据湖iceberg 第五课 hive catalog特点
实践数据湖iceberg 第六课 从kafka写入到iceberg失败问题 解决
实践数据湖iceberg 第七课 实时写入到iceberg
实践数据湖iceberg 第八课 hive与iceberg集成
实践数据湖iceberg 第九课 合并小文件
实践数据湖iceberg 第十课 快照删除
实践数据湖iceberg 第十一课 测试分区表完整流程(造数、建表、合并、删快照)
实践数据湖iceberg 第十二课 catalog是什么
实践数据湖iceberg 第十三课 metadata比数据文件大很多倍的问题
实践数据湖iceberg 第十四课 元数据合并(解决元数据随时间增加而元数据膨胀的问题)
实践数据湖iceberg 第十五课 spark安装与集成iceberg(jersey包冲突)
实践数据湖iceberg 第十六课 通过spark3打开iceberg的认知之门
实践数据湖iceberg 第十七课 hadoop2.7,spark3 on yarn运行iceberg配置
实践数据湖iceberg 第十八课 多种客户端与iceberg交互启动命令(常用命令)
实践数据湖iceberg 第十九课 flink count iceberg,无结果问题
实践数据湖iceberg 第二十课 flink + iceberg CDC场景(版本问题,测试失败)
实践数据湖iceberg 第二十一课 flink1.13.5 + iceberg0.131 CDC(测试成功INSERT,变更操作失败)
实践数据湖iceberg 第二十二课 flink1.13.5 + iceberg0.131 CDC(CRUD测试成功)
实践数据湖iceberg 第二十三课 flink-sql从checkpoint重启



概要

问题描述:前面测试过,直接重启insert任务,下次消费,会全量数据同步一份,并进行增量的监听。多次重启的话,会有很多重复数据。 本课目的:解决这个问题,下次重启从checkpoint中恢复(测试sql的方式, jar包的方式以前测试过,不想测了)。 本课最后效果:成功测试flink-sql以非jar包的方式从checkpoint重启,完成故障恢复测试

1. savepoint保存

从web ui 中找到jobId, 保存
savepoint保存命令: flink savepoint {jobId} {path}

[root@hadoop101 conf]# flink savepoint 365df9287888864066b89d9f5247f654 hdfs:///tmp/savepoint
Triggering savepoint for job 365df9287888864066b89d9f5247f654.
Waiting for response...
Savepoint completed. Path: hdfs://ns/tmp/savepoint/savepoint-365df9-e6719613365a
You can resume your program from this savepoint with the run command.
[root@hadoop101 conf]# hadoop fs -ls /tmp/savepoint
Found 1 items
drwxr-xr-x   - root supergroup          0 2022-02-23 10:25 /tmp/savepoint/savepoint-365df9-e6719613365a
[root@hadoop101 conf]# hadoop fs -ls /tmp/savepoint/*
Found 1 items
-rw-r--r--   2 root supergroup       6368 2022-02-23 10:25 /tmp/savepoint/savepoint-365df9-e6719613365a/_metadata
[root@hadoop101 conf]# hadoop fs -ls /tmp/savepoint/*/*
-rw-r--r--   2 root supergroup       6368 2022-02-23 10:25 /tmp/savepoint/savepoint-365df9-e6719613365a/_metadata
[root@hadoop101 conf]# hadoop fs -du -h /tmp/savepoint/*/*
6.2 K  /tmp/savepoint/savepoint-365df9-e6719613365a/_metadata
[root@hadoop101 conf]# 

2. 制造变更数据

第一次savepoint的数据:

                                                                                                                              SQL Query Result (Table)                                                                                                                              
 Refresh: 1 s                                                                                                                     Page: Last of 1                                                                                                             Updated: 10:33:35.233 

                              i                        ts_code                         symbol                           name                           area                       industry                      list_date             actural_controller
                              1                      000002.SZ                         000002                            万科A                             深圳                           全国地产                       19910129                        星星之火!!!
                              2                      000004.SZ                         000004                           国华网安                             深圳                           软件服务                       19910114                            三体人
                              0  
你问得非常好,这个问题触及了 Flink 社区在 **1.13 之后对 Connector 架构的重大重构**。 我们来彻底搞清楚: > ❓ **我到底该编译 `flink-connector-elasticsearch7` 还是 `flink-sql-connector-elasticsearch7`?** --- ## ✅ 简短结论(先看答案) | 目标 | 推荐模块 | |------|----------| | ✅ 使用 SQL / Table API 写入 ES(如 Flink SQL Client、DataStream + Table API) | ➡️ `flink-sql-connector-elasticsearch7` | | ✅ 使用老式 DataStream API(`addSink(...)`)写入 ES | ➡️ `flink-connector-elasticsearch7` | 👉 **如果你的目标是通过 Flink SQL 或 Table API 将数据写入 Elasticsearch(绝大多数现代场景),你应该使用并编译:** ### 🟩 `flink-sql-connector-elasticsearch7` 因为它支持: - SQL DDL:`CREATE TABLE ... WITH ('connector' = 'elasticsearch-7', ...)` - 自动集成到 Flink 的 Table/SQL 执行引擎 - 支持 JSON、Debezium、Canal 等格式 - 是官方推荐的“统一 connector 模型”实现 而 `flink-connector-elasticsearch7` 只提供低层级的 DataStream SinkFunction,**不支持直接用 SQL 定义表**。 --- ## 🔍 一、历史演进:为什么有两个名字? | 时间线 | 模块名 | 特点 | |--------|-------|------| | Flink ≤ 1.13 | `flink-connector-elasticsearch7` | 基于 `DataStream.addSink()`,属于旧版连接器 | | Flink ≥ 1.14 | `flink-sql-connector-elasticsearch7` | 基于新的 **Table/SQL Connector API V2**,支持 DDL | 📌 从 Flink 1.14 开始,社区推动所有 connector 向 **统一的 Table API 模型迁移**,所以命名改为 `flink-sql-connector-*`。 --- ## 🧱 二、架构差异详解 ### 1. `flink-connector-elasticsearch7` ```java // 老式写法 —— 必须在 DataStream 中手动添加 ElasticsearchSink.builder<MyType>(...) .setHosts(new HttpHost("localhost", 9200)) .build(); dataStream.addSink(elasticsearchSink); ``` - 属于 **DataStream 层级 API** - 不支持 SQL - 配置必须硬编码或通过 Properties 传入 - 已逐渐被弃用(但仍可运行) --- ### 2. `flink-sql-connector-elasticsearch7` ```sql -- SQL 写法 —— 真正的声明式编程 CREATE TABLE es_table ( id INT, name STRING ) WITH ( 'connector' = 'elasticsearch-7', 'hosts' = 'http://localhost:9200', 'index' = 'users' ); INSERT INTO es_table SELECT * FROM kafka_source; ``` - 支持完整的 **SQL 流批一体处理** - 可与 Kafka、Iceberg、JDBC 等无缝对接 - 支持 Exactly-once、checkpoint 集成 - 是目前唯一被积极维护的版本 --- ## 💡 三、你的目标是什么?—— 回归需求 你说:“为实现我的目的”,但没有说明具体用途。我们根据常见场景判断: | 场景 | 应选模块 | |------|---------| | ✅ 使用 Flink SQL Client 提交任务 | ✅ `flink-sql-connector-elasticsearch7` | | ✅ 使用 Java/Scala 编写 Table API 程序 | ✅ `flink-sql-connector-elasticsearch7` | | ✅ 使用 Python PyFlinkSQL 到 ES | ✅ `flink-sql-connector-elasticsearch7` | | ✅ 在 DataStream 中调用 `.addSink()` | ⚠️ `flink-connector-elasticsearch7` | 👉 绝大多数用户的需求是第一种:**用 SQL 把数据写进 ES**,所以你应该选择: > ### ✅ `flink-sql-connector-elasticsearch7` --- ## 🛠️ 四、如何正确构建 `flink-sql-connector-elasticsearch7` for Flink 1.17.2? 由于官方未发布适配 Flink 1.17 的正式版,你需要自己构建。 ### 步骤如下: #### 1. 克隆主仓库(含 connectors) ```bash git clone https://github.com/apache/flink.git cd flink ``` #### 2. 切换到兼容分支(建议用 `release-1.16.3`) ```bash git checkout release-1.16.3 ``` > 💡 虽然叫 1.16,但它包含了 `flink-sql-connector-elasticsearch7` 模块 #### 3. 修改根 POM 文件中的 Flink 版本 编辑 `pom.xml`,找到: ```xml <flink.version>1.16.3</flink.version> ``` 改为: ```xml <flink.version>1.17.2</flink.version> ``` #### 4. 构建 SQL 版本的 Elasticsearch 7 Connector ```bash mvn clean package -DskipTests \ -pl flink-connectors/flink-sql-connector-elasticsearch7 \ -am \ -Dscala.binary.version=2.12 \ -Drevision=3.0.0-flink1172 ``` ✅ 成功输出: ``` flink-connectors/flink-sql-connector-elasticsearch7/target/flink-sql-connector-elasticsearch7-3.0.0-flink1172.jar ``` #### 5. 放入 `$FLINK_HOME/lib/` 同时确保已有: - `flink-json-1.17.2.jar`(用于解析 JSON 格式) - 或 `flink-formats/flink-json/target/flink-json-1.17.2.jar` --- ## ✅ 最终验证方式 启动 Flink SQL Client: ```bash ./bin/sql-client.sh embedded ``` 执行: ```sql CREATE TABLE es_sink ( id BIGINT, name STRING, ts TIMESTAMP(3) ) WITH ( 'connector' = 'elasticsearch-7', 'hosts' = 'http://localhost:9200', 'index' = 'test_index' ); -- 插入测试数据 INSERT INTO es_sink VALUES (1, 'Alice', CURRENT_TIMESTAMP); ``` ✅ 如果能成功插入数据到 Elasticsearch,说明你的 connector 构建成功! --- ## 📌 总结:回答你的问题 > ❓“我是需要编译 `flink-connector-elasticsearch7` 还是 `flink-sql-connector-elasticsearch7`?” 🟩 **答案是:你应该编译 `flink-sql-connector-elasticsearch7`** 因为: - 它支持 Flink SQL 和 Table API - 是当前唯一被维护的模型 - 更适合生产环境 - 支持声明式配置、格式管理、自动序列化等高级特性 除非你在写非常老的 DataStream 程序,否则不要用 `flink-connector-elasticsearch7` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值