Elasticsearch CDC Pipeline Sink Connector 用于将火山引擎流式计算 Flink 版 Pipeline 作业捕获的 Insert、Update 和 Delete 事件持续写入 Elasticsearch。通过稳定的主键和文档 ID,可以构建面向检索、分析和在线查询的实时索引。
类别 | 详情 |
|---|---|
支持类型 | Sink |
作业类型 | Flink CDC Pipeline YAML |
运行模式 | 流模式 |
支持的变更类型 | INSERT、UPDATE、DELETE;Schema 事件仅更新 Connector 内部序列化 Schema |
数据格式 | Elasticsearch JSON Document |
交付方式 | 通过 Flink CDC Pipeline 作业使用 |
交付语义 | At-Least-Once |
组件 | 支持版本 | 说明 |
|---|---|---|
火山引擎流式计算 Flink 版 |
| 仅支持这两个 Flink 版本。 |
Flink CDC | 3.4.0及以上版本 | 当前产品能力以社区 3.4.0 版本为基线。 |
Elasticsearch | 6.x、7.x、8.x |
|
route 将一张或多张源表映射到指定索引。keytool 生成 Java TrustStore 的环境。record.size.max.bytes;批量大小同时受记录数、总字节数和缓冲时间控制。inflight.requests.max、buffered.requests.max、batch.size.max.bytes、record.size.max.bytes。batch.size.max、buffer.time.max.ms。sharding.suffix.key。社区 3.4 的 Delete 请求仍写向未添加后缀的索引,无法正确删除后缀索引中的文档。sharding.suffix.key 时,分片字段在文档生命周期内必须保持不变。字段值改变会在新的后缀索引写入文档,旧索引中的文档不会自动删除。source: type: <source_type> # Source 参数 sink: type: elasticsearch hosts: https://<elasticsearch_endpoint>:9200 version: 8 username: ${secret_values.es-username} password: ${secret_values.es-password} route: - source-table: <source_database>.<source_table> sink-table: <target_index> pipeline: name: <pipeline_name> parallelism: 2
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| Pipeline Sink 类型。 | STRING | 是 | 无 | 固定为 |
| Sink 名称。 | STRING | 否 | 无 | 用于区分 Pipeline 中的算子。 |
| Elasticsearch 连接地址。 | STRING | 是 | 无 | 多个地址使用英文逗号分隔。 |
| Elasticsearch 大版本。 | INTEGER | 否 |
| 可选 |
| Basic Auth 用户名。 | STRING | 否 | 无 | 建议引用 Flink 加密变量。 |
| Basic Auth 密码。 | STRING | 否 | 无 | 建议引用 Flink 加密变量。 |
| 每个 Bulk 请求最多包含的操作数。 | INTEGER | 否 |
| 配置为 |
| Sink 最多并发执行的请求数。 | INTEGER | 否 |
| 社区 3.4 中仅对 Elasticsearch 8.x 生效。 |
| 内存缓冲区最多保存的请求数。 | INTEGER | 否 |
| 社区 3.4 中仅对 Elasticsearch 8.x 生效。 |
| 单个批次允许的最大字节数。 | LONG | 否 |
| 社区 3.4 中仅对 Elasticsearch 8.x 生效。 |
| 未满批次的最长等待时间。 | LONG | 否 |
| 单位为毫秒。 |
| 单条记录允许的最大字节数。 | LONG | 否 |
| 社区 3.4 中仅对 Elasticsearch 8.x 生效。 |
| 为指定表配置分片后缀字段。 | STRING | 否 | 无 | 格式为 |
| 索引名与分片后缀之间的分隔符。 | STRING | 否 | — | 与 |
Elasticsearch Sink 先将 Flink CDC 数据序列化为 JSON,再写入目标索引。下表描述的是 CDC 类型到 JSON 值的映射,不等同于 Elasticsearch Mapping 类型。
Flink CDC 类型 | JSON 值类型或格式 | 说明 |
|---|---|---|
TINYINT / SMALLINT / INT / BIGINT | NUMBER | — |
FLOAT / DOUBLE | NUMBER | — |
DECIMAL(p, s) | STRING | 目标 Mapping 应按实际查询需求配置。 |
BOOLEAN | BOOLEAN | — |
DATE | STRING | 格式为 |
TIMESTAMP / TIMESTAMP_LTZ | STRING | UTC 日期时间字符串。 |
CHAR(n) / VARCHAR(n) | STRING | — |
ARRAY | ARRAY | 元素类型需与 Mapping 兼容。 |
MAP / ROW | STRING | 序列化为 JSON 字符串。 |
以下示例将 MySQL 表 <source_database>.<source_table> 的全量和增量数据写入 <target_index>:
source: type: mysql hostname: <mysql_host> port: 3306 username: ${secret_values.mysql-username} password: ${secret_values.mysql-password} tables: <source_database>.<source_table> server-id: 5400-5404 sink: type: elasticsearch name: Elasticsearch Sink hosts: https://<elasticsearch_endpoint>:9200 version: 8 username: ${secret_values.es-username} password: ${secret_values.es-password} batch.size.max: 500 batch.size.max.bytes: 5242880 buffer.time.max.ms: 5000 record.size.max.bytes: 10485760 route: - source-table: <source_database>.<source_table> sink-table: <target_index> description: Route source table to Elasticsearch index pipeline: name: <pipeline_name> parallelism: 2
version 必须与 Elasticsearch 集群大版本一致。未配置 route 时,默认索引名为源表完整 TableId,即 namespace.schemaName.tableName;生产环境建议显式配置目标索引。
预期结果: 全量阶段将源表已有数据写入目标索引;增量阶段持续处理新增、更新和删除事件。同一主键的更新覆盖原文档,删除事件删除相同文档 ID 的文档。
以下配置方式尚未在当前产品环境完成验证。正式使用前,请先在测试作业中验证 TrustStore 文件的分发路径和 JVM 参数。
ca.cer。keytool -importcert \ -alias es-ca \ -file ca.cer \ -keystore es-truststore.jks \ -storepass changeit \ -noprompt
es-truststore.jks 放入 Flink 作业依赖目录,与 Connector JAR 同级,并确保该文件随作业一起分发。env.java.opts: -Djavax.net.ssl.trustStore=/opt/tiger/workdir/es-truststore.jks -Djavax.net.ssl.trustStorePassword=changeit
生产环境应将示例密码 changeit 替换为自定义强密码,并同步修改生成 TrustStore 和 env.java.opts 时使用的密码。修改后重启作业,使 JVM 参数生效。
Source 读取存量数据和增量变更,Transform 完成字段投影、过滤或类型调整,Route 将源表映射到目标索引,Elasticsearch Sink 将行变更序列化为 JSON 文档并执行写入或删除。
Insert 和 Update 使用源表主键生成稳定文档 ID,故障恢复期间的重复写入可以覆盖同一文档。Delete 使用相同文档 ID 删除目标文档。Connector 采用 At-Least-Once 语义,正确处理更新、删除和恢复的前提是主键及 Route 规则保持稳定。
Schema 事件只更新 Connector 的内部序列化 Schema,不修改 Elasticsearch Mapping。新增字段能否被目标索引接受取决于现有 Mapping 和动态 Mapping 配置;生产环境应先调整索引模板或 Mapping,再放行 Schema 变更。
mapper_parsing_exception。现象 | 可能原因 | 处理建议 |
|---|---|---|
出现 | 目标 Mapping 与实际 JSON 值不兼容。 | 检查源字段类型、Transform 结果和目标 Mapping;生产环境使用显式索引模板或预创建 Mapping。 |
删除事件没有生效 | 源端未产生 Delete,或主键、Route、文档 ID 规则发生变化。 | 核对源端事件及作业版本间的主键和 Route 配置;同时确认未使用 |
恢复后出现重复文档 | 源表没有稳定主键,或文档 ID 规则发生变化。 | 使用稳定、非空的源表主键,并保持 Route 不变。 |
目标索引不存在 | Connector 不自动创建 Elasticsearch 索引。 | 预先创建目标索引和 Mapping 后重新启动作业。 |
新增字段后 Mapping 没有更新 | MetadataApplier 不执行 Mapping 变更。 | 先更新索引模板或 Mapping,再放行相应 Schema 变更。 |
HTTPS 报证书信任错误 | TrustStore 未正确分发,或路径、密码不一致。 | 检查 |
sharding.suffix.key。