Apache SeaTunnel 中的 Schema Evolution 功能详解
什么是 Schema Evolution
Schema Evolution(模式演进)是数据工程领域的一个重要概念,它指的是数据表结构能够动态变化,而数据同步任务可以自动适应新表结构的变化,无需人工干预其他操作。在 Apache SeaTunnel 中,这一功能使得数据管道能够智能地处理源表和目标表结构的变化,大大简化了数据同步流程的维护工作。
核心特性
支持的引擎
目前 Schema Evolution 功能仅在 Zeta 引擎中得到支持。
支持的模式变更类型
Apache SeaTunnel 能够识别和处理以下四种表结构变更事件:
- ADD COLUMN:新增列
- DROP COLUMN:删除列
- RENAME COLUMN:重命名列
- MODIFY COLUMN:修改列属性
支持的连接器组合
源端连接器
- MySQL CDC
- Oracle CDC
目标端连接器
- JDBC 系列:MySQL、Oracle、PostgreSQL、Dameng、SQL Server
- StarRocks
- Doris
- Paimon
- Elasticsearch
使用注意事项
-
转换限制:目前不支持在不同类型数据库之间(如 Oracle-CDC 到 Jdbc-Mysql)进行模式演进时处理列的默认值。
-
Oracle-CDC 特殊限制:
- 不能使用
SYS
或SYSTEM
用户名修改表结构,否则 DDL 事件会被过滤导致模式演进失效 - 表名以
ORA_TEMP_
开头的表也会遇到同样问题
- 不能使用
-
Dameng 数据库限制:早期版本的 Dameng 数据库不支持将
Varchar
类型字段修改为Text
类型。
启用 Schema Evolution
Schema Evolution 在 CDC 源端默认是禁用的,需要通过配置 schema-changes.enabled = true
来显式启用。这个配置仅适用于 CDC 源端连接器。
配置示例解析
MySQL-CDC 到 Jdbc-Mysql 配置
env {
parallelism = 5
job.mode = "STREAMING"
checkpoint.interval = 5000
}
source {
MySQL-CDC {
server-id = 5652-5657
username = "st_user_source"
password = "mysqlpw"
table-names = ["shop.products"]
base-url = "jdbc:mysql://mysql_cdc_e2e:3306/shop"
schema-changes.enabled = true # 关键配置
}
}
sink {
jdbc {
url = "jdbc:mysql://mysql_cdc_e2e:3306/shop"
driver = "com.mysql.cj.jdbc.Driver"
user = "st_user_sink"
password = "mysqlpw"
generate_sink_sql = true
database = shop
table = mysql_cdc_e2e_sink_table_with_schema_change_exactly_once
primary_keys = ["id"]
is_exactly_once = true
xa_data_source_class_name = "com.mysql.cj.jdbc.MysqlXADataSource"
}
}
这个配置展示了如何设置一个从 MySQL 到 MySQL 的 CDC 同步任务,并启用了 Schema Evolution 功能。当源表结构发生变化时,目标表会自动同步这些变化。
Oracle-CDC 到 StarRocks 配置
sink {
StarRocks {
nodeUrls = ["starrocks_cdc_e2e:8030"]
username = "root"
password = ""
database = "shop"
table = "${table_name}"
schema_save_mode="RECREATE_SCHEMA"
data_save_mode="DROP_DATA"
save_mode_create_template = """
CREATE TABLE IF NOT EXISTS shop.`${table_name}` (
${rowtype_primary_key},
${rowtype_fields}
) ENGINE=OLAP
PRIMARY KEY (${rowtype_primary_key})
DISTRIBUTED BY HASH (${rowtype_primary_key})
PROPERTIES (
"replication_num" = "1",
"in_memory" = "false",
"enable_persistent_index" = "true",
"replicated_storage" = "true",
"compression" = "LZ4"
)
"""
}
}
这个示例展示了如何配置 StarRocks 作为目标端,并提供了表创建模板。当源表结构变化时,StarRocks 表会按照模板重新创建。
最佳实践建议
-
测试环境验证:在生产环境使用前,先在测试环境验证 Schema Evolution 的行为是否符合预期。
-
监控机制:建立完善的监控机制,及时发现和处理模式变更可能引发的问题。
-
版本兼容性:注意不同数据库版本对模式变更的支持程度可能不同。
-
备份策略:在进行重大模式变更前,建议先备份数据。
-
性能考量:频繁的模式变更可能会影响同步性能,需要评估业务需求。
通过合理配置 Apache SeaTunnel 的 Schema Evolution 功能,可以显著降低数据同步任务的维护成本,提高数据管道的灵活性和可靠性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考