多云统一数据湖加速
"数据湖加速"的核心理念是不搬迁数据 ——直接在云器 Lakehouse 的 Serverless 算力上查询和加工已有对象存储中的文件,替代传统 Spark/Hive ETL 和 Presto/Trino Ad hoc 查询。
阿里云 OSS、腾讯云 COS、AWS S3 三种主流对象存储,通过一套统一方案打通:Volume 挂载 → Pipe 持续入仓 → Dynamic Table 增量聚合 。除了 Storage Connection 创建时参数名不同,其余 SQL 语法完全一致。
为什么需要多云统一方案
企业数据分散在多个云厂商,需要统一查询入口
不同云的对象存储 API 不同,但 Lakehouse 的数据处理逻辑应保持一致
减少跨云环境切换的心智负担和运维成本
云器 Lakehouse 的抽象层完美解决了这个问题:同一套 SQL,换个 Connection 参数就能跑在不同的云上 。
涉及的 SQL 命令
命令 / 函数 用途 多云差异 CREATE STORAGE CONNECTIONCREATE STORAGE CONNECTION
建立对象存储认证通道 唯一有差异的步骤 (参数名不同)CREATE EXTERNAL VOLUMECREATE EXTERNAL VOLUME
挂载对象存储路径 语法完全统一(只改协议前缀) COPY INTO VOLUMECOPY INTO VOLUME
导出数据到 Volume 完全统一 SELECT FROM VOLUMESELECT FROM VOLUME
直接查询 Volume 文件 完全统一 DIRECTORY()DIRECTORY()
列出 Volume 中的文件 完全统一 COPY INTOCOPY INTO
从 Volume 导入数据到表 完全统一 CREATE PIPECREATE PIPE
创建持续导入管道 完全统一 ALTER PIPEALTER PIPE
暂停/恢复 Pipe 完全统一 load_history()load_history()
查看历史加载记录 完全统一 CREATE DYNAMIC TABLECREATE DYNAMIC TABLE
创建增量刷新聚合表 完全统一 REFRESH DYNAMIC TABLEREFRESH DYNAMIC TABLE
手动触发刷新 完全统一
核心架构
┌─────────────────────────────────────────────────────────────┐
│ 云器 Lakehouse (Serverless) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Aliyun │ │ Tencent │ │ AWS │ ← 对象存储 │
│ │ OSS │ │ COS │ │ S3 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────┐ │
│ │ Storage Connection │ ← 认证层 │
│ │ (参数不同,功能相同) │ │
│ └──────────────┬──────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────┐ │
│ │ External Volume │ ← 挂载层 │
│ │ (语法完全一致) │ │
│ └──────┬──────────────────┬───────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────┐ ┌─────────────┐ │
│ │ COPY INTO │ │ Pipe 持续 │ ← 导入层 │
│ │ 一次性导入 │ │ 自动入仓 │ │
│ └─────┬────┘ └──────┬──────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────────────────┐ │
│ │ Dynamic Table │ ← 计算层 │
│ │ (自动增量聚合) │ │
│ └──────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
跨云对比:实测结果
在阿里云上海(
f8866243f8866243
)和腾讯云上海(
0c3c358d0c3c358d
)上执行了完全相同的 Volume + Pipe 测试用例:
配置差异
配置项 阿里云 OSS 腾讯云 COS Connection 类型 TYPE OSSTYPE OSS
TYPE COSTYPE COS
认证参数名 access_idaccess_id
/ access_keyaccess_key
(小写)ACCESS_KEYACCESS_KEY
/ SECRET_KEYSECRET_KEY
(大写)Endpoint ENDPOINT = 'oss-cn-shanghai.aliyuncs.com'ENDPOINT = 'oss-cn-shanghai.aliyuncs.com'
不需要 ENDPOINT Region 参数 内嵌在 ENDPOINT 中 REGION = 'ap-shanghai'REGION = 'ap-shanghai'
APP_ID 不适用 APP_ID = '1253896122'APP_ID = '1253896122'
Volume 定位语法 LOCATION 'oss://bucket/path/'LOCATION 'oss://bucket/path/'
LOCATION 'cos://bucket-appid/path/'LOCATION 'cos://bucket-appid/path/'
建议 Endpoint oss-cn-shanghai-internal.aliyuncs.comoss-cn-shanghai-internal.aliyuncs.com
(内网)自动解析,无需配置
⚠️ 注意 :阿里云必须用
access_idaccess_id
/
access_keyaccess_key
或
ACCESS_KEY_IDACCESS_KEY_ID
/
ACCESS_KEY_SECRETACCESS_KEY_SECRET
,不能用
ACCESS_KEYACCESS_KEY
/
SECRET_KEYSECRET_KEY
(缺少
_ID_ID
/
_SECRET_SECRET
后缀)。腾讯云恰好相反,必须用
ACCESS_KEYACCESS_KEY
/
SECRET_KEYSECRET_KEY
。
功能一致性
测试项 阿里云 OSS 腾讯云 COS 结论 Storage Connection 创建 ✅ ✅ 参数名不同,其他一致 External Volume 创建 ✅ ✅ 语法完全一致 COPY INTO VOLUME 导出 CSV ✅ ✅ 一致 COPY INTO VOLUME 导出 Parquet ✅ ✅ 一致 DIRECTORY() 查询文件列表 ✅ ✅ 一致 SELECT FROM VOLUME (CSV) ✅ f0-f4 列名 ✅ f0-f4 列名 一致 SELECT FROM VOLUME (Parquet) ✅ 保留列名 ✅ 保留列名 一致 COPY INTO TABLE 从 Volume ✅ ✅ 一致 PIPE LIST_PURGE 创建 ✅ ✅ 一致 PIPE 加载触发 ✅ ~30s ✅ ~30s 一致 PIPE PURGE 删除源文件 ✅ ✅ 一致 PIPE load_history 去重 ✅ ✅ 一致 PIPE 暂停/恢复 ✅ ✅ 一致 Dynamic Table 增量刷新 ✅ ✅ 一致
关键发现 :除了 Connection 创建时的参数名不同,其余 12 项测试完全一致 。Volume、Pipe、Dynamic Table 的 SQL 语法无任何差异。
统一实施方案
第一步:创建 Storage Connection(唯一有差异的步骤)
-- ============ 阿里云 OSS ============
CREATE STORAGE CONNECTION IF NOT EXISTS my_storage_conn
TYPE OSS
access_id = '<AccessKey ID>'
access_key = '<AccessKey Secret>'
ENDPOINT = 'oss-cn-shanghai-internal.aliyuncs.com';
-- ============ 腾讯云 COS ============
CREATE STORAGE CONNECTION IF NOT EXISTS my_storage_conn
TYPE COS
ACCESS_KEY = '<SecretId>'
SECRET_KEY = '<SecretKey>'
REGION = 'ap-shanghai'
APP_ID = '<APP_ID>';
-- ============ AWS S3 ============
CREATE STORAGE CONNECTION IF NOT EXISTS my_storage_conn
TYPE S3
ACCESS_KEY = '<Access Key ID>'
SECRET_KEY = '<Secret Access Key>'
REGION = 'us-east-1';
💡 同地域内网加速 :阿里云用
oss-cn-shanghai-internal.aliyuncs.comoss-cn-shanghai-internal.aliyuncs.com
(内网 Endpoint),AWS S3 和腾讯云 COS 通过 Region 参数自动使用内网路由。内网传输免流量费、延迟更低。
第二步:创建 External Volume(三云统一语法)
-- ✅ 三云统一语法:只需改 LOCATION 的协议前缀
CREATE EXTERNAL VOLUME my_data_vol
LOCATION 'oss://my-bucket/data/' -- 阿里云:oss://
-- LOCATION 'cos://my-bucket-appid/data/' -- 腾讯云:cos://
-- LOCATION 's3://my-bucket/data/' -- AWS:s3://
USING CONNECTION my_storage_conn
DIRECTORY = (ENABLE = TRUE, AUTO_REFRESH = FALSE)
RECURSIVE = TRUE
COMMENT '多云统一数据湖加速 Volume';
第三步:数据导入导出(完全统一)
-- 导出到 Volume(三云统一)
COPY INTO VOLUME my_data_vol
SUBDIRECTORY 'export/'
FROM TABLE source_table
FILE_FORMAT = (TYPE = PARQUET);
-- 从 Volume 直接查询(三云统一)
SELECT * FROM VOLUME my_data_vol
USING PARQUET
FILES('export/part00001.parquet');
-- 导入到表(三云统一)
COPY INTO target_table
FROM VOLUME my_data_vol
USING PARQUET
SUBDIRECTORY 'export/';
第四步:Pipe 持续导入(完全统一)
-- 为 Pipe 创建专用 Volume
CREATE EXTERNAL VOLUME pipe_vol
LOCATION 'oss://my-bucket/incoming/' -- 三云只改协议前缀
USING CONNECTION my_storage_conn
DIRECTORY = (ENABLE = TRUE, AUTO_REFRESH = TRUE)
RECURSIVE = TRUE;
-- 创建 Pipe(三云统一)
CREATE PIPE my_pipe
INGEST_MODE = 'LIST_PURGE'
VIRTUAL_CLUSTER = 'DEFAULT'
COMMENT '多云统一持续导入管道'
AS
COPY INTO target_table
FROM VOLUME pipe_vol
USING CSV PURGE = TRUE;
第五步:Dynamic Table 增量聚合(完全统一)
CREATE OR REPLACE DYNAMIC TABLE summary_table
REFRESH INTERVAL 1 DAY vcluster DEFAULT
COMMENT '多云统一聚合指标'
AS
SELECT category, COUNT(*) AS cnt, SUM(amount) AS total
FROM target_table
GROUP BY category;
多云统一的最佳实践
1. 代码复用策略
项目目录结构:
├── connections/
│ ├── aliyun_oss.sql ← 只此文件有差异
│ ├── tencent_cos.sql ← 只此文件有差异
│ └── aws_s3.sql ← 只此文件有差异
├── volumes/
│ └── create_volumes.sql ← 三云通用(协议前缀可通过变量替换)
├── tables/
│ └── ddl.sql ← 完全统一
├── pipes/
│ └── create_pipes.sql ← 完全统一
└── dynamic_tables/
└── aggregates.sql ← 完全统一
只有 Connection 创建 SQL 需要按云编写 ,其余 90% 的代码可以直接复用。
2. 命名规范建议
对象 规范 示例 Storage Connection <云>_<用途><云>_<用途>
oss_prod_connoss_prod_conn
、cos_archive_conncos_archive_conn
External Volume <源系统>_vol<源系统>_vol
orders_volorders_vol
、logs_vollogs_vol
Pipe <源系统>_pipe<源系统>_pipe
orders_pipeorders_pipe
、logs_pipelogs_pipe
不要将云厂商信息嵌入 Volume/Pipe 名称——这些对象可能出现多云复用场景。
3. 成本优化
策略 说明 使用内网 Endpoint 阿里云用 *-internal.aliyuncs.com*-internal.aliyuncs.com
,免流量费、延迟更低 T+1 刷新频率 大部分分析场景不需要分钟级刷新,1 DAY1 DAY
即可 PURGE=true LIST_PURGE 模式自动删除源文件,避免 OSS/COS 存储堆积 GP 型 VCluster 用 DEFAULTDEFAULT
(GENERAL 型),Serverless 按需计费 文件大小控制在 128-256MB CSV/Parquet 大文件比众多小文件效率高 3-5 倍
4. 安全建议
不要使用主账号 AK/SK,创建子账号并授予最小权限(Bucket 读 + 特定目录写)
内网 Endpoint 可以绑定 VPC 策略,限制访问来源
Storage Connection 的 AK/SK 在 SHOW STORAGE CONNECTIONSSHOW STORAGE CONNECTIONS
中不可见(已脱敏)
使用 AWS S3 时优先考虑 IAM Role 方式(ROLE_ARNROLE_ARN
),避免长期 AK/SK
常见问题
Q: 跨云数据传输延迟怎么算?
Volume 不搬迁数据——文件始终留在原对象存储中。查询时的网络延迟取决于 Lakehouse 实例所在地域到对象存储的链路。同地域推荐使用内网 Endpoint (如
oss-cn-shanghai-internal.aliyuncs.comoss-cn-shanghai-internal.aliyuncs.com
),延迟通常在 10ms 以内。
Q: 能从阿里云实例访问腾讯云 COS 吗?
不支持 。Storage Connection 必须与 Lakehouse 实例在同一云厂商。如需跨云查询,有以下替代方案:
在目标云创建 Lakehouse 实例,通过 External Catalog 联邦查询
通过数据集成(Studio Sync)跨云同步数据到 Lakehouse 内部表
使用 Private Link 打通网络后通过 External Schema 访问
Q: Pipe 的 EVENT_NOTIFICATION 模式在三朵云上都支持吗?
云平台 LIST_PURGE EVENT_NOTIFICATION 阿里云 OSS ✅ ✅(需配置 MNS 队列) 腾讯云 COS ✅ ❌ AWS S3 ✅ ✅(需配置 SQS 队列)
EVENT_NOTIFICATIONEVENT_NOTIFICATION
模式支持阿里云 OSS 和 AWS S3,延迟更低(近实时),且不删除源文件。腾讯云 COS 暂不支持。
Q: COPY INTO VOLUME 为什么必须带 SUBDIRECTORY?
COPY INTO VOLUMECOPY INTO VOLUME
不带
SUBDIRECTORYSUBDIRECTORY
子句会报
Syntax error at or near 'FROM'Syntax error at or near 'FROM'
。这是 SQL 解析器的强制要求,与云平台无关。导出到 Volume 根路径时使用
SUBDIRECTORY '/'SUBDIRECTORY '/'
。
相关文档