通过使用 AWS Glue 数据目录列级统计来提升查询性能 大数据博客
提升查询性能:使用 AWS Glue 数据目录的列级统计信息
关键要点:在 AWS Glue 数据目录中引入列级统计信息的新功能,能够通过提高亚马逊 Athena 和亚马逊 Redshift Spectrum 查询性能,以及减少潜在成本,实现分析结果的优化。
蓝快加速器今天,我们推出了 AWS Glue 数据目录的新功能,允许为 AWS Glue 表生成列级统计信息。这些统计信息现已与亚马逊 Athena 和亚马逊 Redshift Spectrum 的基于成本的优化器CBO集成,从而提升查询性能和潜在的成本节省。
数据湖的设计旨在以低成本存储大量原始、非结构化或半结构化数据,组织可以在多个部门和团队之间共享这些数据集。对这些大型数据集的查询读取了海量数据,并能够对多个数据集执行复杂的连接操作。在与客户交流时,我们了解到,数据湖性能优化的一大挑战是如何使这些分析查询更快速地执行。
数据湖性能优化对于涉及多个连接的查询尤其重要,而基于成本的优化器在此方面的帮助尤为显著。为了使 CBO 能够有效工作,需要根据数据变化采集和更新列统计信息。我们推出了生成列级统计信息的能力,例如,对于 AWS Glue 表上的 Parquet、ORC、JSON、Amazon ION、CSV 和 XML 文件生成唯一值数量、空值数量、最大值和最小值等统计信息。借助此项新功能,客户可以获得集成的端到端体验,Glue 表上的统计信息将被收集并存储在 AWS Glue 目录中,然后提供给分析服务以改善查询计划和执行。
解决方案概述
为了演示这一功能的有效性,我们采用了业界标准的 TPCDS 3 TB 数据集,并存储在亚马逊简单存储服务Amazon S3公共桶中。我们将比较在生成列统计信息前后,使用亚马逊 Athena 和亚马逊 Redshift Spectrum 执行查询时的性能表现。我们将提供在此文中使用的查询,并鼓励您尝试根据以下工作流程进行自己的查询。
工作流程包括以下高层步骤:
对 Amazon S3 桶进行目录化:利用 AWS Glue Crawler 爬取指定的 Amazon S3 桶,提取元数据,并无缝存储于 AWS Glue 数据目录中。我们将使用亚马逊 Athena 和亚马逊 Redshift Spectrum 查询这些表。生成列统计信息:利用 AWS Glue 数据目录的增强功能,为爬取的数据生成全面的列统计信息,从而为数据集提供有价值的见解。使用亚马逊 Athena 和亚马逊 Redshift Spectrum 查询:通过使用亚马逊 Athena 和亚马逊 Redshift Spectrum 执行对数据集的查询,评估列统计信息对查询性能的影响。步骤详述
为了实现解决方案,我们完成以下步骤:
使用 AWS CloudFormation 设置资源。在公共 Amazon S3 桶上运行 AWS Glue Crawler,以列出 3TB TPCDS 数据集。在 Amazon Athena 和亚马逊 Redshift 上运行查询,并记录查询持续时间。为 AWS Glue 数据目录表生成统计信息。再次在 Amazon Athena 和亚马逊 Redshift 上运行查询,并与之前的运行结果对比查询持续时间。可选:使用 AWS Lambda 和 Amazon EventBridge 调度程序安排 AWS Glue 列统计作业。用 AWS CloudFormation 设置资源
此文包括一个 AWS CloudFormation 模板,方便快速设置。您可以查看并根据需要自定义该模板。模板会生成如下资源:
一个 Amazon Virtual Private CloudVPC、公共子网、私有子网和路由表。一个 Amazon Redshift Serverless 工作组和命名空间。一个 AWS Glue 爬虫,用于爬取公共 Amazon S3 桶并为 TPCDS 数据集创建 Glue 数据目录表。AWS Glue 目录数据库和表。一个用于存储 Athena 结果的 Amazon S3 桶。AWS 身份和访问管理IAM 用户和策略。AWS Lambda 和 Amazon Event Bridge 调度器,用于安排 AWS Glue 列统计信息。要启动 AWS CloudFormation 堆栈,请完成以下步骤:
注意:AWS Glue 数据目录表是使用公共桶 s3//blogpostsparkoneksuseast1/blog/BLOGTPCDSTEST3Tpartitioned/ 创建的,该桶位于 useast1 区域。如果您打算在不同的区域部署此 AWS CloudFormation 模板,则需将数据复制到相应区域,或在您所部署区域内共享数据,以便亚马逊 Redshift 访问。
登录到 AWS 管理控制台 作为 AWS 身份和访问管理IAM管理员。选择“Launch Stack”来部署 AWS CloudFormation 模板。 选择 Next。在下一个页面上,保持所有选项为默认值或根据需求进行适当更改,然后选择 Next。在最后一页上,查看详细信息,并选择 I acknowledge that AWS CloudFormation might create IAM resources。选择 Create。该堆栈可能需要大约 10 分钟完成,完成后,您可以在 AWS CloudFormation 控制台上查看已部署的堆栈。
运行 AWS CloudFormation 堆栈创建的 AWS Glue 爬虫
要运行爬虫,请完成以下步骤:
在 AWS Glue 控制台的导航窗格中选择 Data Catalog 下的 Crawlers。找到并运行两个爬虫 tpcdsdbwithoutstats 和 tpcdsdbwithstats。这可能需要几分钟来完成。一旦爬虫成功完成,它将创建两个相同的数据库 tpcdsdbnostats 和 tpcdsdbwithstats。tpcdsdbnostats 中的表将没有统计信息,我们将把它们作为参考。在 tpcdsdbwithstats 中生成统计信息。请确认在 AWS Glue 控制台中查看这两个数据库及其底层表。
使用 Amazon Athena 在无统计信息的表上运行提供的查询
要在 Amazon Athena 上对无统计信息的表执行查询,请完成以下步骤:
从 这里 下载 Athena 查询。在 Amazon Athena 控制台中,逐个选择数据库 tpcdsdbnostats 的提供查询。运行查询并记录每个查询的 Run time。使用 Amazon Redshift Spectrum 在无统计信息的表上运行提供的查询
要在 Amazon Redshift 上运行无统计信息表的查询,请完成以下步骤:
从 这里 下载 Amazon Redshift 查询。在 Redshift 查询编辑器 v2,执行下载查询中的 Redshift Query for tables without stats 部分。运行查询,并记录每个查询的执行时间。在 AWS Glue 目录表上生成统计信息
要在 AWS Glue 目录表上生成统计信息,请完成以下步骤:
转到 AWS Glue 控制台,并选择 Data Catalog 下的数据库。点击 tpcdsdbwithstats 数据库,它将列出所有可用的表。选择这些表中的任何一个例如,callcenter。前往 Column statistics new 标签并选择 Generate statistics。保持默认选项。在 Choose columns 下选择 Table (All columns),在 Row sampling options 下选择 All rows,在 IAM 角色选择 AWSGluestatsblog,然后点击 Generate statistics。您将能够看到统计信息生成运行的状态。生成统计信息后,应能够查看该表的详细列统计信息。
重复步骤 25 为所有必要的表生成统计信息,如 catalogsales、catalogreturns、warehouse、item、datedim、storesales、customer、customeraddress、websales、timedim、shipmode、website 和 webreturns。或者,您可以在此博客的“安排 AWS Glue 统计信息运行”部分遵循操作,生成所有表的统计信息。完成后,评估每个查询的查询性能。

在有统计信息的表上使用 Athena 控制台运行提供的查询
在 Amazon Athena 控制台上,执行下载查询中的 Athena Query for tables with stats 部分。运行并记录每个查询的执行时间。在我们对表的样本查询运行中,我们观察到查询执行时间如下表所示。我们观察到查询性能有明显改善,提升范围在 13 到 55 之间。
Athena 查询时间改善
TPCDS 3T 查询无 Glue 统计秒有 Glue 统计秒性能改善Query 23362151755Query 413211729445Query 1413477914832Query 285599393630Query 382932255813使用 Amazon Redshift Spectrum 运行有统计信息的表上的查询
在 Amazon Redshift 查询编辑器 v2中,执行下载查询中的 Redshift Query for tables with stats 部分。运行查询,并记录每个查询的执行时间。在我们样本查询的执行中,我们观察到查询执行时间如下表所示。我们观察到查询性能的明显改善,范围在 13 到 89 之间。
Amazon Redshift Spectrum 查询时间改善
TPCDS 3T 查询无 Glue 统计秒有 Glue 统计秒性能改善Query 40124156131289Query 602952169742Query 6618914163913Query 9530880620035Query 99200641620安排 AWS Glue 统计运行
在本节中,我们将指导您通过 AWS Lambda 和 Amazon EventBridge 调度程序来安排 AWS Glue 列统计信息的运行。为简化此过程,AWS Lambda 函数和 Amazon EventBridge 调度器在 CloudFormation 堆栈部署时创建。
AWS Lambda 函数设置:我们将利用 AWS Lambda 函数触发 AWS Glue 列统计信息作业的执行。AWS Lambda 函数通过 boto3AWS SDK for Python库调用 startcolumnstatisticstaskrun API,从而实现自动化统计更新。
接下来,我们查看 AWS Lambda 函数:
进入 AWS Glue Lambda 控制台。选择 Functions,并找到 GlueTableStatisticsFunctionv1。为了更好地了解 AWS Lambda 函数,建议查看 Code 部分的代码以及 Configuration 下的环境变量。
Amazon EventBridge 调度器配置
下一步涉及使用 Amazon EventBridge 调度器 调度 AWS Lambda 函数的调用。调度器被配置为每天在特定时间这里是晚上 800触发 AWS Lambda 函数。这确保了 AWS Glue 列统计信息作业能够定期并可预测地运行。
现在,我们来看看如何更新调度:
打开 Amazon EventBridge 控制台。在 Amazon EventBridge 控制台中,选择 Schedules,以管理和配置事件的调度。清理
为避免产生不必要的费用,请删除 AWS 资源:
登录到 AWS CloudFormation 控制台,作为用于创建 AWS CloudFormation 堆栈的 AWS IAM 管理员。删除所创建的 AWS CloudFormation 堆栈。结论
在本文中,我们向您展示了如何使用 AWS Glue 数据目录 为 AWS Glue 表生成列级统计信息。这些统计信息现已集成到亚马逊 Athena 和亚马逊 Redshift Spectrum 的基于成本的优化器中,从而提升查询性能并节省潜在成本。如需支持 Glue 目录统计信息在各种 AWS 分析服务中的使用,请参考 文档。
如有任何问题或建议,请在评论区留言。
关于作者
Sandeep Adwankar 是 AWS 的高级技术产品经理,居住在加州湾区,与全球客户合作,将商业和技术需求转化为使客户能够更好地管理、保护和访问数据的产品。
Navnit Shukla 是 AWS 的分析专员解决方案架构师。他热衷于帮助客户从数据中发现有价值的见解,通过他的专业知识构建创新的解决方案,使企业能够做出明智、以数据驱动的决策。他还著有《Data Wrangling on AWS》一书。可以通过 LinkedIn 与他联系。