Glue任务循环读取Parquet写入Aurora速度慢,有什么优化方法?
性能优化方案
当前逐个读取文件+同步单条写入的瓶颈主要在两部分:一是单文件小IO读取的开销过高,二是数据库单条提交的事务开销远大于数据写入本身,可按以下层级优化:
读取+数据合并优化
- 替换单文件循环读取逻辑,使用Pandas/Arrow的Parquet批量读取能力,一次性加载符合时间范围的多个Parquet文件到内存批次,单批次大小可按内存配置设为1~10万条。
- 数据合并操作前置到内存批次中完成:如果需要对重复主键记录去重、同主键字段做聚合计算,直接在批次内存里处理后再写入数据库,减少实际需要入库的数据量。
- 过滤逻辑提前到读取阶段:读取Parquet时直接根据水位文件的
last_modified_time和end_time做行过滤,不需要加载全量数据后再筛选,大幅降低无效IO。
数据库写入优化
- 把单条同步写入改为批量提交,使用Aurora支持的批量INSERT语法,每批次提交1000~10000条记录,可降低90%以上的事务提交开销。
- 关闭数据库连接的自动提交配置,按写入批次手动提交事务,避免每次写入都触发磁盘刷写。
- 无行锁冲突的场景下可开启并行写入,用多线程/多进程同时写入不同批次的数据,Aurora兼容MySQL/PostgreSQL的并发写入机制,合理设置4~8的并发度可提升数倍写入效率。
大数据量场景的全链路方案
如果数据量达到百GB/TB级别,可直接使用AWS原生能力跳过自定义读写逻辑:
- 无需做自定义数据处理的场景,直接使用Aurora的S3数据导入语句:
LOAD DATA FROM S3 's3://bucket/app-events/year=201909/' INTO TABLE your_table_name PARQUET WHERE modified_time BETWEEN '2021-09-01 00:00:00' AND '2022-09-02 23:59:59';
该操作由Aurora内部实现并行读取、批量写入,效率比自定义代码高5~10倍。
- 需要做自定义合并逻辑的场景,可使用PySpark或者AWS Glue ETL作业,分布式读取S3 Parquet文件完成数据合并后,批量写入Aurora,TB级数据处理耗时通常在半小时以内。
内容的提问来源于stack exchange,提问作者Iram
相关产品推荐
相关产品推荐

