核心摘要
- 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方案模板及性能调优咨询服务。