别再全量下载了:AWS S3 Select 和阿里云 OSS Select 如何帮你省掉90%的回源流量

传统从对象存储读取数据时,往往需要下载整个文件再过滤,导致大量无效带宽浪费。AWS S3 Select 和阿里云 OSS Select 允许你在存储端直接使用 SQL 查询过滤行和列,只返回需要的数据,尤其适合日志分析、JSON 文件处理等场景。本文用大白话讲清原理、适用场景和实际收益。

别再全量下载了:AWS S3 Select 和阿里云 OSS Select 如何帮你省掉90%的回源流量
封面图:ZuCDN · ZuCDN 原创

如果你正在处理AWS S3,先别急着照搬网上的参数。如果你刚接触云存储,可能会觉得“从对象存储里拿数据”就是一件简单的事:用 SDK 把整个文件 download 下来,然后在自己程序里解析、过滤,找到想要的那几行。这个做法在文件很小时没问题,但当你的日志文件动辄几十 GB,甚至单个 CSV 有上千万行时,全量下载不仅速度慢,还会吃掉大量回源带宽,产生可观的流量费用。

AWS S3 Select 和阿里云 OSS Select 就是为了解决这个痛点而生的。它们允许你在对象存储侧直接执行 SQL 语句,只返回你关心的列和行,就像在数据库里查表一样。本文不贴难懂的 API 文档,只讲清楚它是什么、为什么有用、以及什么场景该用。

对象存储的“传统读取”为什么浪费带宽

实际操作要点

对象存储(如 AWS S3、阿里云 OSS)本质上是一个巨大的键值对系统,它不提供像数据库那样的索引和查询能力。如果你要分析一个 10 GB 的 CSV 文件里的某个特定地区的数据,常规做法是:

  • 先把整个 10 GB 文件从 OSS 下载到你的 ECS 或本地服务器;
  • 用 Python、Java 等工具逐行读取,过滤出满足条件的数据;
  • 处理完成后,原始下载的巨大文件可能只用了不到 1% 的数据。

这意味着 99% 的传输流量都是浪费的。而且下载越大的文件,等待时间越长,回源带宽占用也越严重。如果多个任务同时拉取大文件,还容易导致网络拥堵。

AWS S3:S3 Select / OSS Select 的核心思想:把过滤留在存储侧

说白了就是:不让数据“裸奔”到客户端,而是在存储服务器上做完过滤再传给你。你只需要发送一条 SQL 语句,例如:

SELECT region, sales_amount FROM sales_data.csv WHERE region = '华东' AND amount > 1000

OSS 或 S3 会解析这个文件(支持 CSV、JSON、Parquet 等格式),只返回匹配 region=‘华东’且 amount>1000 的那些行的 region 和 sales_amount 这两列。最终返回的数据量可能只有几十 KB,而不是几个 GB。

它是如何做到的?

在对象存储内部,Select 函数会读取对象中的数据(按块扫描),在内存中解析成表格结构,然后逐行应用 WHERE 条件,并只保留 SELECT 指定的列,最后把结果压缩后返回给客户端。整个过程不需要你下载原始文件,不消耗你服务器的 CPU,也不占用你的网络带宽。

为什么“降低回源传输量”是关键收益

验证与回滚

首先,节省的是真金白银。云服务商对出流量(即从 OSS 流向 Internet 或同地域 ECS)都会收费。假设你每天处理 50 GB 日志,实际只使用其中 5 GB,那么用 Select 后,每天可节约 45 GB 出流量。按阿里云中国大陆每 GB 约 0.5 元的公有云价格(用同地域内网不计费,但跨区域或公网会收费),一个月就能省下近 700 元流量费。

其次,大幅降低数据处理延迟。下载 10 GB 文件需要数分钟甚至更久,而 Select 往往在几百毫秒到几秒内就能返回结果,因为传输的数据量极小了。

第三,减轻客户端资源负担。你的应用服务器不再需要高内存和大带宽来承载原始数据,过滤逻辑由云侧完成,客户端只需要做简单的汇总或展示。

AWS S3:什么格式和场景最适合用 Select?

支持的文件格式

  • CSV/TSV:有列名或无列名均可,但是要求每行字段数量一致。
  • JSON:可以是一行一个 JSON 对象的“行式 JSON”,也可以是数组形式的 JSON 文档。
  • Parquet:列式存储格式,Select 可以只读取需要的列,性能极高。

典型场景

  • 日志分析:比如 Nginx 访问日志、CDN 日志、应用日志,通常按照时间分区存入桶,用 Select 过滤出指定时间段或状态码的记录。
  • 数据预处理:在机器学习训练前,需要从大 CSV 中提取部分特征列,用 Select 直接获取,比写 Spark 或 MapReduce 轻量得多。
  • 配置文件或字典数据:一些场景需要从存放在 OSS 的 JSON 字典中查找特定 key,Select 可以避免下载整个字典。

限制与注意事项

  • 单个对象大小:AWS S3 Select 支持最大 5 GB 的对象(压缩后 1 GB),阿里云 OSS Select 在 5 GB 以内的文件体验较好,超大文件(如几百 GB)建议先用 Athena 或 Presto。
  • 返回结果有上限:S3 Select 单次查询返回最多 1 MB 的扫描数据(但可以通过分页跳过限制?实际上限是 256 KB 或 1 MB?这里以官方文档为准,一般小查询够用)。更大结果集可以用 SQL 的 LIMIT + 分页。
  • 只支持只读 SELECT:不支持 JOIN、子查询、GROUP BY……它本质是一个过滤转存,不是数据库。
  • 计费方式:按扫描的数据量与返回的数据量双重计费,通常扫描量远大于返回量,但依然比全量下载便宜。

实际使用一个简单例子(非代码)

实际操作要点

假设你的阿里云 OSS 里有一个文件 logs/2025-04-01.csv,包含了当天所有请求。你想找出所有响应时间 > 500ms 的请求的 URL 和耗时。传统做法:下载整个 CSV(可能 2 GB),然后用 Python 的 csv 模块逐行过滤。如果用 OSS Select,只需向 OSS SDK 发送一个请求,传入 SQL:

SELECT request_url, response_time FROM oss://bucket/logs/2025-04-01.csv WHERE response_time > 500

OSS Select 会扫描整个文件(按扫描量计费),但只返回几十 KB 的结果。你在应用层收到的是一个流式响应,可以直接解析成 DataFrame 或列表,比全量下载快几十倍。

与 CDN 回源的关系

配置前的检查

注意本文的“回源传输量”不是指 CDN 回源,而是指从对象存储直接传输数据到你的应用或分析平台。不过如果你的应用架构是 CDN 挂载 OSS 做静态资源分发,CDN 回源时也可以利用 Select 减少源站压力(OSS Select 只能在 SDK 或控制台调用,CDN 回源无法使用,所以不适用)。

总结:什么时候该用,什么时候不该用

故障定位思路

推荐使用

  • 需要频繁从大量 CSV/JSON/Parquet 文件中提取小部分数据。
  • 数据量较大(百 MB 到几 GB),但过滤后结果很小。
  • 临时探索性查询,不想搭建数据处理集群。

不推荐

  • 你需要对整个文件做全量聚合、JOIN、复杂统计分析——请用 Athena、Spark、Presto 等。
  • 文件格式为图片、视频、压缩包(非结构化)——Select 只支持结构化文本/列式格式。
  • 单个对象超过 5 GB —— 建议拆分成小文件或使用其他方案。

总的来说,S3 Select 和 OSS Select 是对象存储自带的一项“轻量化过滤”能力,对于减少无效数据回源、降低带宽成本和加速查询极其实用。下次当你面对一个大文件时,先想想“我是否能只用 SQL 拿到想要的那部分”,而不是默默点击下载。把这些步骤跑通后,AWS S3基本就能稳定落地。

延伸阅读