如何通过Spark REST API提交带--py-files等效配置的PySpark应用
解决Spark REST API提交PySpark应用时依赖egg包的问题
问题背景
通过spark-submit命令可正常提交PySpark应用,命令如下:
spark-submit --master "spark://192.168.93.42:7077" --name "TopologyDiscovery" --conf spark.eventLog.enabled=true --py-files /opt/bitnami/spark/application/pyoneer-0.0.1-py3.11.egg /opt/bitnami/spark/application/app.main.py --start 2018-09-21 --end 2018-09-22 --trafoids SIM01
但通过Spark REST API提交时,找不到对应--py-files的配置项,导致出现ModuleNotFoundError: No module named 'app'错误,此前尝试配置appResource、spark.jars等字段均无效。
标准解决方案
Spark REST API中,对应命令行--py-files参数的配置项是**spark.submit.pyFiles**,需将其添加到sparkProperties中,同时调整appResource指向驱动脚本而非依赖egg包。
修改后的提交请求JSON
{ "appResource": "/opt/bitnami/spark/application/app.main.py", "sparkProperties": { "spark.master": "spark://192.168.93.42:7077", "spark.eventLog.enabled": "true", "spark.app.name": "TopologyDiscovery", "spark.driver.supervise": "false", "spark.submit.deployMode": "client", "spark.submit.pyFiles": "/opt/bitnami/spark/application/pyoneer-0.0.1-py3.11.egg" }, "clientSparkVersion": "3.2.1", "mainClass": "org.apache.spark.deploy.SparkSubmit", "environmentVariables": { "SPARK_ENV_LOADED": "1" }, "action": "CreateSubmissionRequest", "appArgs": ["--start", "2018-09-21", "--end", "2018-09-22", "--trafoids", "SIM01"] }
关键调整说明
appResource:指定PySpark应用的驱动入口文件(即app.main.py),而非依赖的egg包,与命令行中最后指定的脚本路径对应。spark.submit.pyFiles:对应命令行的--py-files参数,用于指定Python依赖文件(egg、zip、py等),Spark会自动将这些资源分发到集群节点并添加到Python路径中。appArgs:仅保留应用自身的参数(--start、--end等),无需再包含驱动脚本路径,因为appResource已明确指定。- 移除
spark.jars配置:该参数用于指定Java/Scala的JAR依赖,不适用于Python的egg包。
内容的提问来源于stack exchange,提问作者Santiago Miguel Aranda Rojas
相关产品推荐
相关产品推荐

