如何在AWS Glue 4.0作业中正确使用可拆分Gzip压缩编解码Jar包
解决AWS Glue 4.0中使用SplittableGzipCodec处理大.gz文件的配置问题
核心问题回顾
默认GzipCodec不可拆分,单一大.gz文件会被分配给单个Worker,无法利用Glue集群的并行能力。使用Neils Basjes的SplittableGzipCodec可实现解压时拆分文件,但Glue 4.0的配置逻辑与EMR不同,需调整作业参数和脚本写法。
正确配置步骤
1. 作业层面参数配置(关键)
在Glue作业的Job parameters中添加以下参数,不要在脚本中修改spark.jars.packages(Glue启动后该配置锁定,修改会触发AnalysisException):
--extra-jars:s3://你的存储桶路径/splittablegzip-1.3.jar(指向S3上的自定义编解码器jar包)--user-jars-first:true(确保自定义jar优先于Glue自带jar加载,避免类冲突)--conf:spark.hadoop.io.compression.codecs=nl.basjes.hadoop.io.compress.SplittableGzipCodec(将自定义编解码器加入Hadoop可用压缩列表)
2. 脚本层面正确写法
避免在GlueContext初始化后修改核心Spark配置,以下是标准示例:
import sys from awsglue.context import GlueContext from pyspark.context import SparkContext # 初始化上下文(不要在此处修改spark.jars相关配置) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session # 读取.gz文件:此时Spark会自动使用SplittableGzipCodec实现并行拆分读取 raw_df = spark.read.text("s3://你的输入存储桶/大型文件.gz") # 执行轻量转换逻辑(替换为你的业务代码) transformed_df = raw_df.filter(raw_df.value != "").withColumn("partition_col", ...) # 按分区写入Parquet transformed_df.write.partitionBy("partition_col").mode("overwrite").parquet("s3://你的输出存储桶/parquet结果/")
常见错误排查
- IllegalSessionStateException:该错误是由于在GlueContext初始化后修改Spark核心配置导致的,所有依赖配置必须通过作业参数传递,而非脚本内调用
spark.conf.set修改。 - 编解码器未生效:
- 检查Glue作业的IAM角色是否有读取S3上splittablegzip jar包的权限
- 确认splittablegzip版本与Glue 4.0的Spark 3.3版本兼容(建议使用官方最新兼容版本)
- 若自动识别失败,可在读取时显式指定压缩格式:
spark.read.option("compression", "splittablegzip").text(...)
内容的提问来源于stack exchange,提问作者leeprevost
相关产品推荐
相关产品推荐

