Glue作业Redshift增量同步S3时transformation_ctx元数据未存储问题
Glue作业Redshift源增量同步(作业书签)失效问题原因及修复方案
- 首先检查Glue作业的作业书签开关是否启用:
你需要在Glue控制台的作业配置页,将「作业书签」选项设置为启用,仅代码中添加job.init()和job.commit()无法生效,必须同时开启控制台配置。 - 作业书签键与实际增量列名不匹配:
你提到Redshift表中的时间戳增量列是date_col,但代码中配置的jobBookmarkKeys为["timestamp"],二者完全不匹配,Glue无法识别正确的增量判断列。需要将该配置改为和实际列名完全一致,同时注意列名大小写必须和Redshift表中的定义完全匹配。 transformation_ctx值不固定:
你代码中transformation_ctx使用变量table_name赋值,需要确保该变量值在每次作业运行时保持固定,Glue以该值作为唯一标识存储书签元数据,值发生变化时会判定为新的数据源,默认拉取全量数据。- 作业书签参数配置位置错误:
Redshift数据源的作业书签相关参数需直接放在connection_options中,而非additional_options内,同时需额外添加"jobBookmarkEnabled": "true"参数明确启用书签。 - Glue版本兼容性问题:
Glue 2.0及更早版本对Redshift JDBC源的作业书签支持存在缺陷,建议将作业运行环境升级到Glue 3.0及以上版本。 - 临时目录权限不足:
Glue作业关联的IAM角色需要拥有你配置的s3://madl-temp/redshift_temp/路径的s3:PutObject、s3:GetObject、s3:ListBucket权限,权限不足时书签元数据无法写入S3,导致每次运行都拉取全量。 - 运行次数或书签重置问题:
作业首次运行时默认拉取全量数据,第二次及后续运行才会返回增量数据;如果之前手动重置过作业书签,下一次运行也会重新拉取全量。
修正后的参考代码
import sys from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job import logging args = getResolvedOptions(sys.argv, ['JOB_NAME']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) log = logging.getLogger(__name__) log.setLevel(logging.INFO) my_conn_options = { "url": "你的Redshift连接URL", "dbtable": "你的表名", "user": "用户名", "password": "密码", "redshiftTmpDir": "s3://madl-temp/redshift_temp/", # 书签相关参数放在connection_options中 "jobBookmarkEnabled": "true", "jobBookmarkKeys": ["date_col"], "jobBookmarkKeysSortOrder": "asc" } data = glueContext.create_dynamic_frame_from_options( connection_type="redshift", connection_options=my_conn_options, # 确保该值固定不变 transformation_ctx="redshift_your_table_name_sync_ctx" ).toDF() log.info(str(data.count())) # 你的数据处理、写入S3逻辑 job.commit()
内容的提问来源于stack exchange,提问作者whatsinthename
相关产品推荐
相关产品推荐

