HBase CDC Pipeline Sink Connector 用于将火山引擎流式计算 Flink 版 Pipeline 作业捕获的全量数据和增量变更持续写入 HBase。每张源表会按表名模板路由到一张独立的 HBase 表。
类别 | 详情 |
|---|---|
支持类型 | Sink |
作业类型 | Flink CDC Pipeline YAML |
运行模式 | 流模式 |
支持的变更类型 | INSERT、UPDATE、DELETE、自动创建 namespace/表/列族;支持新增列和重命名列,忽略 |
数据格式 | HBase row key、列族和 qualifier,字段值以 |
组件形式 | 平台内置,无需上传额外 Connector JAR |
交付语义 | At-Least-Once;依赖稳定 row key 的幂等写入使结果收敛 |
组件 | 支持版本 | 说明 |
|---|---|---|
火山引擎流式计算 Flink 版 |
| Connector 已由平台内置。 |
Flink CDC | 3.4.0 及以上版本 | 创建 Pipeline 作业时选择 3.4.0 或以上版本。 |
HBase |
| 原则上支持火山引擎 HBase 和自建 HBase;根据目标集群版本分别使用 |
rowkey.fields 显式选择一个或多个字段构造 row key。properties.* 传递 HBase 客户端配置。rowkey.fields。rowkey.fields 时使用源表主键。DROP_TABLE 和 TRUNCATE_TABLE 事件会被忽略,不会删除或清空 HBase 目标表。type 参数匹配。zookeeper.znode.parent 设置为目标实例实际使用的父路径,例如 /hbase/hb-cnxxxxxxxxxxxxxx,不能直接沿用默认值 /hbase。source: type: <source_type> # Source 参数 sink: type: hbase-2.3 name: HBase Sink zookeeper.quorum: <host1:port,host2:port,host3:port> zookeeper.znode.parent: <hbase_znode_parent> table-name: "${schema}:${table}" column.family: cf rowkey.fields: id pipeline: name: <pipeline_name> parallelism: 2 local-time-zone: Asia/Shanghai
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| Pipeline Sink 类型。 | STRING | 是 | 无 | HBase 2.2 使用 |
| Sink 名称。 | STRING | 否 | 无 | 用于作业拓扑和日志识别。 |
| HBase 集群的 ZooKeeper quorum。 | STRING | 是 | 无 | 多个地址的格式和分隔方式应与 HBase 客户端配置一致。 |
| HBase 在 ZooKeeper 中的根 znode。 | STRING | 条件必填 |
| 连接火山引擎 HBase 时必须填写实例实际路径,例如 |
| 目标 HBase 表名或表名模板。 | STRING | 否 |
| 支持 |
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| 写入普通字段时使用的默认列族。 | STRING | 是 | 无 | 普通字段均写入该列族;字段名使用 |
| 用于构造 row key 的字段列表。 | STRING | 否 | 源表主键字段 | 多个字段以英文逗号分隔。 |
| 拼接多个 row key 字段的分隔符。 | STRING | 否 |
| 避免选择可能出现在字段值中的字符。 |
| 字符串字段为 null 时写入的文本。 | STRING | 否 |
| 仅影响 |
| 字符串值和 row key 使用的字符集。 | STRING | 否 |
| 写入后更改会影响 row key 和字符串解码。 |
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| 触发 flush 的最大缓存大小。 | MEMORY SIZE | 否 |
| 降低该值可减少缓冲数据量,但会增加请求频率。 |
| 触发 flush 的最大 mutation 条数。 | INTEGER | 否 |
| 与大小和时间条件共同生效。 |
| 定时刷新缓存的时间间隔。 | DURATION | 否 |
| 用于刷新未达到大小或条数阈值的 mutation。 |
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| 透传 HBase 客户端配置。 | STRING | 否 | 无 | 参数名去除 |
| 自动建表或建列族时使用的属性。 | STRING | 否 | 无 | 正式开放参数。表级属性直接使用原始 key;列族级属性以 |
HBase 将字段值存储为字节数组。下表描述本 Pipeline Connector 的编码方式,下游程序必须使用相同规则解码。
Flink CDC 类型 | HBase 存储形态 | 说明 |
|---|---|---|
|
| 使用 |
|
| 存储为单个 byte。 |
|
| 使用 |
|
| 使用 |
|
| 使用 |
|
| 使用 |
|
| 使用 |
|
| 使用 |
|
| 写为 |
|
| 写为 |
|
| 写为 |
|
| 按 |
|
| null 使用 |
|
| 原始字节不变。 |
以下示例将 MySQL 中匹配的表同步到对应的 HBase namespace 和表。运行前请替换地址、表名和加密变量名称。
source: type: mysql name: MySQL Source hostname: <mysql_host> port: 3306 username: ${secret_values.mysql-username} password: ${secret_values.mysql-password} tables: <source_database>.<source_table> server-id: 5401-5404 sink: type: hbase-2.3 name: HBase Sink zookeeper.quorum: <zk_host_1:2181,zk_host_2:2181,zk_host_3:2181> # 火山引擎 HBase 请替换为目标实例实际的父路径。 zookeeper.znode.parent: /hbase/hb-cnxxxxxxxxxxxxxx table-name: "${schema}:${table}" column.family: cf rowkey.fields: id rowkey.delimiter: _ charset: UTF-8 sink.buffer-flush.max-size: 2mb sink.buffer-flush.max-rows: 1000 sink.buffer-flush.interval: 1s pipeline: name: MySQL to HBase Pipeline parallelism: 2 local-time-zone: Asia/Shanghai
预期结果:作业进入运行状态后,源端 database 映射为 HBase 的同名 namespace。Connector 会在需要时创建 namespace、目标表或列族。源表数据按 id 构造 row key,并写入 ${schema}:${table} 对应的 HBase 表;普通字段写入 cf 列族,family:qualifier 格式的字段写入其显式指定的列族。源端后续变更会持续同步到相同 row key。
Connector 将源端记录转换为 HBase mutation,并使用缓冲批量提交。达到 sink.buffer-flush.max-size、sink.buffer-flush.max-rows 或 sink.buffer-flush.interval 任一条件时触发刷新。
INSERT 按 row key 写入记录。UPDATE 按 row key 覆盖本次事件涉及的列,不会先删除整行,未参与本次更新的 qualifier 保持不变。DELETE 按 row key 删除整行。UPDATE 修改 row key 字段时,Connector 会按新的 row key 写入数据,但不会删除旧 row key。
源端 database 映射为 HBase 的同名 namespace;namespace、目标表或列族不存在时,Connector 会动态创建对应资源。新增列会写入新的 qualifier。重命名列会使用新列名写入,但旧 qualifier 不会删除。列类型变化和删除列不会自动修改或清理 HBase 中已有的字段值,作业继续运行。另外不支持DROP_TABLE 和 TRUNCATE_TABLE 事件。
Connector 提供 At-Least-Once 语义,算子不持久化 mutation 缓冲状态。故障恢复后,近期事件可能被重新处理和刷新。使用稳定且唯一的 row key,可以让相同记录的重复覆盖写入收敛;端到端结果仍取决于 DELETE、主键变化和列清理等业务语义。
现象 | 可能原因 | 处理建议 |
|---|---|---|
提示无法构造 row key | 源表无主键,且未配置 | 为源表定义稳定主键,或配置非空且稳定的 |
连接 ZooKeeper 失败 | quorum、端口、znode 配置错误,或资源池网络不可达。 | 核对 |
火山引擎 HBase 连接失败或找不到目标节点 |
| 在实例信息中确认父路径,并配置为类似 |
找不到表或列族 | 作业身份缺少创建权限,或自动创建失败。 | 核对目标 namespace、表、列族和权限;必要时预先创建目标表和列族。 |
同一业务记录出现多个 row key | row key 字段发生变化、字符集或分隔符配置变化。 | 保持 row key 配置稳定,避免修改构成字段;变更前评估历史数据迁移。 |
UPDATE 后旧 qualifier 仍然存在 | UPDATE 只覆盖本次事件涉及的列,不会先删除整行。 | 如果业务要求清理旧 qualifier,应通过源端 DELETE 或单独的数据清理流程处理。 |
重命名字段后同时存在新旧 qualifier | HBase 为 schema-less,重命名不会删除旧 qualifier。 | 在确认旧字段不再使用后,通过独立的数据清理流程删除历史 qualifier。 |
修改主键后出现新旧两条记录 | Connector 按新 row key 写入,但不会删除旧 row key。 | 避免修改 row key 字段;如必须修改,应单独删除旧 row key。 |
时间字段读取结果异常 | 读取端按数值时间戳解码,但 Pipeline Connector 写入的是字符串。 | 按本文日期时间格式以字符串解码,并核对 |
写入延迟升高或请求频率过高 | 缓冲阈值与流量不匹配,或 HBase 出现限流和 Region 热点。 | 联合检查 flush 参数、row key 分布、HBase Region 和客户端指标。 |
rowkey.fields、rowkey.delimiter 或 charset 会改变 row key,可能使同一业务记录写入新行。table-name 模板可能将后续数据路由到新表,变更前应核对实际展开结果。properties.* 和 table.create.properties.* 会直接影响 HBase 客户端或目标表配置,仅使用目标集群已验证的参数。table.create.properties.* 没有适用于所有集群的推荐值,不要直接复制其他集群的表或列族属性。DROP_TABLE、TRUNCATE_TABLE 会被忽略,源端删除或清空表不会同步删除 HBase 目标数据。