ByteHouse CE Pipeline Sink Connector 用于将 Flink CDC Pipeline 产生的全量数据、增量数据变更和表结构变更写入 ByteHouse CE。本 Connector 支持自动创建目标表,并支持在建表时设置 Table Settings。
类别 | 详情 |
|---|---|
支持类型 | Sink |
作业类型 | Flink CDC Pipeline YAML |
运行模式 | 流模式 |
支持的变更类型 | INSERT、UPDATE、DELETE 及 Schema 变更事件 |
写入方式 | 支持批量写入;支持自动建表(本地表 + Distributed 表) |
组件形式 | 平台内置,无需上传额外Connector JAR |
交付语义 | At-Least-Once;建议通过主键 Upsert 和幂等写入使结果收敛 |
组件 | 支持版本 | 说明 |
|---|---|---|
火山引擎流式计算 Flink版 |
| Connector 已由平台内置。 |
Flink CDC | 3.4 版本及以上 | 创建 Pipeline 作业时选择 3.4 或以上版本。 |
ByteHouse CE | ALL | 无明确版本限制 |
sink.mode 配置项来控制新增、更新和删除数据的处理方式。host(API Cluster Discovery Service 地址)、集群名(cluster-name)、火山账号 ID(account-id)、用户名和密码。限制项 | 说明 |
|---|---|
引擎版本 | 仅支持在 Flink 1.16-volcano 及以上引擎版本中使用。 |
主键要求 |
|
DDL 支持 | 不支持 Drop Table 和 Truncate Table:直接收到对应事件也会失败,不会删除或清空目标表。 |
数据类型 | 当前适配器未声明 ROW 等复杂类型,遇到不支持的类型时自动建表会抛出 |
主键列名 | 自动生成 |
ZooKeeper 路径 |
|
以下示例将 MySQL 的 app_db 全库表同步到 ByteHouse CE:
sources: - source: type: mysql name: MySQL Source hostname: mysqlxxxxxxxx.rds.ivolces.com port: 3306 username: your-username password: your-password tables: app_db.\.* server-id: 5100-5104 sink: type: bytehouse-ce name: ByteHouse CE Sink host: xxxxxxxxxx.bytehouse-ce.ivolces.com port: 80 cluster-name: your-ce-cluster account-id: your-account-id username: your-ce-username password: your-password pipeline: name: mysql-to-bytehouse-ce schema.change.behavior: evolve parallelism: 2
说明
如果需要修改目标数据库名或表名,请使用 Pipeline 的 route 或 transform 配置。
参数 | 是否必填 | 默认值 | 类型 | 说明 |
|---|---|---|---|---|
| 必填 | 无 | String | 固定为 |
| 可选 | 无 | String | Pipeline 中展示的 Sink 名称。 |
| 必填 | 无 | String | ByteHouse CE API cluster discovery service 地址,不包含协议路径。 |
| 可选 |
| Integer | Discovery service 端口,默认为 80 端口,一般不需要修改。 |
| 必填 | 无 | String | ByteHouse CE 集群名。 |
| 必填 | 无 | String | 火山账号 id。 |
| 必填 | 无 | String | 连接 ByteHouse CE 的用户名。 |
| 必填 | 无 | String | 连接 ByteHouse CE 的密码。 |
参数 | 是否必填 | 默认值 | 类型 | 说明 |
|---|---|---|---|---|
| 可选 |
| String | 选择 SDK 接收的 RowKind;各模式详见 Sink Mode 选择 章节。 |
| 可选 |
| Duration | 两次批量 flush 的最大间隔,必须大于 0。 |
| 可选 |
| Integer | 触发 flush 的最大缓存行数,必须大于 0。 |
| 可选 |
| Integer | 写入 flush 与 CE metadata client 操作的最大重试次数,必须大于等于 0。 |
| 可选 |
| Duration | SDK Sink Writer 最大重试延迟,不得为负数;生产环境建议配置为正值。 |
| 可选 | 无 | Duration | JDBC 查询超时,配置时必须大于 0。 |
| 可选 | 无 | String | 传给 SDK Sink Writer 的 JDBC 自定义连接设置。 |
| 可选 | 无 | Long | 每个 Sink subtask 每秒最多写入行数,配置时必须大于 0。 |
| 可选 | 无 | String | 追加到写入查询的 ClickHouse query settings。 |
| 可选 |
| String | SDK 生成 query ID 使用的非空前缀。 |
| 可选 |
| String | 支持 |
| 可选 | 无 | Duration | SDK 写入 timestamp 数据时追加的时间偏移,例如 |
说明
Duration 支持 ms、s、min、h 等单位。所有必填字符串都必须为非空值。
说明
Pipeline 序列化器会把 INSERT、UPDATE 和 REPLACE 统一转换为 RowKind.INSERT,把 DELETE 转换为 RowKind.DELETE。SDK 再根据 sink.mode 选择实际接收的记录。
模式 | 接收行为 | Unique Key 要求 | 适用场景 |
|---|---|---|---|
| 仅 INSERT 类记录 | 不要求 | 无主键、仅追加数据。 |
| INSERT + DELETE | 要求 | 默认模式,适合常规 CDC 同步。 |
| 仅 INSERT 类记录 | 要求 | 同步新增与更新,但忽略删除。 |
| 所有 RowKind;当前 Pipeline 实际发出 INSERT 与 DELETE | 要求 | 需要保留 SDK 全 RowKind 能力时使用。 |
| 除 DELETE 外的 RowKind | 要求 | 保留 Upsert,但不下发删除。 |
| INSERT + DELETE;删除时非 key 字段置 NULL | 要求 | 需要以空值表达删除;非 key 字段必须允许 NULL。 |
| 仅 DELETE | 要求 | 专用删除流。 |
注意
有主键的标准 CDC 作业使用默认 upsert模式。无主键表自动建表时需要使用 insert模式。
说明
自动建表参数table.create.enabled 默认开启,系统通过上游DDL,会自动完成在 ByteHouse CE的建表工作。
参数 | 是否必填 | 默认值 | 类型 | 说明 |
|---|---|---|---|---|
| 可选 |
| Boolean | 是否根据 CreateTableEvent 创建缺失的数据库、本地表和 Distributed 表。 |
| 可选 |
| String | 复制表 ZooKeeper 路径模板,必须同时包含 |
| 可选 | 无 | String | 本地表 SETTINGS,多个配置以逗号分隔;引号或配对括号内的逗号会被保留。 |
| 可选 | 无 | String | Distributed 表 SETTINGS,多个配置以逗号分隔。 |
说明
Connector 收到 Create Table 事件后,先检查目标 Distributed 表是否存在;目标表不存在时,自动创建数据库、本地表和 Distributed 表,详情如下。
上游 Schema | 本地表 | Distributed 表 | 约束 |
|---|---|---|---|
有主键 |
| 使用 | 适用于需要 Upsert 或 Delete 的模式; |
无主键 |
| 创建不含基于主键 Sharding 表达式的 Distributed 表 | 仅支持 |
_local,Distributed 表沿用目标表名。PARTITION BY。insert 模式会校验其是否具备 unique key。table.create.enabled: false 时,作业会快速失败。注意
自动建表只根据 Pipeline schema 生成通用物理结构,不会自动调优 TTL、索引、分区粒度、排序或集群拓扑。大表或查询性能敏感表建议预先建表,并设置 table.create.enabled: false。
主要类型映射如下:
Flink CDC 类型 | ByteHouse CE 类型 | 备注 |
|---|---|---|
BOOLEAN | Boolean | 可空类型外层包装为 |
TINYINT | Int8 | |
SMALLINT | Int16 | |
INT | Int32 | |
BIGINT | Int64 | |
FLOAT | Float32 | |
DOUBLE | Float64 | |
DECIMAL(p, s) | Decimal(p, s) |
|
CHAR(n) | FixedString(n) | |
VARCHAR / STRING | String | |
BINARY(n) | BINARY(n) | |
VARBINARY | String | |
DATE | Date | |
TIME(p) | Time(p) | 需确认目标 CE 版本实际支持对应精度。 |
TIMESTAMP / TIMESTAMP_LTZ | DateTime 或 DateTime64(p) | 精度为 0 时为 DateTime,大于 0 时为 DateTime64(p)。 |
ARRAY | Array(T) | 元素类型递归映射。 |
MAP<K,V> | Map(K,V) | 键和值类型递归映射。 |
说明
当前适配器未声明 ROW 等其他复杂类型,遇到不支持类型时自动建表会抛出 UnsupportedOperationException或 SchemaEvolveException。ARRAY、MAP、TIME 以及高精度 Decimal/Timestamp 建议在目标 CE 版本上做端到端写入验证。
以下示例将 MySQL 的 app_db 全库表同步到 ByteHouse CE。运行前请替换 MySQL 连接信息和 ByteHouse CE 连接信息。
sources: - source: type: mysql name: MySQL Source hostname: <mysql-host> port: 3306 username: <mysql-username> password: <mysql-password> tables: app_db.\.* server-id: 5100-5104 sink: type: bytehouse-ce name: ByteHouse CE Sink host: <bytehouse-ce-discovery-host> port: 80 cluster-name: <bytehouse-ce-cluster-name> account-id: <volcengine-account-id> username: <bytehouse-ce-username> password: <bytehouse-ce-password> # 标准 CDC 场景:写入新增、更新和删除记录。 sink.mode: upsert # 目标表不存在时,根据上游 Schema 自动创建。 table.create.enabled: true table.create.settings: index_granularity=8192,enable_unique_partial_update=1 # 攒批与重试参数,可根据吞吐和延迟要求调整。 sink.buffer-flush.interval: 1s sink.buffer-flush.max-rows: 20000 sink.max-retries: 15 jdbc.max-retry-backoff: 32s pipeline: name: mysql-to-bytehouse-ce schema.change.behavior: evolve parallelism: 2
预期结果:
app_db 已有表的数据被批量写入 ByteHouse CE。有主键表自动创建为 HaUniqueMergeTree 本地表并配套 Distributed 表;无主键表自动创建为 HaMergeTree本地表并配套 Distributed 表。RowKind.INSERT 并按主键 Upsert 写入;DELETE 转换为 RowKind.DELETE 并删除对应记录(默认 upsert 模式)。sink.mode: upsert 且目标表具备主键时,同一主键的多次变更会被覆盖更新,目标表最终反映上游的当前状态。无主键表不能使用 Upsert 语义。仅追加场景需要将写入模式改为 insert:
sink: type: bytehouse-ce # 省略连接参数 sink.mode: insert table.create.enabled: true
如果只需同步新增和更新记录,可使用 upsert-no-delete:
sink: type: bytehouse-ce # 省略连接参数 sink.mode: upsert-no-delete
大表或查询性能敏感表建议先在 ByteHouse CE 中完成表结构、分区、排序键、TTL 和索引设计,再关闭自动建表:
sink: type: bytehouse-ce # 省略连接参数 table.create.enabled: false
Connector 将 Pipeline 事件转换为 RowKind 后批量写入 ByteHouse CE,转换规则如下:
上游操作 | Pipeline RowKind | 写入行为 |
|---|---|---|
INSERT |
| 新增记录。 |
UPDATE、REPLACE |
| 按主键 Upsert,覆盖更新同一主键的记录。 |
DELETE |
| 按主键删除对应记录,仅在接收 DELETE 的 |
sink.buffer-flush.interval 与 sink.buffer-flush.max-rows 控制批量 flush 的最大间隔和缓存行数。sink.max-retries 控制写入 flush 与 CE metadata client 操作的最大重试次数,jdbc.max-retry-backoff 控制重试延迟上限。max-rows-per-second 可限制每个 Sink subtask 的写入速率;clickhouse.query.settings 可向写入查询追加 ClickHouse query settings。设置建表参数:
sink: type: bytehouse-ce # 省略连接参数 table.create.enabled: true table.create.settings: index_granularity=8192,enable_unique_key_partial_update=1 table.create.distributed-settings: max_parallel_replicas=2
table.create.settings 应用于本地表,table.create.distributed-settings 应用于 Distributed 表。多个配置以逗号分隔;字符串值需要按 ByteHouse DDL 语法加引号。
也可以通过 transform 为单张表指定 schema options,这些选项会追加到本地表 SETTINGS:
transform: - source-table: app_db.orders projection: "*" table-options: ttl_only_drop_parts=1,index_granularity=8192 description: ByteHouse CE auto-create options
将 Pipeline 配置为 schema.change.behavior: evolve,Sink 接收并处理表结构变更事件(Schema Change Event) 的行为如下:
事件 | 支持情况 | 执行行为 |
|---|---|---|
Create Table | 支持 | 创建缺失的数据库、本地表和 Distributed 表,或校验已存在表的 |
Add Column | 支持 | 添加列。 |
Drop Column | 支持 | 删除列。 |
Rename Column | 支持 | 修改列名。 |
Alter Column Type | 支持 | 修改列类型。 |
Drop Table | 不支持 | 不支持该能力;直接收到事件也会失败,不删除目标表。 |
Truncate Table | 不支持 | 不支持该能力;直接收到事件也会失败,不清空目标表。 |
注意
Schema 变更成功后会使 CE metadata cache 失效,后续数据使用新 schema 序列化。
对不兼容的类型修改、已有物理表限制或账号权限不足等场景,ByteHouse CE 仍可能拒绝 DDL,建议在上线前进行兼容性验证。
sink.max-retries 自动重试;超过重试次数后作业失败,可结合 Flink restart strategy 控制作业级恢复。upsert 模式并为目标表配置主键时,重复 INSERT 会按主键覆盖,目标表最终状态保持一致;insert 追加模式下重复写入可能产生多行。首次使用 ByteHouse CE Pipeline Sink 时,建议使用测试库表和测试集群完成全量同步、增量同步、Schema 演进和故障恢复验证,再应用于生产环境。建议按照以下步骤进行验证:
host、port、cluster-name、account-id、用户名和密码是否正确,并确认 Flink 资源池到 ByteHouse CE discovery service 网络互通。上游 Schema 没有主键,导致 upsert 模式无法自动建表。可通过以下方式解决:
sink.mode: insert(需显式设置,系统不会自动切换);table.create.enabled: false),让任务直接写入已有表。除 insert 外的模式都要求目标表具有 unique key。检查是否误连到普通 MergeTree 表,或改为预建 HaUniqueMergeTree/unique-key 表。
table.create.zookeeper-path 必须同时包含 ${database} 与 ${table}。保留 {shard} 宏可让 CE 为各 shard 解析路径。
自动生成 cityHash64(...) 时 SDK 不为 sharding 表达式里的列名加引号,因此主键列名只能使用字母、数字和下划线,且不能以数字开头。可通过 Transform 规范字段名,或手动建表并关闭自动建表。
CE Connector 不支持以 -1 表示无限重试。请配置大于等于 0 的有限次数,并结合 Flink restart strategy 控制作业级恢复。
先核对 Source 的时区配置、Pipeline 的 local-time-zone 和 ByteHouse 字段类型。仅在确认 SDK 写入需要固定修正时配置 timestamp-offset,不要无条件套用 -8h。
检查 sink.mode 是否为 upsert-no-delete、upsert-all-no-delete 或 insert;这些模式不会把 DELETE 应用为目标表删除。需要同步删除时,将 sink.mode 改为默认 upsert,并确认目标表具备 unique key。
检查 host、port、cluster-name、account-id,以及 Flink 所在网络到 discovery service 的连通性。认证失败时再核对用户名、密码和账号权限。
HaUniqueMergeTree 表引擎相关概念。