You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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结果/")

常见错误排查

  1. IllegalSessionStateException:该错误是由于在GlueContext初始化后修改Spark核心配置导致的,所有依赖配置必须通过作业参数传递,而非脚本内调用spark.conf.set修改。
  2. 编解码器未生效:
    • 检查Glue作业的IAM角色是否有读取S3上splittablegzip jar包的权限
    • 确认splittablegzip版本与Glue 4.0的Spark 3.3版本兼容(建议使用官方最新兼容版本)
    • 若自动识别失败,可在读取时显式指定压缩格式:spark.read.option("compression", "splittablegzip").text(...)

内容的提问来源于stack exchange,提问作者leeprevost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:47:23