Flink MySQL CDC connector 使用注意事项

文章指出了在使用HDFS时遇到的两个问题:一是表名不应包含大写字母,二是表名和库名不应包含点号,因为这可能导致查询失败和文件找不到的错误。问题在执行查询时暴露,如Java异常信息所示,系统尝试访问的大写路径与实际存在的小写路径不匹配。文章还提到了Flink写入和Spark读取时可能遇到的路径不一致问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意事项

  • 表要有主键

  • 库名和表名不能有点号

是个 BUG,估计后续会修复。

  • 表名不能有大写

也是个 BUG,估计后续会修复。

如果表名含有大写的字母,查询时日志可看到如下信息:

java.util.concurrent.ExecutionException: java.io.FileNotFoundException: File does not exist: hdfs://hadoop/user/test/warehouse/test.db/ods_test
	at org.sparkproject.guava.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:552)
	at org.sparkproject.guava.util.concurrent.AbstractFuture.get(AbstractFuture.java:513)
	at org.sparkproject.guava.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:90)
	at org.sparkproject.guava.util.concurrent.Uninterruptibles.getUninterruptibly(Uninterruptibles.java:199)
	at org.sparkproject.guava.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2312)
	at org.sparkproject.guava.cache.LocalCache$Segment.loadSync(LocalCache.java:2278)
	at org.sparkproject.guava.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154)
	at org.sparkproject.guava.cache.LocalCache$Segment.get(LocalCache.java:2044)
	at org.sparkproject.guava.cache.LocalCache.get(LocalCache.java:3952)
	at org.sparkproject.guava.cache.LocalCache$LocalManualCache.get(LocalCache.java:4871)
	at org.apache.spark.sql.catalyst.catalog.SessionCatalog.getCachedPlan(SessionCatalog.scala:158)

而底层 HDFS 路径保持了大写:

2023-05-11 18:18:27,943 INFO  [47] [org.apache.hudi.util.StreamerUtil.initTableIfNotExists(StreamerUtil.java:335)]  - Table [hdfs://hadoop/user/test/warehouse/test.db/ODS_test/ODS_test] already exists, no need to initialize the table
2023-05-11 18:18:27,943 INFO  [47] [org.apache.hudi.util.StreamerUtil.initTableIfNotExists(StreamerUtil.java:337)]  - Table update under base path hdfs://hadoop/user/test/warehouse/test.db/ODS_test
2023-05-11 18:18:27,944 INFO  [47] [org.apache.hudi.common.table.HoodieTableMetaClient.updateTableAndGetMetaClient(HoodieTableMetaClient.java:507)]  - Update hoodie table with basePath hdfs://hadoop/user/test/warehouse/test.db/ODS_test
2023-05-11 18:18:27,949 INFO  [47] [org.apache.hudi.common.table.HoodieTableMetaClient.<init>(HoodieTableMetaClient.java:125)]  - Loading HoodieTableMetaClient from hdfs://hadoop/user/test/warehouse/test.db/ODS_test
2023-05-11 18:18:27,950 INFO  [47] [org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:366)]  - Hadoop UGI authentication : TAUTH
2023-05-11 18:18:27,993 INFO  [47] [org.apache.hudi.common.table.HoodieTableConfig.<init>(HoodieTableConfig.java:295)]  - Loading table properties from hdfs://hadoop/user/test/warehouse/test.db/ODS_test/.hoodie/hoodie.properties
2023-05-11 18:18:28,212 INFO  [47] [org.apache.hudi.common.table.HoodieTableMetaClient.<init>(HoodieTableMetaClient.java:144)]  - Finished Loading Table of type MERGE_ON_READ(version=1, baseFileFormat=PARQUET) from hdfs://hadoop/user/test/warehouse/test.db/ODS_test
2023-05-11 18:18:29,730 INFO  [47] [org.apache.hudi.common.table.HoodieTableMetaClient.updateTableAndGetMetaClient(HoodieTableMetaClient.java:512)]  - Finished update Table of type MERGE_ON_READ from hdfs://hadoop/user/test/warehouse/test.db/ODS_test
Flink写Spark读
hdfs://hadoop/user/test/warehouse/test.db/ODS_testhdfs://hadoop/user/test/warehouse/test.db/ods_test
<think>我们正在讨论Flink MySQL CDC API的使用方法。根据引用[1][2][3],Flink CDC提供了DataStream API和Table/SQL API两种方式来使用MySQL CDC连接器。用户询问的是API使用方法,因此我将重点放在DataStream API和Table/SQL API的代码示例上。 引用[1]提到:Flink CDC支持读取数据库快照并继续读取二进制日志,即使发生故障也能保证一次性处理。同时,它允许在单个作业中监控多个数据库和表,而无需部署Debezium和Kafka。 引用[2]提供了开源地址:https://github.com/ververica/flink-cdc-connectors,我们可以在这里获取连接器。 引用[3]则给出了Flink-CDC的快速入手(以MySQL为例),包括DataStream Source和Table/SQL API的代码示例。 因此,我将从以下方面组织回答: 1. 环境准备(Maven依赖) 2. DataStream API 使用步骤 3. Table/SQL API 使用步骤 4. 常见配置说明 注意:由于用户没有指定具体使用哪种API,我将同时涵盖两种方式。 另外,根据引用[3]中提到的,需要注意FlinkCDCFlink版本的对应关系,因此需要提醒用户注意版本匹配。 最后,生成相关问题。</think>### Flink MySQL CDC API 使用方法指南 基于 Flink 1.18+ 和 MySQL CDC Connector 2.4+,提供两种核心 API 实现方式: --- #### **一、DataStream API 实现**(适合自定义处理逻辑) ```java import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema; import com.ververica.cdc.connectors.mysql.source.MySqlSource; public class MySQLCDCDataStream { public static void main(String[] args) throws Exception { // 1. 创建 CDC Source MySqlSource<String> source = MySqlSource.<String>builder() .hostname("mysql-host") .port(3306) .databaseList("inventory") // 监控的数据库 .tableList("inventory.products") // 监控的表 .username("flink_user") .password("flink_pwd") .deserializer(new JsonDebeziumDeserializationSchema()) // JSON 格式解析 .serverTimeZone("UTC") .serverId("5400-5405") // 唯一ID范围(避免冲突) .scanIncrementalSnapshotEnabled(true) // 启用增量快照(避免锁表) .build(); // 2. 配置执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.enableCheckpointing(3000); // 3秒Checkpoint保证Exactly-Once[^1] // 3. 构建处理流程 env.fromSource(source, WatermarkStrategy.noWatermarks(), "MySQL CDC") .map(json -> { // 自定义处理(如ETL/过滤) JSONObject data = parseJson(json); if ("delete".equals(data.getString("op"))) { return null; // 过滤删除事件 } return data.toString(); }) .print(); // 输出到控制台(可替换为Kafka/JDBC Sink) env.execute("MySQL CDC Streaming Job"); } } ``` **关键特性**: - 支持单作业监控多库多表[^1] - 直接读取全量+增量数据,无需 Debezium/Kafka[^2] - 增量快照避免 `FLUSH TABLES` 锁表[^1] --- #### **二、Table/SQL API 实现**(适合声明式开发) ```sql -- SQL 方式创建 CDC 表 CREATE TABLE products ( id INT PRIMARY KEY, name STRING, price DECIMAL(10,2) ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'mysql-host', 'port' = '3306', 'username' = 'flink_user', 'password' = 'flink_pwd', 'database-name' = 'inventory', 'table-name' = 'products', 'server-time-zone' = 'UTC', 'scan.incremental.snapshot.enabled' = 'true' -- 增量快照 ); -- 实时查询 SELECT * FROM products WHERE price > 100; -- 写入 Kafka INSERT INTO kafka_products SELECT id, UPPER(name), price FROM products; ``` --- #### **三、核心配置参数** | 参数 | 作用 | 示例值 | 是否必填 | |------|------|--------|----------| | `connector` | 连接器类型 | `mysql-cdc` | 是 | | `scan.incremental.snapshot.enabled` | 增量快照 | `true` | 否(默认true) | | `server-id` | CDC 连接唯一ID | `5400-5405` | 否 | | `debezium.snapshot.mode` | 快照模式 | `initial`(全量+增量) | 否 | | `chunk-meta-data.size` | 分块元数据大小 | `8192` | 否 | --- #### **四、部署注意事项** 1. **MySQL 权限配置** ```sql GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'flink_user'@'%'; ``` 2. **版本兼容性** | Flink 版本 | Connector 版本 | |------------|----------------| | 1.13+ | 2.2+ | | 1.16+ | 2.4+(推荐) | 3. **Maven 依赖** ```xml <dependency> <groupId>com.ververica</groupId> <artifactId>flink-connector-mysql-cdc</artifactId> <version>2.4.0</version> <!-- 匹配Flink版本 --> </dependency> ``` --- #### **五、最佳实践** - **增量快照优化**:始终启用 `scan.incremental.snapshot.enabled=true` 避免锁表 - **并行度设置**:每个表分区对应一个并行子任务 - **故障恢复**:启用 Checkpoint 保证 Exactly-Once 语义[^1] - **时区同步**:`server-time-zone` 需与 MySQL 保持一致 > 提示:完整参数见 [官方文档](https://ververica.github.io/flink-cdc-connectors/master/content/connectors/mysql-cdc.html) --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值