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

流式计算 Flink版

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

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版

  • 1.16
  • 1.20

Connector 已由平台内置。

Flink CDC

3.4 版本及以上

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

ByteHouse CE

ALL

无明确版本限制

特色功能
  • 自动建表:目标表不存在时,根据上游表结构创建 ByteHouse CE 本地表和 Distributed 表。
  • 表结构变更同步:支持加列、删列、重命名列、修改列类型的 Schema 演进。
  • 多种写入模式:可通过 sink.mode 配置项来控制新增、更新和删除数据的处理方式。
  • 批量写入与重试:​可配置批量 flush 间隔与行数、最大重试次数、重试退避和写入限速。
  • 主键 Upsert:​有主键表自动创建为 HaUniqueMergeTree,支持按主键更新覆盖和删除。

前提条件
  • 已开通火山引擎流式计算 Flink 版,并创建可用的 Flink 资源池。
  • 已创建 ByteHouse CE 集群,并准备好连接信息:host(API Cluster Discovery Service 地址)、集群名(cluster-name)、火山账号 ID(account-id)、用户名和密码。
  • 已确保 Flink 资源池能够访问 ByteHouse CE Cluster Discovery Service 。
  • 使用自动建表功能时,连接账号需具备创建数据库、本地表和 Distributed 表的权限;目标表已存在时,账号需具备对应表的读写权限。
  • 已配置上游 Source(如 MySQL);upsert/delete 同步场景下,源表需定义稳定、唯一且非空的主键。

使用限制

限制项

说明

引擎版本

仅支持在 Flink 1.16-volcano 及以上引擎版本中使用。

主键要求

upsert、delete 类 sink.mode 要求目标表具备 Unique Key;
无主键表自动建表时只使用 insert。

DDL 支持

不支持 Drop Table 和 Truncate Table:直接收到对应事件也会失败,不会删除或清空目标表。

数据类型

当前适配器未声明 ROW 等复杂类型,遇到不支持的类型时自动建表会抛出 UnsupportedOperationException或 SchemaEvolveException;
ARRAY、MAP、TIME 以及高精度 Decimal/Timestamp 建议在目标 CE 版本上做端到端写入验证。

主键列名

自动生成 cityHash64(主键列...) sharding 表达式时 SDK 不会为列名自动添加引号,主键列名只能使用字母、数字和下划线且不能以数字开头(须匹配 [A-Za-z_][A-Za-z0-9_]*)。

ZooKeeper 路径

table.create.zookeeper-path 必须同时包含 ${database} 和 ${table} 模板变量。

语法结构

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

参数说明

连接与认证参数

参数

是否必填

默认值

类型

说明

type

必填

无

String

固定为 bytehouse-ce。

name

可选

无

String

Pipeline 中展示的 Sink 名称。

host

必填

无

String

ByteHouse CE API cluster discovery service 地址,不包含协议路径。

port

可选

80

Integer

Discovery service 端口,默认为 80 端口,一般不需要修改。

cluster-name

必填

无

String

ByteHouse CE 集群名。

account-id

必填

无

String

火山账号 id。

username

必填

无

String

连接 ByteHouse CE 的用户名。

password

必填

无

String

连接 ByteHouse CE 的密码。

写入与重试参数

参数

是否必填

默认值

类型

说明

sink.mode

可选

upsert

String

选择 SDK 接收的 RowKind;各模式详见 Sink Mode 选择 章节。

sink.buffer-flush.interval

可选

1s

Duration

两次批量 flush 的最大间隔,必须大于 0。

sink.buffer-flush.max-rows

可选

20000

Integer

触发 flush 的最大缓存行数,必须大于 0。

sink.max-retries

可选

15

Integer

写入 flush 与 CE metadata client 操作的最大重试次数,必须大于等于 0。

jdbc.max-retry-backoff

可选

32s

Duration

SDK Sink Writer 最大重试延迟,不得为负数;生产环境建议配置为正值。

jdbc.query.timeout

可选

无

Duration

JDBC 查询超时,配置时必须大于 0。

jdbc.connection.custom-settings

可选

无

String

传给 SDK Sink Writer 的 JDBC 自定义连接设置。

max-rows-per-second

可选

无

Long

每个 Sink subtask 每秒最多写入行数,配置时必须大于 0。

clickhouse.query.settings

可选

无

String

追加到写入查询的 ClickHouse query settings。

clickhouse.query.id-prefix

可选

flink

String

SDK 生成 query ID 使用的非空前缀。

sink.data-validate-mode

可选

passive-throw

String

支持 passive-reject、passive-throw、proactive-reject、proactive-throw。

timestamp-offset

可选

无

Duration

SDK 写入 timestamp 数据时追加的时间偏移,例如 -8h。应先核对 source 时区和 local-time-zone 后再配置。

说明

Duration 支持 ms、s、min、h 等单位。所有必填字符串都必须为非空值。

Sink Mode 选择

说明

Pipeline 序列化器会把 INSERT、UPDATE 和 REPLACE 统一转换为 RowKind.INSERT,把 DELETE 转换为 RowKind.DELETE。SDK 再根据 sink.mode 选择实际接收的记录。

模式

接收行为

Unique Key 要求

适用场景

insert

仅 INSERT 类记录

不要求

无主键、仅追加数据。

upsert

INSERT + DELETE

要求

默认模式,适合常规 CDC 同步。

upsert-no-delete

仅 INSERT 类记录

要求

同步新增与更新,但忽略删除。

upsert-all

所有 RowKind;当前 Pipeline 实际发出 INSERT 与 DELETE

要求

需要保留 SDK 全 RowKind 能力时使用。

upsert-all-no-delete

除 DELETE 外的 RowKind

要求

保留 Upsert,但不下发删除。

upsert-with-delete-to-null

INSERT + DELETE;删除时非 key 字段置 NULL

要求

需要以空值表达删除;非 key 字段必须允许 NULL。

delete-only

仅 DELETE

要求

专用删除流。

注意

有主键的标准 CDC 作业使用默认 upsert模式。无主键表自动建表时需要使用 insert模式。

自动建表参数

说明

自动建表参数table.create.enabled 默认开启,系统通过上游DDL,会自动完成在 ByteHouse CE的建表工作。

参数

是否必填

默认值

类型

说明

table.create.enabled

可选

true

Boolean

是否根据 CreateTableEvent 创建缺失的数据库、本地表和 Distributed 表。

table.create.zookeeper-path

可选

/clickhouse/tables/{shard}/${database}/${table}

String

复制表 ZooKeeper 路径模板,必须同时包含 ${database} 和 ${table};
{shard}、{replica} 为 CE 宏。

table.create.settings

可选

无

String

本地表 SETTINGS,多个配置以逗号分隔;引号或配对括号内的逗号会被保留。
Pipeline schema options 会追加到此列表。

table.create.distributed-settings

可选

无

String

Distributed 表 SETTINGS,多个配置以逗号分隔。

说明

Connector 收到 Create Table 事件后,先检查目标 Distributed 表是否存在;目标表不存在时,自动创建数据库、本地表和 Distributed 表,详情如下。

上游 Schema

本地表

Distributed 表

约束

有主键

HaUniqueMergeTree;
主键同时用于 ORDER BY 和 UNIQUE KEY

使用 cityHash64(主键列...) 作为 Sharding 表达式

适用于需要 Upsert 或 Delete 的模式;
主键列名必须符合命名约束,即匹配[A-Za-z_][A-Za-z0-9_]*

无主键

HaMergeTree;使用 ORDER BY tuple()

创建不含基于主键 Sharding 表达式的 Distributed 表

仅支持 sink.mode: insert;使用 upsert 模式时,自动建表可能会报错:requires a source primary key

  • 本地表名称为目标表名加 _local,Distributed 表沿用目标表名。
  • Pipeline partition key 映射为本地表的 PARTITION BY。
  • Pipeline 表注释与列注释会传入建表 DDL。
  • 目标表已存在时,Connector 跳过创建;非 insert 模式会校验其是否具备 unique key。
  • 目标表不存在且 table.create.enabled: false 时,作业会快速失败。

注意

自动建表只根据 Pipeline schema 生成通用物理结构,不会自动调优 TTL、索引、分区粒度、排序或集群拓扑。大表或查询性能敏感表建议预先建表,并设置 table.create.enabled: false。

类型映射

主要类型映射如下:

Flink CDC 类型

ByteHouse CE 类型

备注

BOOLEAN

Boolean

可空类型外层包装为 Nullable(...)。

TINYINT

Int8

SMALLINT

Int16

INT

Int32

BIGINT

Int64

FLOAT

Float32

DOUBLE

Float64

DECIMAL(p, s)

Decimal(p, s)

DECIMAL(20, 0) 特殊映射为 UInt64。

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 表。
  • 增量阶段:上游 INSERT、UPDATE 转换为 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

RowKind.INSERT

新增记录。

UPDATE、REPLACE

RowKind.INSERT

按主键 Upsert,覆盖更新同一主键的记录。

DELETE

RowKind.DELETE

按主键删除对应记录,仅在接收 DELETE 的 sink.mode 下生效。

  • 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

Schema 事件

将 Pipeline 配置为 schema.change.behavior: evolve,Sink 接收并处理表结构变更事件(Schema Change Event) 的行为如下:

事件

支持情况

执行行为

Create Table

支持

创建缺失的数据库、本地表和 Distributed 表,或校验已存在表的 unique key。

Add Column

支持

添加列。

Drop Column

支持

删除列。

Rename Column

支持

修改列名。

Alter Column Type

支持

修改列类型。

Drop Table

不支持

不支持该能力;直接收到事件也会失败,不删除目标表。

Truncate Table

不支持

不支持该能力;直接收到事件也会失败,不清空目标表。

注意

Schema 变更成功后会使 CE metadata cache 失效,后续数据使用新 schema 序列化。
对不兼容的类型修改、已有物理表限制或账号权限不足等场景,ByteHouse CE 仍可能拒绝 DDL,建议在上线前进行兼容性验证。

Checkpoint 与故障恢复

  • 写入失败时 Connector 按 sink.max-retries 自动重试;超过重试次数后作业失败,可结合 Flink restart strategy 控制作业级恢复。
  • 故障恢复可能导致部分记录被重放,写入链路采用 At-Least-Once 语义。
  • 使用默认 upsert 模式并为目标表配置主键时,重复 INSERT 会按主键覆盖,目标表最终状态保持一致;insert 追加模式下重复写入可能产生多行。

验证与排障

验证方法

首次使用 ByteHouse CE Pipeline Sink 时,建议使用测试库表和测试集群完成全量同步、增量同步、Schema 演进和故障恢复验证,再应用于生产环境。建议按照以下步骤进行验证:

  1. 检查 host、port、cluster-name、account-id、用户名和密码是否正确,并确认 Flink 资源池到 ByteHouse CE discovery service 网络互通。
  2. 确认作业引擎版本为 Flink 1.16-volcano 及以上。
  3. 提交 Pipeline,确认作业进入运行状态,目标数据库和表已自动创建。
  4. 检查全量数据,确认上游已有数据已写入目标表。
  5. 在上游依次执行插入、更新和删除操作,确认下游收到对应变更。
  6. 在上游执行加列或修改列类型,确认 Schema 演进生效。
  7. 等待至少一次 Checkpoint 成功后执行受控重启,确认作业恢复后目标表最终状态一致。

常见问题

默认 upsert 自动建表报“requires a source primary key”

上游 Schema 没有主键,导致 upsert 模式无法自动建表。可通过以下方式解决:

  • 在源表声明中显式指定主键;
  • 将写入模式改为 sink.mode: insert(需显式设置,系统不会自动切换);
  • 提前在 ByteHouse CE 中手动创建带有 unique key 的目标表,并关闭自动建表(table.create.enabled: false),让任务直接写入已有表。

目标表已存在,但报“has no unique key”

除 insert 外的模式都要求目标表具有 unique key。检查是否误连到普通 MergeTree 表,或改为预建 HaUniqueMergeTree/unique-key 表。

ZooKeeper path 校验失败

table.create.zookeeper-path 必须同时包含 ${database} 与 ${table}。保留 {shard} 宏可让 CE 为各 shard 解析路径。

主键列名导致自动建表失败

自动生成 cityHash64(...) 时 SDK 不为 sharding 表达式里的列名加引号,因此主键列名只能使用字母、数字和下划线,且不能以数字开头。可通过 Transform 规范字段名,或手动建表并关闭自动建表。

设置 sink.max-retries: -1 后校验失败

CE Connector 不支持以 -1 表示无限重试。请配置大于等于 0 的有限次数,并结合 Flink restart strategy 控制作业级恢复。

时间字段相差 8 小时

先核对 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。

无法发现 shard 或连接失败

检查 host、port、cluster-name、account-id,以及 Flink 所在网络到 discovery service 的连通性。认证失败时再核对用户名、密码和账号权限。

相关文档
最近更新时间:2026.09.16 12:06:58
这个页面对您有帮助吗?
有用
有用
无用
无用