利用 Apache Iceberg 统计信息加速 AWS Glue 数据目录中的查询性能 大数据博客
使用 Apache Iceberg 统计提升 AWS Glue 数据目录的查询性能
关键要点
AWS Glue 数据目录现在支持为 Apache Iceberg 表生成列级聚合统计信息,以加速查询。统计信息通过成本优化器CBO在 Amazon Redshift Spectrum 和 Amazon Athena 中使用,提升查询性能并可能降低成本。Iceberg 表结构为数据湖提供 ACID 事务支持,优化分析数据集处理。通过使用 Theta Sketch 算法,高效生成并存储列统计信息。我们很高兴地宣布,AWS Glue 数据目录新增了一项功能:为 Apache Iceberg 表生成列级聚合统计信息,以加速查询。这些统计信息被 Amazon Redshift Spectrum 和 Amazon Athena 的成本优化器CBO利用,能显著提升查询性能并可能节省成本。
Apache Iceberg 是一种开放表格式,提供数据湖 ACID 事务能力,设计用于处理大规模分析数据集,并有效执行小行级操作。它还支持时间旅行、模式演变、隐藏分区等实用功能。
为了满足客户的反馈,AWS 在 Iceberg 的服务集成上进行了投资。其中一个例子就是 AWS Glue 数据目录。数据目录是一个集中存储元数据的仓库,使组织的数据可见、可搜索和可查询。数据目录支持 Iceberg 表,并跟踪表的当前元数据。同时,它允许对每个事务写入生成的小文件进行自动压缩,将其整合为几大个文件,以提高读取和扫描操作速度。
2023年,数据目录宣布支持对非 Iceberg 表的列级统计。借助新功能,现在数据目录将这一支持扩展至 Iceberg 表。数据目录生成的 Iceberg 表列统计基于Puffin 规范,并与其他表数据一起存储在Amazon S3上,使支持 Iceberg 的各种引擎能够利用和更新它们。
接下来的内容将演示 Iceberg 表的列统计如何与 Redshift Spectrum 和 Amazon Athena 一起工作,并展示 Iceberg 列统计相较于 TPCDS 数据集的性能优势。
Iceberg 表的列统计如何工作
AWS Glue 数据目录 利用Apache DataSketches 中的 Theta Sketch 算法生成表列统计信息,估算不同值NDV的数量,并将结果存储在 Puffin 文件中。
对于 SQL 规划者而言,NDV 是优化查询规划的重要统计数据。这些统计信息可在多个场景中优化查询性能。例如,在对两个表按某列进行联接时,优化器可以使用 NDV 估算联接的选择性。如果一个表的联接列的 NDV 较低,优化器可能会选择使用广播联接而非洗牌联接,从而减少数据移动并提高查询性能。此外,当涉及多个表联接时,优化器可以评估每个联接的输出大小并规划高效的联接顺序。NDV 还可用于各种优化,例如分组、去重和计数查询。
然而,持续计算 NDV 的 100 准确度需要 O(N) 的空间复杂度。Theta Sketch 是一种高效算法,可以在不需要存储所有不同值的情况下,估算数据集中的 NDV。其核心思想是将数据哈希到 01 之间,并依据阈值表示为 选择一小部分哈希值。通过分析这一小数据子集,Theta Sketch 算法可以为原始数据集提供 NDV 的准确估计。
Iceberg 的 Puffin 文件旨在以 blob 类型存储索引和统计信息。可以存储的典型 blob 类型包括 apachedatasketchesthetav1,其序列化值用于利用 Theta Sketch 算法估算 NDV。Puffin 文件与 Iceberg 元数据上的 snapshotid 相关联,并且被查询引擎的 CBO 所利用以优化查询计划。
通过 Amazon Redshift 利用 Iceberg 列统计
为了演示这一能力的性能优势,我们采用了行业标准的 TPCDS 3 TB 数据集。我们比较了在 Redshift Spectrum 和 Amazon Athena 中,使用和不使用 Iceberg 列统计的查询性能。以下是整体步骤:
运行 AWS Glue Job 从公共Amazon S3 存储桶提取 TPCDS 数据集,并将其保存为您自己 S3 存储桶中的 Iceberg 表。相应的 AWS Glue 数据目录 将存储这些表的元数据位置。通过 Amazon Redshift Spectrum 和 Amazon Athena 查询这些表。生成列统计:利用 AWS Glue 数据目录的增强功能为每个表生成列统计。该过程会生成存储 Theta Sketch 的 Puffin 文件。使用 Amazon Redshift Spectrum 和 Amazon Athena 查询:利用 Amazon Redshift Spectrum 和 Amazon Athena 在数据集上运行查询,评估列统计对查询性能的提升效果。下图展示了总体架构。
想要尝试这一新能力,请完成以下步骤:
通过 AWS CloudFormation 设置资源。运行 AWS Glue job,为您 S3 存储桶创建 3TB TPCDS 数据集的 Iceberg 表。数据目录会存储这些表的元数据位置。在 Redshift Spectrum 和 Amazon Athena 中运行查询并记录查询持续时间。针对数据目录的表生成 Iceberg 列统计。在 Redshift Spectrum 和 Amazon Athena 中运行查询,并与先前运行的查询持续时间进行比较。可选:使用 AWS Lambda 和 Amazon EventBridge 安排 AWS Glue 列统计作业。使用 AWS CloudFormation 设置资源
此文提供了用于快读设置的 CloudFormation 模板,您可以预览并根据需求进行自定义。注意,该 CloudFormation 模板需要至少三个可用区的区域。模板将生成以下资源:
一个虚拟私有云VPC、公共子网、私有子网和路由表一个 Amazon Redshift Serverless 工作组和命名空间一个 S3 存储桶,用于存放 TPCDS 数据集、列统计、作业脚本等数据目录数据库一个 AWS Glue 作业,用于从公共 S3 存储桶提取 TPCDS 数据集并将数据保存为您 S3 存储桶中的 Iceberg 表AWS 身份与访问管理IAM 角色和策略一个 Lambda 函数和 EventBridge 调度,用于定期运行 AWS Glue 列统计要启动 CloudFormation 堆栈,请完成以下步骤:
登录 AWS CloudFormation 控制台。选择 Launch Stack。选择 Next。根据需求修改参数或保持默认,然后选择 Next。在最后一页查看详细信息,并选择 我确认 AWS CloudFormation 可能会创建 IAM 资源。选择 Create。该堆栈大约需要 10 分钟完成,之后您可以在 AWS CloudFormation 控制台查看已部署的堆栈。
运行 AWS Glue 作业,为 3TB TPCDS 数据集创建 Iceberg 表
当 CloudFormation 堆栈创建完成后,运行 AWS Glue 作业为 TPCDS 数据集创建 Iceberg 表的操作。这一 AWS Glue 作业会从公共 S3 存储桶中提取 TPCDS 数据集,并将数据转换为 Iceberg 表。这些表会加载到您 S3 存储桶中并注册到数据目录。
要运行 AWS Glue 作业,请完成以下步骤:
在 AWS Glue 控制台中,选择导航窗格中的 ETL jobs。选择 InitialDataLoadJoblt您的堆栈名称gt。选择 Run。此 AWS Glue 作业可能需要约 30 分钟完成。当作业处理状态显示为 Succeeded 时,该过程即完成。
AWS Glue 作业将创建两个相同数据库中存储 TPCDS 数据集的表:tpcdsdbnostats 和 tpcdsdbwithstats。tpcdsdbnostats 中的表将不会生成任何统计信息,我们用其作为参考,而在 tpcdsdbwithstats 中的表将生成统计信息。请在 AWS Glue 控制台确认这两个数据库及其基础表的创建,此时这两个数据库都包含相同的数据,且未在表中生成任何统计信息。
在没有统计信息的情况下运行 Redshift Spectrum 查询
在之前的步骤中,您已设置了带有给定 RPU默认值为 128的 Redshift Serverless 工作组,准备了 S3 存储桶中的 TPCDS 3TB 数据集,并创建了没有统计信息的 Iceberg 表。
要在 Amazon Redshift 中运行查询,请完成以下步骤:
下载 Amazon Redshift 查询文件。在 Redshift 查询编辑器 v2 中,运行 redshifttpcdssamplesql 文件中 没有列统计的表查询 部分列出的查询。记录每个查询的运行时间。加速器免费安装在没有统计信息的情况下运行 Amazon Athena 查询
现在让我们也从 Amazon Athena 查询 TPCDS 表此时没有统计信息。要在 Amazon Athena 中运行查询,请完成以下步骤:
下载 Amazon Athena 查询文件。在 Athena 查询编辑器 中,运行 athenatpcdssamplesql 文件中 没有列统计的表查询 部分列出的查询。记录每个查询的运行时间。生成 Iceberg 列统计
要为数据目录的表生成统计信息,请完成以下步骤:
在 AWS Glue 控制台中,选择导航窗格中的 Databases 下的 Data Catalog。选择数据库 tpcdsdbwithstats 查看所有可用表。选择其中任何一个表例如 callcenter。转到 Column statistics new,然后选择 Generate statistics。保持默认选项:对于 Choose columns,选择 Table (All columns)。对于 Row sampling options,选择 All rows。对于 IAM role,选择 AWSGluestatsbloglt您的堆栈名称gt。选择 Generate statistics。您将看到生成统计运行的状态,如下图所示。
一旦生成 Iceberg 表的列统计,您将能看到该表的详细列统计信息。
在高级属性部分,您将发现表属性 useicebergstatistics=true。此参数由 Glue 列统计作业添加。Amazon Athena 仅在该参数设置为 true 时尝试利用列统计。而 Amazon Redshift 则默认在有统计可用时利用它们,不受此参数影响。

生成统计后,您将在 AWS Glue 表的底层数据位置中找到一个 ltidgtstat 文件。该文件是存储 Theta Sketch 数据结构的 Puffin 文件。查询引擎可以利用这一Theta Sketch算法在操作表时高效估算 NDV,从而帮助优化查询性能。
在线生成所有表的统计信息,如 catalogsales、catalogreturns、warehouse、item、datedim、storesales、customer、customeraddress、websales、timedim、shipmode、website 和 webreturns。或者,您可以手动运行指示 AWS Glue 为所有表生成列统计的信息 Lambda 函数,该函数在本文后面会对此进行详细讨论。
完成所有表统计生成后,您可以评估每个查询的查询性能。
使用统计信息在 Redshift Spectrum 中运行查询
在之前的步骤中,您为 Redshift Serverless 工作组设置了给定的 RPU默认值为 128,准备了 S3 存储桶中的 TPCDS 3TB 数据集,并创建了带列统计的 Iceberg 表。
要在包括统计的表上使用 Redshift Spectrum 运行查询,请完成以下步骤:
在 Redshift 查询编辑器 v2 中,运行 redshifttpcdssamplesql 文件中 有列统计的表查询 部分列出的查询。记录每个查询的运行时间。使用 Redshift Serverless 的 128 RPU 和 TPCDS 3TB 数据集,我们对 10 个选定的 TPCDS 查询进行了样本测试,预计 NDV 信息能带来好处。我们对每个查询进行了 10 次运行。下表显示的结果按有列统计的查询性能提升百分比排序。
TPCDS 3T 查询没有列统计有列统计性能提升 ()查询 163050284517807830查询 7539806431108366722查询 781698358528951689查询 95352996111047685查询 9416052570321645查询 6814651774745490查询 42178954121996440
发表评论