Milvus Flink SQL Sink Connector 用于将火山引擎流式计算 Flink 版作业中的实时或批式计算结果写入向量数据库 Milvus 版。Connector 支持标量、向量、JSON 和 Array 字段,并提供 insert 与 upsert 两种写入语义。
本文仅适用于火山引擎流式计算 Flink 版。Connector 标识符为 milvus,已内置在对应的 Flink 发行版本中,无需额外上传 Maven 依赖或 Connector JAR。
类别 | 详情 |
|---|---|
支持类型 | Sink |
作业类型 | Flink SQL |
运行模式 | 流模式、批模式 |
支持的变更类型 |
|
数据格式 | 无 |
组件形态 | 平台内置,无需独立部署 |
交付语义 | At-Least-Once |
组件 | 支持版本 | 说明 |
|---|---|---|
火山引擎流式计算 Flink 版 |
| 不同版本使用平台内置 Connector。 |
Milvus |
| 不对外展示 Connector 内部使用的 SDK 具体版本。 |
$meta 中,不会修改 Collection 的静态 Schema。partition-name,使 Insert、Upsert 和 Delete 在指定 Partition 内执行。<用户名>:<密码>。upsert 时,DDL 声明一个且仅一个主键,并与 Collection 主键字段一致。建议在流式计算 Flink 版中创建加密变量保存完整 Token,并在 SQL 中通过 ${secret_values.milvus-token} 引用,避免明文保存用户名和密码。
insert 只接受 INSERT;收到 UPDATE 或 DELETE 时作业失败。upsert 接受 INSERT、UPDATE_AFTER 和 DELETE,并忽略 UPDATE_BEFORE;该模式要求单列主键。partition-name 时,目标 Partition 必须预先存在。该参数同时作用于 Insert、Upsert 和 Delete;Delete 只删除指定 Partition 中匹配主键的实体。partition-name 时,Insert 写入 Milvus 的 _default Partition。使用 Upsert 时应保持分区配置稳定,避免同一主键分散在不同 Partition。$meta,但不会变成静态 Schema 字段。CREATE TABLE milvus_sink ( id BIGINT, embedding ARRAY<FLOAT>, title STRING, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'milvus', 'uri' = '<milvus_uri>', 'token' = '${secret_values.milvus-token}', 'collection-name' = '<collection_name>', 'sink.semantic' = 'upsert' );
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| Connector 标识符。 | STRING | 是 | 无 | 固定为 |
| Milvus 服务 URI。 | STRING | 条件必填 | 无 | 与 |
| Milvus 主机名或 IP。 | STRING | 条件必填 | 无 | 未配置 |
| Milvus 服务端口。 | INTEGER | 否 |
| 配合 |
| 是否使用安全连接。 | BOOLEAN | 否 |
| 仅在未配置 |
| Milvus 鉴权 Token。 | STRING | 否 | 无 | 推荐使用 |
| Milvus 用户名。 | STRING | 否 | 无 | 与 |
| Milvus 密码。 | STRING | 否 | 无 | 与 |
| 目标数据库名称。 | STRING | 否 | 无 | 未配置时使用 Milvus 默认数据库。 |
| 目标 Collection 名称。 | STRING | 是 | 无 | Collection 必须预先存在。 |
| 目标 Partition 名称。 | STRING | 否 | 无 | Partition 必须预先存在,并同时作用于 Insert、Upsert 和 Delete。 |
| 客户端连接超时。 | DURATION | 否 |
| 配置为正时长。 |
| 单次 RPC 截止时间。 | DURATION | 否 |
| 配置为正时长。 |
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| 写入语义。 | STRING | 否 |
| 可选 |
| 单批缓存的最大记录数。 | INTEGER | 否 |
| 达到阈值时触发 Flush。 |
| 后台定时 Flush 间隔。 | DURATION | 否 |
| 配置为正时长。 |
| 写入失败的最大重试次数。 | INTEGER | 否 |
| 取值不小于 0。 |
| Sink 算子并行度。 | INTEGER | 否 | 无 | 未配置时跟随上游算子并行度。 |
Flink 类型 | Milvus 字段类型 | 说明 |
|---|---|---|
| Bool | — |
| Int8 / Int16 / Int32 / Int64 | 按字段类型对应。 |
| Float / Double | — |
| VarChar / String | 长度限制由 Milvus 服务端校验。 |
| FloatVector | 数组长度必须与向量维度一致。 |
| BinaryVector / Float16Vector / BFloat16Vector | 按目标字段类型选择。 |
| SparseFloatVector | Map Key 表示维度索引,Value 表示非零值。 |
标量、 | JSON | 使用字符串时必须是合法 JSON。 |
| Array | 元素支持 Bool、整型、Float、Double、Char 和 VarChar。 |
以下示例使用 insert 将仅包含 INSERT 的追加流写入 Milvus:
CREATE TABLE milvus_insert_sink ( id BIGINT, embedding ARRAY<FLOAT>, title STRING ) WITH ( 'connector' = 'milvus', 'uri' = '<milvus_uri>', 'token' = '${secret_values.milvus-token}', 'collection-name' = '<collection_name>', 'sink.semantic' = 'insert' ); INSERT INTO milvus_insert_sink SELECT id, embedding, title FROM append_only_source;
预期结果:append_only_source 中的新增记录持续写入目标 Collection。上游一旦产生 UPDATE 或 DELETE,作业会失败。
以下示例使用 upsert 同步 Changelog 数据:
CREATE TABLE milvus_upsert_sink ( id BIGINT, embedding ARRAY<FLOAT>, title STRING, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'milvus', 'uri' = '<milvus_uri>', 'token' = '${secret_values.milvus-token}', 'collection-name' = '<collection_name>', 'sink.semantic' = 'upsert', 'sink.buffer-flush.max-rows' = '1000', 'sink.buffer-flush.interval' = '2s' ); INSERT INTO milvus_upsert_sink SELECT id, embedding, title FROM source_changelog;
预期结果: INSERT 和 UPDATE_AFTER 按主键写入或覆盖实体,DELETE 按主键删除实体,UPDATE_BEFORE 被忽略。
Connector 在作业启动阶段读取 Collection Schema 并校验 DDL 字段。运行期间,Checkpoint、作业关闭、缓存行数阈值和定时刷新都会触发 Flush。
外部写入采用 At-Least-Once 语义。Connector 不对尚未提交的缓冲数据进行快照,故障恢复时由上游重放数据。对 CDC、聚合结果等存在重放可能的数据,建议配合稳定主键与 Upsert 写入,确保同一主键的最终结果幂等收敛。
现象 | 可能原因 | 处理建议 |
|---|---|---|
提示 Collection 不存在 | Connector 不会自动创建 Collection。 | 先创建 Collection、字段和索引,再启动作业。 |
提示字段不存在 | DDL 字段名或大小写与 Collection Schema 不一致,且未启用动态字段。 | 核对字段名称;确需动态字段时,先在 Collection 上启用该能力。 |
向量字段写入失败 | 数组类型或长度与目标向量字段不匹配。 | 核对类型映射及目标向量维度。 |
Insert 作业收到更新或删除后失败 |
| 将 |
JSON 字段序列化失败 | STRING 值不是合法 JSON。 | 修正上游 JSON 文本后重新提交。 |
故障恢复后出现重复实体 | Insert 不保证按主键覆盖,恢复期间可能重放。 | 优先使用 Upsert,或在业务侧提供幂等和去重机制。 |
enableDynamicField 不会为 Collection 自动增加静态字段;未声明字段只会保存到 $meta。partition-name 时,Insert、Upsert 和 Delete 必须保持一致的分区配置,且目标 Partition 必须预先存在。