Lance Flink SQL Connector 用于在火山引擎流式计算 Flink 版中读取或写入存储在对象存储 TOS 上的 Lance 数据集。Connector 同时提供 Source 和 Sink 能力,适用于向量、文本和其他 AI/机器学习数据的批式处理与流式接入。
类别 | 详情 |
|---|---|
支持类型 | Source、Sink |
作业类型 | Flink SQL |
运行模式 | 批模式、流模式 |
支持的变更类型 | Source:追加数据;Sink:仅 INSERT |
数据格式 | Lance |
组件形态 | Flink 1.17及1.20版本内置 |
交付语义 | Exactly-Once;Sink 在 Checkpoint 时提交 |
组件 | 支持版本 | 说明 |
|---|---|---|
火山引擎流式计算 Flink 版 |
| Connector 已由平台内置,无需上传额外 JAR。 |
TOS | FNS Bucket | 不支持 HNS Bucket。 |
Lance | 7.0.0 | Connector 负责读写 Lance 数据集。 |
write.large-string-columns 将指定 STRING 字段写为 Arrow LargeUtf8,适合较大的文本或结构化字符串字段。path 必须使用 tos://<bucket>/<path> 格式,并指向有权限访问的 Bucket 和目录。write.large-string-columns 中的字段名按 Sink 表 Schema 精确匹配并区分大小写,多个字段使用英文逗号分隔。CREATE TABLE lance_sink ( id BIGINT, content STRING, embedding ARRAY<FLOAT> ) WITH ( 'connector' = 'lance', 'path' = 'tos://<bucket>/<path>', 's3-access-key' = '${secret_values.tos-access-key}', 's3-secret-key' = '${secret_values.tos-secret-key}', 's3-endpoint' = '<tos_s3_endpoint>' );
CREATE TABLE lance_source ( id BIGINT, content STRING, embedding ARRAY<FLOAT> ) WITH ( 'connector' = 'lance', 'path' = 'tos://<bucket>/<path>', 's3-access-key' = '${secret_values.tos-access-key}', 's3-secret-key' = '${secret_values.tos-secret-key}', 's3-endpoint' = '<tos_s3_endpoint>', 'source.mode' = 'batch' );
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| Connector 标识符。 | STRING | 是 | 无 | 固定为 |
| Lance 数据集在 TOS 上的路径。 | STRING | 是 | 无 | 格式为 |
| 访问 TOS 的 Access Key。 | STRING | 是 | 无 | 生产作业应引用 Flink 加密变量。 |
| 访问 TOS 的 Secret Key。 | STRING | 是 | 无 | 生产作业应引用 Flink 加密变量。 |
| TOS Bucket 的 S3 Endpoint。 | STRING | 是 | 无 | 从目标 Bucket 控制台获取,优先使用与 Flink 同地域的内网 Endpoint。 |
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| 每批写入的记录数。 | STRING | 否 |
| 适当增大可提高吞吐,但也会增加内存占用和单批延迟。 |
| 单个 Lance Fragment 允许包含的最大行数。 | INTEGER | 否 |
| 达到阈值后生成新的数据文件。 |
| 使用 Arrow LargeUtf8 写入的 STRING 字段列表。 | STRING | 否 | 无 | 多个字段使用英文逗号分隔,字段名区分大小写。 |
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| Source 运行模式。 | STRING | 否 |
| 可选 |
| Streaming Source 发现新数据的间隔。 | LONG | 否 |
| 单位为毫秒,仅在 |
CREATE TABLE src ( id BIGINT, content STRING, embedding ARRAY<FLOAT> ) WITH ( 'connector' = 'datagen', 'number-of-rows' = '200', 'rows-per-second' = '1', 'fields.id.kind' = 'sequence', 'fields.id.start' = '1', 'fields.id.end' = '200' ); CREATE TABLE lance_sink ( id BIGINT, content STRING, embedding ARRAY<FLOAT> ) WITH ( 'connector' = 'lance', 'path' = 'tos://<bucket>/<dataset_path>', 's3-access-key' = '${secret_values.tos-access-key}', 's3-secret-key' = '${secret_values.tos-secret-key}', 's3-endpoint' = '<tos_s3_endpoint>', 'write.batch-size' = '1024' ); INSERT INTO lance_sink SELECT * FROM src;
预期结果。 作业完成后,目标 TOS 路径中生成 Lance 数据集及数据 Fragment。
将 datagen Source 改为无界数据源,并以 Streaming 方式提交相同的 INSERT INTO 语句,即可持续向目标 Lance 数据集写入数据。上游只能产生 INSERT。Connector 在 Checkpoint 时提交数据,因此必须为作业启用 Checkpoint。
CREATE TABLE lance_source ( id BIGINT, content STRING, embedding ARRAY<FLOAT> ) WITH ( 'connector' = 'lance', 'path' = 'tos://<bucket>/<dataset_path>', 's3-access-key' = '${secret_values.tos-access-key}', 's3-secret-key' = '${secret_values.tos-secret-key}', 's3-endpoint' = '<tos_s3_endpoint>', 'source.mode' = 'batch' ); CREATE TABLE print_sink ( id BIGINT, content STRING, embedding ARRAY<FLOAT> ) WITH ( 'connector' = 'print' ); INSERT INTO print_sink SELECT * FROM lance_source;
预期结果。 作业读取当前 Lance 数据集的记录,并将结果输出到 Print Sink。
CREATE TABLE lance_streaming_source ( id BIGINT, content STRING, embedding ARRAY<FLOAT> ) WITH ( 'connector' = 'lance', 'path' = 'tos://<bucket>/<dataset_path>', 's3-access-key' = '${secret_values.tos-access-key}', 's3-secret-key' = '${secret_values.tos-secret-key}', 's3-endpoint' = '<tos_s3_endpoint>', 'source.mode' = 'streaming', 'source.discovery-interval' = '10000' );
Streaming Source 启动时先读取当前数据集已有的 Fragment,然后按照配置间隔发现并读取新增 Fragment。该模式只支持追加数据集。
Sink 仅处理 INSERT,按 write.batch-size 累积记录,并通过 write.max-rows-per-file 控制单个 Lance Fragment 的最大行数。Streaming Sink 在 Checkpoint 时提交数据,从而保证 Exactly-Once;作业恢复后从最近一次成功 Checkpoint 继续处理。
Source 在 Batch 模式读取当前数据集后结束。Streaming Source 先读取启动时已存在的 Fragment,再按照 source.discovery-interval 定期发现并读取新增 Fragment;数据集必须保持追加写入。
现象 | 可能原因 | 处理建议 |
|---|---|---|
访问 TOS 失败 | AK/SK 无效、权限不足或 Endpoint 不正确。 | 核对加密变量、Bucket 读写/List 权限、地域和 S3 Endpoint。 |
提示路径不可用 |
| 使用 |
LargeUtf8 配置未生效 | 字段名大小写或拼写与 Sink Schema 不一致。 | 按 Sink 表字段名精确填写 |
Streaming Source 长时间没有新数据 | 未生成新 Fragment,或发现间隔、TOS 权限存在问题。 | 检查数据集是否有新增数据,并核对 |
Streaming Sink 长时间看不到新数据 | Checkpoint 未启用或尚未成功完成。 | 检查 Checkpoint 配置和状态,确认至少一次 Checkpoint 成功提交。 |
Sink 收到 UPDATE 或 DELETE 后失败 | Lance Sink 仅支持 INSERT。 | 将上游转换为仅追加数据后再写入。 |