AWS Glue Job启用书签后仍重复读取S3 CSV文件问题
AWS Glue Job 书签未实现增量读取的排查与修复
已通过CDK配置并启用AWS Glue Job书签(控制台确认状态为启用),但读取S3上的CSV文件时,每次运行仍全量读取所有数据,未实现预期的增量效果:
- 预期:首次运行输出全量数据,无新增数据时二次运行无输出,新增数据后仅输出新增行
- 实际:每次运行均输出全部数据
1. 确认书签键(jobBookmarkKeys)的正确配置
jobBookmarkKeys需要指定CSV文件中唯一递增的字段(如时间戳、自增ID),且数据必须按该字段排序。同时需确保以下配置正确:
transformation_ctx参数在整个Job执行过程中保持唯一,不能重复使用- 若CSV包含表头,必须启用
format_options中的withHeader,否则无法识别书签键字段
修改后的读取代码示例:
dynamic_frame = glue_context.create_dynamic_frame.from_options( connection_type="s3", format="csv", format_options={ "withHeader": True }, connection_options={ "paths": [csvFilePath], "jobBookmarkKeys": ["your_incremental_column"], # 替换为实际递增字段名 "jobBookmarkKeysSortOrder": "asc" }, transformation_ctx="unique_csv_read_ctx" # 确保该值全局唯一 )
2. 调整S3数据存储结构(核心问题)
Glue Job书签对单个CSV文件的追加数据不支持行级增量——书签默认跟踪文件的最后修改时间,而非文件内的行。只要文件被修改(如追加行),Glue会重新读取整个文件。
解决方法:
- 将CSV数据按分区存储(例如按日期划分子文件夹:
s3://bucket/path/date=2024-05-20/),新增数据写入新的分区文件夹 - 转换数据格式为Parquet等支持行级增量的列式存储格式,配合Glue的增量读取能力
3. 修正Job初始化与提交逻辑
自定义JVM层的初始化和提交逻辑可能干扰Glue书签状态的持久化,需确保使用标准的Glue Job提交流程,避免重复初始化:
修改ETL脚本中的main方法:
def main(self): args = getResolvedOptions(sys.argv, [ self.JOB_NAME, self.JOB_CLASS, self.ARGS, self.JOB_ID, self.OPTIONAL_ARGS, self.MODULE ]) print(args) glueContext = GlueContext(self.spark_context) job = Job(glueContext) job.init(args[self.JOB_NAME], args) # 移除自定义_jvm.GlueJob相关调用,直接执行业务逻辑 result = MyGlueTesJob.execute(self.spark_context, args) job.commit() # 仅保留标准提交逻辑,确保书签状态正确持久化
4. 重置Job书签状态
若之前Job在未启用书签的状态下运行过,可能导致书签状态异常,可通过以下方式重置:
- 控制台:进入Glue Job详情页,点击
Actions->Reset job bookmark - CLI命令:
aws glue reset-job-bookmark --job-name <your-job-name>
内容的提问来源于stack exchange,提问作者rajeswar reddy Meka
相关产品推荐
相关产品推荐

