Amazon S3 与 AWS Glue 集成

使用 AWS Glue 将数据存储在 Amazon S3 中

Amazon S3(简单存储服务)是一种灵活可靠的存储,非常适合管理大型数据集。AWS Glue 是一种提取、转换和加载 (ETL) 服务,当 Amazon S3 与其集成时,数据的管理和处理变得非常容易。

使用 AWS Glue 将数据存储在 Amazon S3 中的好处

以下列出了使用 AWS Glue 将数据存储在 Amazon S3 中的主要好处 −

  • 使用 AWS Glue 将数据存储在 S3 中可轻松访问存储在 S3 存储桶中的数据。我们可以直接在 S3 数据上运行 ETL 作业,并将其转换为有意义的格式。
  • 借助 Glue Crawlers,AWS Glue 可以自动检测存储在 S3 存储桶中的数据的模式。它使我们能够更快、更高效地查询数据。
  • 使用 AWS Glue 内置的 Apache Spark 环境,我们可以转换存储在 Amazon S3 存储桶中的数据。

如何使用 AWS Glue 在 Amazon S3 中存储和处理数据?

使用下面给出的步骤使用 AWS Glue 在 S3 存储桶中存储和处理数据 −

步骤 1:设置您的 Amazon S3 存储桶 − 在使用 AWS Glue 之前,您必须将数据存储在 Amazon S3 存储桶中。您可以通过两种方式将数据集上传到 S3 存储桶中,手动或通过文件传输等自动化流程。

步骤 2:创建 Glue 爬虫 − 现在,将数据放入 S3 存储桶后,您可以设置 Glue 爬虫,它将扫描您的 S3 存储桶、提取元数据并将其保存在 Glue 数据目录中。

步骤 3:定义并运行 ETL 作业 − 创建元数据后,您现在可以在 AWS Glue 中创建 ETL 作业来处理存储在 S3 存储桶中的数据。

步骤 4:查询和分析数据 − 处理完数据后,您可以使用 Amazon Athena 等 AWS 服务查询数据。您还可以将其加载到 Amazon Redshift 等数据仓库中,以进行进一步分析。

使用 Amazon S3 管理 AWS Glue 作业中的分区

使用 Amazon S3 时,管理 AWS Glue 中的分区对于优化性能和降低处理成本非常重要。

分区,顾名思义,根据日期、区域或产品等特定键将数据集划分为更小但更易于管理的部分。换句话说,分区是一种将大型数据集组织成更小的逻辑段的方法。

例如,

s3://your-bucket-name/data/year=2023/month=09/day=27/

在此示例中,数据按年、月、日进行分区。

在 AWS Glue 中设置分区

按照下面给出的步骤在 AWS Glue 中设置分区 −

步骤 1:在 Amazon S3 中对数据进行分区 − 使用基于分区键(例如年、月、日)的目录结构在 Amazon S3 中组织数据。例如,s3://my-bucket/sales_data/year=2023/month=09/day=27/。

步骤 2:配置 AWS Glue 爬虫程序 − 在 S3 中拥有分区数据后,创建并配置 AWS Glue 爬虫程序。爬虫程序将自动识别文件夹结构并将分区信息添加到 Glue 数据目录。

步骤 3:创建或修改 Glue 作业 − 您可以创建或修改 Glue ETL 作业。在这两种情况下,都引用 Glue 数据目录中的分区数据。AWS Glue 将使用此信息仅处理必要的分区。

使用 DynamicFrames 管理分区

为了轻松管理分区数据,AWS Glue 提供了 DynamicFrames。您可以使用 from_catalog 函数加载分区数据,并使用 filter 函数处理特定分区。让我们看下面的一个例子 −

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# 从 Glue 数据目录加载分区数据
dynamic_frame = glueContext.create_dynamic_frame.from_catalog(database="my_database", table_name="sales_data")

# 筛选特定年份和月份的数据
filtered_frame = dynamic_frame.filter(f => f["year"] == "2023" and f["month"] == "09")

# 继续 ETL 流程
-----------------

上述脚本将根据年份和月份筛选数据。然后,它会执行 ETL 流程中定义的转换或操作。最终输出将写入您的 Amazon S3 存储桶。