Iceberg CDC Pipeline Sink Connector 用于将 Flink CDC Pipeline 产生的数据和表结构变更写入 Apache Iceberg 表。Connector 提供普通 Iceberg 和 Iceberg on LAS 两种写入方式,支持目标表不存在时自动建表,并可持续同步具有主键的源表数据。
类别 | 详情 |
|---|---|
Connector 类型 | Flink CDC Pipeline Sink |
普通 Iceberg |
|
Iceberg on LAS |
|
数据同步 | 流式同步 |
交付语义 | At-Least-Once,通过主键表实现幂等写入 |
组件形式 | 平台内置,无需上传额外 Connector JAR |
组件 | 支持版本 | 说明 |
|---|---|---|
火山引擎流式计算 Flink 版 |
| Connector 已由平台内置。 |
Flink CDC | 3.4.0 及以上版本 | 创建 Pipeline 作业时选择 3.4.0 及以上版本。 |
Apache Iceberg | 1.6.1 | 平台内置版本。 |
catalog.properties.* 和 table.properties.* 配置 Iceberg 行为。hive-site.xml,并将该文件作为作业依赖分发。hive-site.xml。该文件不支持产品变量,需限制文件访问权限并避免将其提交到代码仓库。partition.key 仅配置直接分区字段,当前暂不支持 truncate、hour、day、month、year、bucket 等 Partition Transform 写法。hive-site.xml。XML 格式错误、文件未随作业分发或配置路径错误都会导致 Catalog 初始化失败。type 值,不能混用。以下结构使用 Hive Catalog:
source: type: <source_type> name: <source_name> # Source 参数 sink: type: iceberg name: Iceberg Sink catalog.properties.type: hive catalog.properties.uri: thrift://<hive_metastore_host>:<port> catalog.properties.warehouse: tos://<bucket>/<warehouse_path> pipeline: name: <pipeline_name> parallelism: 2
source: type: <source_type> name: <source_name> # Source 参数 sink: type: iceberg-las name: Iceberg LAS Sink catalog.properties.type: hive catalog.properties.uri: ${iceberg_catalog.properties.uri} catalog.properties.warehouse: ${iceberg_catalog.properties.warehouse} catalog.properties.hive-conf-dir: /opt/tiger/workdir pipeline: name: <pipeline_name> parallelism: 2
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| Pipeline Sink 类型。 | STRING | 是 | 无 | 普通 Iceberg 为 |
| Sink 名称。 | STRING | 否 | 无 | 建议使用能够标识目标 Catalog 的名称。 |
| 按目标表设置分区字段。 | STRING | 否 | 无 | 表之间用分号分隔,字段之间用逗号分隔,例如 |
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| Iceberg Catalog 类型。 | STRING | 条件必填 | 无 | 当前经过测试验证的客户场景为 EMR-Hive 和 LAS Catalog。 |
| Catalog Warehouse 根路径。 | STRING | 条件必填 | 无 | EMR-Hive 和 LAS 场景按目标 Catalog 的 Warehouse 路径配置。 |
| Metastore 服务地址。 | STRING | 条件必填 | 无 | Hive Catalog 和 Iceberg on LAS 场景配置。 |
| 透传 Iceberg Catalog 参数。 | STRING | 否 | 无 | 参数名去掉此前缀后传递给 Iceberg Catalog。 |
| 透传 Iceberg Table 参数。 | STRING | 否 | 无 | 仅配置经过验证且与平台内置 Iceberg 版本兼容的参数。 |
以下配置写入随作业分发的 hive-site.xml:
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| 默认 LAS Catalog。 | STRING | 是 | 无 | 例如 |
| 是否连接公有云 LAS 服务。 | BOOLEAN | 是 | 无 | 公有云场景设置为 |
| LAS 服务地域。 | STRING | 是 | 无 | 例如 |
| LAS Metastore 地址。 | STRING | 是 | 无 | 使用目标地域对应的服务地址。 |
| LAS Access Key。 | STRING | 是 | 无 | 直接填写在 |
| LAS Secret Key。 | STRING | 是 | 无 | 直接填写在 |
Flink CDC 类型 | Iceberg 类型 | 说明 |
|---|---|---|
|
| 按整数类型写入。 |
|
| 按整数类型写入。 |
|
| 按整数类型写入。 |
|
| 按整数类型写入。 |
|
| 按单精度浮点类型写入。 |
|
| 按双精度浮点类型写入。 |
|
| 保留精度 |
|
| 按布尔类型写入。 |
|
| 按日期类型写入。 |
|
| 按时间戳类型写入。 |
|
| 结果受 Pipeline 本地时区配置影响。 |
|
| 保留字符长度 |
|
| 保留可变字符长度 |
source: type: mysql name: MySQL Source hostname: <mysql_host> port: 3306 username: ${secret_values.mysql-username} password: ${secret_values.mysql-password} tables: <database_name>.<table_name> server-id: 5401-5404 sink: type: iceberg name: Iceberg Sink catalog.properties.type: hive catalog.properties.uri: thrift://<hive_metastore_host>:9083 catalog.properties.warehouse: tos://<bucket>/<warehouse_path> pipeline: name: MySQL to Iceberg Pipeline parallelism: 2
预期结果:Pipeline 在目标 Catalog 中创建与源表对应的主键表,写入初始快照,并持续应用新增、更新和删除事件。
首先准备 hive-site.xml:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property> <name>metastore.catalog.default</name> <value><las_catalog_name></value> </property> <property> <name>hive.client.las.region.name</name> <value><region></value> </property> <property> <name>hive.metastore.uris</name> <value>thrift://<las_metastore_host>:<port></value> </property> <property> <name>hive.hms.client.is.public.cloud</name> <value>true</value> </property> <property> <name>hive.client.las.ak</name> <value><access_key></value> </property> <property> <name>hive.client.las.sk</name> <value><secret_key></value> </property> </configuration>
将 <access_key>、<secret_key> 替换为真实 LAS AK/SK,再把 hive-site.xml 作为作业依赖上传。该文件不支持变量;catalog.properties.hive-conf-dir 固定为 /opt/tiger/workdir:
source: type: mysql name: MySQL Source hostname: <mysql_host> port: 3306 username: ${secret_values.mysql-username} password: ${secret_values.mysql-password} tables: <database_name>.<table_name> server-id: 5401-5404 sink: type: iceberg-las name: Iceberg LAS Sink catalog.properties.type: hive catalog.properties.uri: ${iceberg_catalog.properties.uri} catalog.properties.warehouse: ${iceberg_catalog.properties.warehouse} catalog.properties.hive-conf-dir: /opt/tiger/workdir pipeline: name: MySQL to Iceberg LAS Pipeline parallelism: 2
预期结果:Pipeline 通过 LAS Metastore 创建或访问目标 Iceberg 表,并将数据文件写入配置的对象存储 Warehouse。
Connector 接收 Source 产生的数据变更和 Schema Change。目标表不存在时,Connector 根据上游表结构创建 Iceberg Format V2 主键表并自动使用 Upsert;目标表存在时,将数据变更写入对应的 Upsert 表。Append 表不受支持。
数据写入采用 At-Least-Once。作业恢复时,同一变更可能被重新提交,Connector 依赖表主键覆盖相同记录以实现幂等。因此,Source 主键必须稳定,且不能在同步过程中产生重复或为空的业务标识。
Schema Evolution 行为与 Flink CDC 3.4 保持一致。可以通过 schema.change.behavior 控制异常、应用、尝试应用、宽松或忽略模式,并通过 include.schema.changes、exclude.schema.changes 过滤具体事件。涉及删除列、清空表或删除表的配置可能造成数据丢失,上线前应进行专项验证。
现象 | 可能原因 | 处理建议 |
|---|---|---|
Catalog 初始化失败 | Catalog 类型、URI 或 Warehouse 配置错误。 | 核对 |
找不到 | 文件未随作业分发,或 | 检查作业依赖和实际运行目录。 |
LAS 鉴权失败 | AK/SK 无效、权限不足或地域配置错误。 | 使用最小权限凭证并核对 LAS 地域、Catalog 与 Metastore 地址。 |
无主键表或 Append 表写入失败 | Source 表没有主键、主键为空,或目标表不是 Upsert 表。 | 使用稳定主键,并写入 Connector 自动创建或兼容的 Format V2 Upsert 表。 |
Schema Change 导致作业失败 | 变更类型不受 Connector 支持。 | 回退 Schema 变更,或先在目标表完成兼容性处理。 |
恢复后观察到重复事件 | At-Least-Once 恢复发生重放。 | 检查目标表主键与幂等写入是否正确生效。 |
hive-site.xml 中直接填写 AK/SK,不支持产品变量。应限制该文件的访问与分发范围,并按组织安全要求定期轮换凭证。catalog.properties.hive-conf-dir 固定为 /opt/tiger/workdir,不要改为本地上传路径或其他运行目录。