Amazon Glue Iceberg表Compaction合并优化中国区实现方案

核心摘要

  • AWS中国区域尚未上线Glue原生Compaction功能,本方案提供等效替代实现
  • 采用CloudFormation模板实现一键部署,通过Spark SQL的rewrite_data_files存储过程执行Binpack合并策略
  • 有效解决流式写入场景下Iceberg表小文件过多导致的查询性能下降问题
  • 方案完整覆盖部署脚本、Glue Job配置及测试验证流程

Amazon Glue Iceberg表Compaction合并优化中国区实现方案

背景与业务挑战

随着现代数据架构向开放式数据湖演进,越来越多企业选择将Apache Iceberg与AWS服务体系结合,构建高效的数据湖平台。在这一架构中,Amazon Glue承担着统一元数据管理的核心角色,用户可通过Crawler、ETL Jobs或API在Glue Data Catalog中注册和治理Iceberg表元数据。

然而,在实际生产环境中,特别是流式写入高频小批量写入场景下,Iceberg表会快速积累大量小文件。这一问题带来的影响是显著的:

  • 查询引擎需要读取成千上万个文件的元数据,产生巨大的I/O开销
  • Amazon Athena、Spark等引擎的查询性能严重下降
  • 存储成本和计算成本双重上升

从架构实践角度来看,Compaction合并是解决小文件问题的标准方案。AWS国际区域已于2023年11月发布了Glue原生Compaction功能,但中国区域目前尚未上线。考虑到2024年Snowflake中国区版本发布后,越来越多客户开始在中国区域构建基于Iceberg的数据湖平台,本方案旨在填补这一功能空白。

解决方案架构

本方案实现了与Amazon Glue Compaction功能等效的Binpack合并策略,核心思路是利用Spark SQL中Iceberg原生的rewrite_data_files存储过程执行文件合并操作。

方案组件说明

完整部署需要准备以下三个核心文件:

  • iceberg-compaction-template-minimal.yaml:CloudFormation模板文件,定义所有AWS资源
  • deploy-minimal.sh:自动化部署脚本,封装cloudformation deploy命令
  • iceberg_compaction.py:核心Python脚本,接收数据库和表名参数,调用rewrite_data_files执行合并逻辑

部署实施步骤

执行部署脚本

首先为部署脚本添加执行权限并运行:

chmod +x deploy-minimal.sh
./deploy-minimal.sh

脚本执行成功后,会输出S3存储桶名称。随后需要将Glue脚本上传至该桶的scripts目录:

aws s3 cp iceberg_compaction.py s3://<bucket-name>/scripts/

创建测试数据模拟小文件场景

为验证Compaction功能,需要先模拟包含大量小文件的Iceberg表。从CloudFormation堆栈输出中获取WarehouseBucketName值后,创建数据生成Glue Job:

aws glue create-job \
    --name "temp-data-generator" \
    --role "<your-role-arn>" \
    --command '{ "Name": "glueetl", "ScriptLocation": "s3://<bucket-name>/scripts/create_small_files.py", "PythonVersion": "3" }' \
    --glue-version "4.0" \
    --worker-type "G.1X" \
    --number-of-workers 2 \
    --default-arguments '{
        "--datalake-formats": "iceberg",
        "--conf": "spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.glue_catalog.warehouse=s3://<bucket-name>/warehouse/ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.catalog.glue_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.glue_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO",
        "--database_name": "sales_db",
        "--table_name": "transactions",
        "--s3_warehouse_path": "s3://<bucket-name>/warehouse/"
    }'

关键配置参数说明

–conf配置中,以下两个参数至关重要:

  • catalog-impl:指定使用Amazon Glue Data Catalog作为元数据存储,而非默认的Hive Metastore
  • io-impl:指定使用针对S3优化的I/O实现,提升数据文件读写性能

启动Job执行:

aws glue start-job-run --job-name "temp-data-generator"

该命令返回JobRunId后,可在Glue控制台监控任务状态。执行完成后,S3桶中将生成100个Parquet格式的小文件,模拟真实的小文件问题场景。

实践建议与优化策略

基于生产环境经验,建议在实施本方案时注意以下几点:

  • 调度策略:建议通过Amazon EventBridge设置定时触发,根据数据写入频率确定Compaction执行周期
  • 资源配置:对于大规模表,适当增加Glue Worker数量以加速合并过程
  • 监控告警:配置CloudWatch指标监控Compaction Job执行时长和成功率
  • 成本控制:在非业务高峰期执行Compaction,避免与查询负载竞争资源

需要优化您的 AWS 架构? 如果您正在中国区域构建基于Iceberg的数据湖平台,欢迎联系我们获取完整的Compaction方案模板及性能调优咨询服务。

AWS账单代付

AWS/阿里云/谷歌云官方认证架构师,专注云计算解决方案。