



介绍
Amazon S3 Tables 提供了针对表格数据而优化的存储方式(例如每日购买交易数据、流式传感器数据和广告曝光量数据)以便你可以使用 Amazon Athena、Amazon EMR 和 Apache Spark 等流行查询引擎进行数据查询。与自行管理的表存储相比,查询性能最高可提升 3 倍,每秒事务处理量最多可提高 10 倍,并且使用全托管服务时,运维效率可以显著提高。
Iceberg 已成为管理 Parquet 文件最流行的方式,大量 AWS 客户会使用 Iceberg 来查询数十亿计的文件,这些文件中可能包含 PB 级甚至 EB 级数据。
表存储桶、表和命名空间
表存储桶是第三种类型的 S3 存储桶,与现有的通用存储桶和目录存储桶并列。你可以将表存储桶视为一个分析型数据仓库,可以存储各种结构(Schema) 的 Iceberg 表。此外,S3 Tables 具有 S3 原有的持久性、可用性、可扩展性和高性能特征,可自动优化存储,从而最大限度地提高查询性能和降低成本。

每个表存储桶都需要部署在特定的 AWS 区域中,存储桶名称在当前 AWS 账户下的对应区域中必须唯一。你可以通过指定存储桶的 ARN 来引用对应的存储桶,还可以使用资源策略进行访问控制。此外,每个存储桶的表通过命名空间进行逻辑分组。
表是存储在表存储桶中的结构化数据集。与表存储桶一样,表也有对应的 ARN 和资源策略,并隶属于存储桶的某个命名空间。表为全托管形式,并具有可配置的持续自动维护功能,包括压缩、旧快照管理和删除未引用的文件。每个表都有一个 S3 API 端点,用来实现存取数据等操作。
为简化访问管理,可以在访问策略中引用命名空间。
使用命令行创建存储桶和表
好了,我们言归正传,先创建一个存储桶,再在存储桶里存储一两个表。我用的是 AWS 命令行工具 (AWS CLI),也可以使用 AWS 管理控制台和 API。为方便展示,我通过 jq 将冗长命令的输出进行管道化处理,仅展示最相关的值。
第一步,创建一个表存储桶:
$ aws s3tables create-table-bucket --name jbarr-table-bucket-2 | jq .arn
"arn:aws:s3tables:us-east-2:123456789012:bucket/jbarr-table-bucket-2"
为了方便,我使用表存储桶的 ARN 创建一个环境变量:
$ export ARN="arn:aws:s3tables:us-east-2:123456789012:bucket/jbarr-table-bucket-2"
然后,列出所有表存储桶:
$ aws s3tables list-table-buckets | jq .tableBuckets[].arn
"arn:aws:s3tables:us-east-2:123456789012:bucket/jbarr-table-bucket-1"
"arn:aws:s3tables:us-east-2:123456789012:bucket/jbarr-table-bucket-2"
可以用多种方式来访问表和向表中填充数据。这个实验中,我安装了 Apache Spark,然后使用命令行参数调用 Spark shell,以使用 适用于Apache Iceberg 的Amazon S3 Tables Catalog 软件包,并将 mytablebucket 设置为表的 ARN。
创建一个命名空间 (mydata),用来对表进行分组:
scala> spark.sql("""CREATE NAMESPACE IF NOT EXISTS mytablebucket.mydata""")
然后,在命名空间中,创建一个简单的 Iceberg 表:
spark.sql("""CREATE TABLE IF NOT EXISTS mytablebucket.mydata.table1
(id INT,
name STRING,
value INT)
USING iceberg
""")
执行以下 s3tables 命令,查看命名空间和表是否创建成功:
$ aws s3tables list-namespaces --table-bucket-arn $ARN | jq .namespaces[].namespace[]
"mydata"
$
$ aws s3tables list-tables --table-bucket-arn $ARN | jq .tables[].name
"table1"
然后,返回 Spark shell,在表中添加几行数据:
spark.sql("""INSERT INTO mytablebucket.mydata.table1
VALUES
(1, 'Jeff', 100),
(2, 'Carmen', 200),
(3, 'Stephen', 300),
(4, 'Andy', 400),
(5, 'Tina', 500),
(6, 'Bianca', 600),
(7, 'Grace', 700)
""")
使用控制台创建存储桶和表
还可以使用 S3 控制台创建和管理表存储桶。单击 Table buckets(表存储桶),快速开始创建存储桶。

在创建第一个存储桶之前,可以先单击 Enable integration(启用集成)功能。这样,就可以从 Amazon Athena、Amazon Redshift、Amazon EMR 和其他 AWS 查询引擎访问表存储桶。(你也可以先创建存储桶,后期需要时再启用这个功能。)

仔细阅读弹出的说明信息,然后点击 Enable integration(启用集成)。集成功能启用时,会自动在 AWS Glue Data Catalog 中创建对应的 IAM 角色和条目。

等待几秒,集成启用成功。然后,单击 Create table bucket(创建表存储桶),继续后续操作。

输入名称 (jbarr-table-bucket-3),然后点击 Create table bucket(创建表存储桶)。

表存储桶创建成功后,可以继续创建表和使用表。相关操作说明,请参见前面使用 CLI 创建表的操作说明。
表维护
表存储桶可以自动处理一些重要的维护任务。如果你使用自托管的 Iceberg 表,这些维护工作则需要你自行负责。为减轻你的负担,让你有更多的时间来处理你的业务相关的表设计和管理,AWS 系统会自动执行以下维护操作:
压缩:将多个小表对象合并为一个较大的对象,以提高查询性能,目的是生成 64 MiB 至 512 MiB 大小的目标文件。新对象将被重写为新快照。
快照管理:根据配置,自动标记过期表快照并最终删除表快照。配置选项包括保留快照的最小数量和快照保留的最长时间。过期快照会被标记为非当前快照,然后在指定天数后删除。
删除未引用文件:删除未被任何表快照引用的对象。
注意事项
关于表存储桶和表,有以下注意事项:
AWS 集成:S3 Tables 与 AWS Glue Data Catalog 的集成尚处于试用阶段。集成后,你可以通过 Amazon Athena、Amazon Redshift、Amazon EMR 和 Amazon QuickSight 等 AWS 分析服务来查询和可视化 S3 表存储桶中的数据。
S3 API 支持:表存储桶支持相关的 S3 API 函数,包括 GetObject、HeadObject、PutObject 和分段上传操作。
安全性:自动加密表存储桶中存储的所有对象。表存储桶配置为强制屏蔽公共访问。
定价:你需要支付存储费用、请求处理费用、对象监控费用和压缩费用。有关更多信息,请参阅 S3 定价页面。
区域:目前,支持此功能的 AWS 区域包括:美国东部(俄亥俄)、美国东部(弗吉尼亚北部)和美国西部(俄勒冈)区域。
更多教程
快速搭建容量高达 35GB 的免费个人网盘
本教程将介绍如何搭建一个没有使用限制的免费私人网盘。
构建企业专属智能客服机器人
本文将演示如何结合多种服务,打造企业专属的智能客服。
使用生成式 AI 构建多语言问答知识库
使用多种服务,构建可汇总搜索结果的多语言知识库。
免费套餐
AWS 海外区域
拓展海外业务或个人体验
免费使用 100 余种云产品或服务, 长达 12 个月
AWS 中国区域
发展中国业务
免费使用 40 余种核心云服务产品,长达 12 个月