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

Docker配置的Glue ETL PySpark环境中脚本参数传递问题及spark-submit适配方案咨询

针对你在Docker中运行AWS Glue PySpark脚本遇到的问题,我提供两个可行的解决方案,分别对应你提到的两种需求:


方案1:让spark-submit能够正常运行Glue脚本

你遇到的ModuleNotFoundError: No module named 'dynamicframe'错误,本质是因为spark-submit默认没有加载AWS Glue专属的Python模块和依赖Jar包。Glue的核心模块(比如awsglue下的各类组件)都打包在特定的zip和Jar文件中,需要在spark-submit时显式指定。

步骤1:确认Glue依赖路径

在你的Docker Glue环境中,通常会有一个存放Glue依赖的目录(比如/usr/share/aws/glue/libs/),里面包含:

  • awsglue.zip:Glue的Python模块集合
  • glue-assembly-*.jar:Glue的Java依赖Jar

步骤2:修改脚本中的SparkSession引用

你的原脚本中直接使用spark.read,但在spark-submit环境中spark变量并未自动初始化,建议通过GlueContext获取SparkSession:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)
# 从GlueContext获取SparkSession
spark = glueContext.spark_session

medicare = spark.read.format("com.databricks.spark.csv").option("header", "true").option("inferSchema", "true").load('s3://awsglue-datasets/examples/medicare/Medicare_Hospital_Provider.csv')
medicare.printSchema()

步骤3:使用带参数的spark-submit命令

运行脚本时,指定Glue的依赖包和必要的S3配置(如果需要访问S3),同时传递参数:

spark-submit \
  --py-files /usr/share/aws/glue/libs/awsglue.zip \
  --jars /usr/share/aws/glue/libs/glue-assembly-1.0.jar \
  --conf spark.hadoop.fs.s3a.endpoint=s3.amazonaws.com \
  --conf spark.hadoop.fs.s3a.access.key=YOUR_ACCESS_KEY \
  --conf spark.hadoop.fs.s3a.secret.key=YOUR_SECRET_KEY \
  myScript.py arg1 arg2 arg3

这样就能像你习惯的方式一样传递参数,脚本中可以通过sys.argv正常读取。


方案2:在pyspark命令中传递参数

如果暂时不想切换到spark-submit,也可以通过环境变量的方式传递参数,因为pyspark不支持直接在命令后追加参数。

方法:用环境变量传递参数

  1. 修改你的脚本,从环境变量中读取参数:
import sys
import os
from pyspark import SparkContext
from awsglue.context import GlueContext

glueContext = GlueContext(SparkContext.getOrCreate())
# 从环境变量中获取参数并分割
args = os.environ.get('JOB_ARGS', '').split()
if len(args) >=3:
    print(args[0] + " " + args[1] + " " + args[2])
else:
    print("参数不足")
  1. 运行时通过环境变量传递参数:
JOB_ARGS="arg1 arg2 arg3" pyspark < myScript.py

或者先导出环境变量再运行:

export JOB_ARGS="arg1 arg2 arg3"
pyspark < myScript.py

这种方式可以绕开pyspark不支持直接传参的限制,让脚本正常获取到参数。


内容的提问来源于stack exchange,提问作者Jérémie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:52:56