Olawale Olaleye
难度
中级
时间
20 分钟
相关产品
上次更新时间
2024 年 12 月 3 日

介绍

AWS 的许多客户使用 Amazon Simple Storage Service (Amazon S3) 存储的数据规模非常惊人,他们常常需要定期创建存储桶,单个存储桶需要存储数十亿甚至数万亿个对象!在这种规模下,要从存储桶中查询符合特定条件的对象(如指定模式的键对应的对象、特定大小的对象或具有特定标签的对象)就变成了一大挑战。为了实现查询,客户只能另外构建专门用于捕获、存储和查询对象数据的系统。随着业务增长,这些系统可能会变得越来越复杂,系统却难以扩展,并且这些系统中的数据可能与存储桶以及桶中对象的实际状态不同步。

丰富的元数据

利用 Amazon S3 Metadata (Preview),在 S3 存储桶中添加或修改对象时,此功能就会自动捕获对象元数据,并将其存储在全托管的 Apache Iceberg 表中。这样,便可以使用与 Iceberg 兼容的工具,如 Amazon AthenaAmazon RedshiftAmazon QuickSight 和 Apache Spark,轻松高效地查询任何规模的元数据,并找到对应的对象。因此,可以快速查询分析、数据处理和 AI 训练工作负载所需的数据。

如果视频文件存储在 S3 中,要进行视频推理时,可以使用 Amazon Bedrock 对根据元数据生成的内容进行注释。这样,就能够识别 AI 生成的内容,并了解生成内容所使用的模型信息。

元数据 schema 中包含 20 多种元素,包括存储桶名称、对象键、创建和修改时间、存储类型、加密状态、标签和用户元数据。另外,还可以将应用程序特定的描述性信息存储在一个单独的表中,然后将该表与元数据表相连接 (join)。这样,查询时,也能获取到该表中的信息。

实现方式

通过指定存储元数据的位置(S3 表存储桶和表名称),可以捕获任何 S3 存储桶中对象的丰富元数据。此功能启用后,会立即开始捕获更新操作记录数据(对象创建、对象删除和对象元数据更改),并在几分钟内将捕获的数据存储到指定表中。每次对象更新后,都会在表中添加一行数据,包括对应的操作记录类型(CREATEUPDATE_METADATADELETE)和序列号。以此可以查询指定对象的历史操作记录,且查询结果会根据序列号进行排序。

启用功能,查询元数据

首先,执行 create-table-bucket 命令来创建一个存储元数据的表存储桶 (table bucket)(你也可以使用 AWS 管理控制台或调用相关 API 来创建存储桶):

$ aws s3tables create-table-bucket --name jbarr-table-bucket-1 --region us-east-2
--------------------------------------------------------------------------------
|                               CreateTableBucket                              |
+-----+------------------------------------------------------------------------+
|  arn|  arn:aws:s3tables:us-east-2:123456789012:bucket/jbarr-table-bucket-1   |
+-----+------------------------------------------------------------------------+

然后,创建一个配置文件(文件可命名为 config.json),并将以下 JSON 内容写入文件,指定该表存储桶的 ARN 和目标表名称:

{
  "S3TablesDestination": {
    "TableBucketArn": "arn:aws:s3tables:us-east-2:123456789012:bucket/jbarr-table-bucket-1",
    "TableName": "jbarr_data_bucket_1_table"
  }
}

然后,添加以下配置,设置用于捕获元数据的数据存储桶:

$ aws s3api create-bucket-metadata-table-configuration \
  --bucket jbarr-data-bucket-1 \
  --metadata-table-configuration file://./config.json \
  --region us-east-2

为了测试,我在 EC2 实例上安装了 Apache Spark,并完成了相关设置。为了实现查询,我引用了适用于 Apache Iceberg 的 Amazon S3 Tables Catalog 包和在命令行中添加了元数据表 mytablebucket

$ bin/spark-shell \
--packages org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.6.0 \
--jars ~/S3TablesCatalog.jar \
--master yarn \
--conf "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \
--conf "spark.sql.catalog.mytablebucket=org.apache.iceberg.spark.SparkCatalog" \
--conf "spark.sql.catalog.mytablebucket.catalog-impl=com.amazon.s3tables.iceberg.S3TablesCatalog" \
--conf "spark.sql.catalog.mytablebucket.warehouse=arn:aws:s3tables:us-east-2:123456789012:bucket/jbarr-table-bucket-1"

下面是 Iceberg 表的当前 Schema:

scala> spark.sql("describe table mytablebucket.aws_s3_metadata.jbarr_data_bucket_1_table").show(100,35)

+---------------------+------------------+-----------------------------------+
|             col_name|         data_type|                            comment|
+---------------------+------------------+-----------------------------------+
|               bucket|            string|   The general purpose bucket name.|
|                  key|            string|The object key name (or key) tha...|
|      sequence_number|            string|The sequence number, which is an...|
|          record_type|            string|The type of this record, one of ...|
|     record_timestamp|     timestamp_ntz|The timestamp that's associated ...|
|           version_id|            string|The object's version ID. When yo...|
|     is_delete_marker|           boolean|The object's delete marker statu...|
|                 size|            bigint|The object size in bytes, not in...|
|   last_modified_date|     timestamp_ntz|The object creation date or the ...|
|                e_tag|            string|The entity tag (ETag), which is ...|
|        storage_class|            string|The storage class that's used fo...|
|         is_multipart|           boolean|The object's upload type. If the...|
|    encryption_status|            string|The object's server-side encrypt...|
|is_bucket_key_enabled|           boolean|The object's S3 Bucket Key enabl...|
|          kms_key_arn|            string|The Amazon Resource Name (ARN) f...|
|   checksum_algorithm|            string|The algorithm that's used to cre...|
|          object_tags|map<string,string>|The object tags that are associa...|
|        user_metadata|map<string,string>|The user metadata that's associa...|
|            requester|            string|The AWS account ID of the reques...|
|    source_ip_address|            string|The source IP address of the req...|
|           request_id|            string|The request ID. For records that...|
+---------------------+------------------+-----------------------------------+

下面是一个简单的查询示例,查询最近 10 次更新记录的部分元数据:

scala> spark.sql("SELECT key,size, storage_class,encryption_status \
  FROM mytablebucket.aws_s3_metadata.jbarr_data_bucket_1_table \
  order by last_modified_date DESC LIMIT 10").show(false)
+--------------------+------+-------------+-----------------+                   
|key                 |size  |storage_class|encryption_status|
+--------------------+------+-------------+-----------------+
|wnt_itco_2.png      |36923 |STANDARD     |SSE-S3           |
|wnt_itco_1.png      |37274 |STANDARD     |SSE-S3           |
|wnt_imp_new_1.png   |15361 |STANDARD     |SSE-S3           |
|wnt_imp_change_3.png|67639 |STANDARD     |SSE-S3           |
|wnt_imp_change_2.png|67639 |STANDARD     |SSE-S3           |
|wnt_imp_change_1.png|71182 |STANDARD     |SSE-S3           |
|wnt_email_top_4.png |135164|STANDARD     |SSE-S3           |
|wnt_email_top_2.png |117171|STANDARD     |SSE-S3           |
|wnt_email_top_3.png |55913 |STANDARD     |SSE-S3           |
|wnt_email_top_1.png |140937|STANDARD     |SSE-S3           |
+--------------------+------+-------------+-----------------+

在实际应用中,可能会使用前面提到的某个 AWS 或开源分析工具来查询该表,以根据该表数据实现其他操作。

使用控制台配置

还可以通过 AWS 控制台进行操作。登录 Amazon S3 控制台,在存储桶页面单击 Metadata(元数据)选项卡,然后设置和管理存储桶的元数据配置。

Amazon S3 Metadata 总结

Amazon S3 Metadata 预览版目前支持的 AWS 区域:美国东部(俄亥俄州)、美国东部(弗吉尼亚北部)和美国西部(俄勒冈)。

此外,与 AWS Glue Data Catalog 的集成功能也处于试用阶段。集成后,可以使用 Amazon AthenaAmazon RedshiftAmazon EMRAmazon QuickSight 等 AWS 分析服务查询和可视化数据,包括 S3 元数据表中的数据。

费用基于更新操作次数(对象创建、对象删除和对象元数据更改)计算,且需要额外收取元数据表的存储费用。有关更多定价信息,请访问 S3 定价页面。

更多教程

快速搭建容量高达 35GB 的免费个人网盘

本教程将介绍如何搭建一个没有使用限制的免费私人网盘。

构建企业专属智能客服机器人

本文将演示如何结合多种服务,打造企业专属的智能客服。

使用生成式 AI 构建多语言问答知识库

使用多种服务,构建可汇总搜索结果的多语言知识库。

查看全部教程 >>

免费套餐

AWS 海外区域

拓展海外业务或个人体验
免费使用 100 余种云产品或服务, 长达 12 个月

AWS 中国区域

发展中国业务
免费使用 40 余种核心云服务产品,长达 12 个月