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不支持直接在命令后追加参数。
方法:用环境变量传递参数
- 修改你的脚本,从环境变量中读取参数:
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("参数不足")
- 运行时通过环境变量传递参数:
JOB_ARGS="arg1 arg2 arg3" pyspark < myScript.py
或者先导出环境变量再运行:
export JOB_ARGS="arg1 arg2 arg3" pyspark < myScript.py
这种方式可以绕开pyspark不支持直接传参的限制,让脚本正常获取到参数。
内容的提问来源于stack exchange,提问作者Jérémie
相关产品推荐
相关产品推荐

