You need to enable JavaScript to run this app.
文档中心
流式计算 Flink版

流式计算 Flink版

复制全文
下载 pdf
CDC Connector 参考
HBase(公测中)
复制全文
下载 pdf
HBase(公测中)

HBase CDC Pipeline Sink Connector 用于将火山引擎流式计算 Flink 版 Pipeline 作业捕获的全量数据和增量变更持续写入 HBase。每张源表会按表名模板路由到一张独立的 HBase 表。

功能概述

类别

详情

支持类型

Sink

作业类型

Flink CDC Pipeline YAML

运行模式

流模式

支持的变更类型

INSERT、UPDATE、DELETE、自动创建 namespace/表/列族;支持新增列和重命名列,忽略 DROP_TABLE、TRUNCATE_TABLE

数据格式

HBase row key、列族和 qualifier,字段值以 byte[] 存储

组件形式

平台内置,无需上传额外 Connector JAR

交付语义

At-Least-Once;依赖稳定 row key 的幂等写入使结果收敛

版本兼容性

组件

支持版本

说明

火山引擎流式计算 Flink 版

  • 1.16
  • 1.20

Connector 已由平台内置。

Flink CDC

3.4.0 及以上版本

创建 Pipeline 作业时选择 3.4.0 或以上版本。

HBase

  • 2.2
  • 2.3

原则上支持火山引擎 HBase 和自建 HBase;根据目标集群版本分别使用 hbase-2.2 或 hbase-2.3。

特色功能

  • 多表同步:每张源表可按模板路由到独立的 HBase namespace 和表。
  • row key 映射:可使用源表主键,或通过 rowkey.fields 显式选择一个或多个字段构造 row key。
  • 自动资源准备:源端 database 映射为 HBase 的同名 namespace;namespace、表或列族不存在时,Connector 会动态创建对应资源。
  • 批量写入:通过大小、条数和时间间隔控制 mutation 缓冲刷新。
  • 客户端参数透传:通过 properties.* 传递 HBase 客户端配置。

前提条件

  1. 已准备可访问的 HBase 2.2 或 2.3 集群,并取得 ZooKeeper quorum 和根 znode。原则上支持火山引擎 HBase 和自建 HBase。
  2. Flink 资源池与 HBase ZooKeeper、RegionServer 之间网络可达。
  3. 已为作业身份授予创建 HBase namespace、表和列族所需的权限,或已预先创建目标资源。
  4. 每张源表已定义主键,或已选择稳定、唯一且非空的字段配置 rowkey.fields。
  5. 已确认目标表名模板不会使不同源表写入同一张 HBase 表。

使用限制

  • Connector 仅支持作为 Flink CDC Pipeline Sink。
  • 源表必须存在可用于构造 row key 的字段;未配置 rowkey.fields 时使用源表主键。
  • 多字段 row key 通过分隔符拼接。字段内容本身包含分隔符时可能造成歧义,应选择不会出现在字段值中的分隔符。
  • Connector 使用 At-Least-Once 语义。故障恢复时近期事件可能被重新写入,稳定 row key 可使覆盖写入结果收敛。
  • UPDATE 只覆盖本次事件涉及的列,不会先删除 row key 对应的整行;未参与本次更新的 qualifier 保持不变。
  • DELETE 会按 row key 删除整行。
  • DROP_TABLE 和 TRUNCATE_TABLE 事件会被忽略,不会删除或清空 HBase 目标表。
  • HBase 的列为 schema-less。列类型变化和删除列不会自动清理 HBase 中已有的历史字节值。
  • 数据写入前目标列族必须已经存在。可以预先创建,也可以由 Connector 在列族不存在时动态创建。
  • 默认情况下,源端 database 映射为 HBase 的同名 namespace;namespace 不存在时 Connector 会自动创建。
  • 重命名列会使用新列名写入数据,但旧列名对应的 qualifier 不会自动删除。
  • 修改用于构造 row key 的字段时,旧 row key 对应的数据会保留,可能形成新旧两行。
  • HBase 版本必须与 type 参数匹配。
  • 连接火山引擎 HBase 时,必须将 zookeeper.znode.parent 设置为目标实例实际使用的父路径,例如 /hbase/hb-cnxxxxxxxxxxxxxx,不能直接沿用默认值 /hbase。
  • 日期时间字段的编码方式与 Flink SQL HBase Connector 不同,读取端必须按本文的 Pipeline Connector 映射解码。

语法结构

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

参数说明

连接与路由参数

参数

说明

数据类型

是否必填

默认值

备注

type

Pipeline Sink 类型。

STRING

是

无

HBase 2.2 使用 hbase-2.2;HBase 2.3 使用 hbase-2.3。

name

Sink 名称。

STRING

否

无

用于作业拓扑和日志识别。

zookeeper.quorum

HBase 集群的 ZooKeeper quorum。

STRING

是

无

多个地址的格式和分隔方式应与 HBase 客户端配置一致。

zookeeper.znode.parent

HBase 在 ZooKeeper 中的根 znode。

STRING

条件必填

/hbase

连接火山引擎 HBase 时必须填写实例实际路径,例如 /hbase/hb-cnxxxxxxxxxxxxxx;自建 HBase 应与集群配置一致。

table-name

目标 HBase 表名或表名模板。

STRING

否

${schema}:${table}

支持 ${namespace}、${schema}、${table};默认将源端 database 映射为 HBase 的同名 namespace。

row key 与列族参数

参数

说明

数据类型

是否必填

默认值

备注

column.family

写入普通字段时使用的默认列族。

STRING

是

无

普通字段均写入该列族;字段名使用 family:qualifier 时,写入显式指定的列族和 qualifier。

rowkey.fields

用于构造 row key 的字段列表。

STRING

否

源表主键字段

多个字段以英文逗号分隔。

rowkey.delimiter

拼接多个 row key 字段的分隔符。

STRING

否

_

避免选择可能出现在字段值中的字符。

null-string-literal

字符串字段为 null 时写入的文本。

STRING

否

null

仅影响 CHAR、VARCHAR。

charset

字符串值和 row key 使用的字符集。

STRING

否

UTF-8

写入后更改会影响 row key 和字符串解码。

缓冲刷新参数

参数

说明

数据类型

是否必填

默认值

备注

sink.buffer-flush.max-size

触发 flush 的最大缓存大小。

MEMORY SIZE

否

2mb

降低该值可减少缓冲数据量,但会增加请求频率。

sink.buffer-flush.max-rows

触发 flush 的最大 mutation 条数。

INTEGER

否

1000

与大小和时间条件共同生效。

sink.buffer-flush.interval

定时刷新缓存的时间间隔。

DURATION

否

1s

用于刷新未达到大小或条数阈值的 mutation。

透传与建表参数

参数

说明

数据类型

是否必填

默认值

备注

properties.*

透传 HBase 客户端配置。

STRING

否

无

参数名去除 properties. 前缀后传给 HBase 客户端。

table.create.properties.*

自动建表或建列族时使用的属性。

STRING

否

无

正式开放参数。表级属性直接使用原始 key;列族级属性以 <family>. 为前缀。没有通用推荐值,应按目标 HBase 集群要求配置。

类型映射

HBase 将字段值存储为字节数组。下表描述本 Pipeline Connector 的编码方式,下游程序必须使用相同规则解码。

Flink CDC 类型

HBase 存储形态

说明

BOOLEAN

byte[]

使用 Bytes.toBytes(boolean)。

TINYINT

byte[]

存储为单个 byte。

SMALLINT

byte[]

使用 Bytes.toBytes(short)。

INT

byte[]

使用 Bytes.toBytes(int)。

BIGINT

byte[]

使用 Bytes.toBytes(long)。

FLOAT

byte[]

使用 Bytes.toBytes(float)。

DOUBLE

byte[]

使用 Bytes.toBytes(double)。

DECIMAL(p, s)

byte[]

使用 Bytes.toBytes(BigDecimal)。

DATE

byte[]

写为 yyyy-MM-dd 字符串。

TIME

byte[]

写为 HH:mm:ss 字符串。

TIMESTAMP

byte[]

写为 yyyy-MM-dd HH:mm:ss.SSS 字符串。

TIMESTAMP_LTZ、TIMESTAMP_TZ

byte[]

按 pipeline.local-time-zone 转换后写为 yyyy-MM-dd HH:mm:ss.SSS 字符串。

CHAR(n)、VARCHAR(n)

byte[]

null 使用 null-string-literal。

BINARY、VARBINARY

byte[]

原始字节不变。

使用示例

将 MySQL 表同步到 HBase

以下示例将 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。

Schema 事件

源端 database 映射为 HBase 的同名 namespace;namespace、目标表或列族不存在时,Connector 会动态创建对应资源。新增列会写入新的 qualifier。重命名列会使用新列名写入,但旧 qualifier 不会删除。列类型变化和删除列不会自动修改或清理 HBase 中已有的字段值,作业继续运行。另外不支持DROP_TABLE 和 TRUNCATE_TABLE 事件。

Checkpoint 与故障恢复

Connector 提供 At-Least-Once 语义,算子不持久化 mutation 缓冲状态。故障恢复后,近期事件可能被重新处理和刷新。使用稳定且唯一的 row key,可以让相同记录的重复覆盖写入收敛;端到端结果仍取决于 DELETE、主键变化和列清理等业务语义。

常见问题

现象

可能原因

处理建议

提示无法构造 row key

源表无主键,且未配置 rowkey.fields;或所选字段为空。

为源表定义稳定主键,或配置非空且稳定的 rowkey.fields。

连接 ZooKeeper 失败

quorum、端口、znode 配置错误,或资源池网络不可达。

核对 zookeeper.quorum、zookeeper.znode.parent、VPC 和安全组。

火山引擎 HBase 连接失败或找不到目标节点

zookeeper.znode.parent 仍使用默认 /hbase,与实例实际路径不一致。

在实例信息中确认父路径,并配置为类似 /hbase/hb-cnxxxxxxxxxxxxxx 的实际值。

找不到表或列族

作业身份缺少创建权限,或自动创建失败。

核对目标 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 写入的是字符串。

按本文日期时间格式以字符串解码,并核对 pipeline.local-time-zone。

写入延迟升高或请求频率过高

缓冲阈值与流量不匹配,或 HBase 出现限流和 Region 热点。

联合检查 flush 参数、row key 分布、HBase Region 和客户端指标。

注意事项

  • At-Least-Once 可能导致重复写入请求。不要使用不稳定字段或随机值构造 row key。
  • 更改 rowkey.fields、rowkey.delimiter 或 charset 会改变 row key,可能使同一业务记录写入新行。
  • 更改 table-name 模板可能将后续数据路由到新表,变更前应核对实际展开结果。
  • HBase row key 设计会影响 Region 分布和热点。高吞吐场景应在建表前完成 row key 分布评估。
  • properties.* 和 table.create.properties.* 会直接影响 HBase 客户端或目标表配置,仅使用目标集群已验证的参数。
  • table.create.properties.* 没有适用于所有集群的推荐值,不要直接复制其他集群的表或列族属性。
  • 列删除不会自动清理历史 qualifier。若业务要求物理删除历史数据,需要单独制定清理方案。
  • DROP_TABLE、TRUNCATE_TABLE 会被忽略,源端删除或清空表不会同步删除 HBase 目标数据。

相关文档

最近更新时间:2026.07.30 14:20:36
这个页面对您有帮助吗?
有用
有用
无用
无用