使用spark-submit运行Python Spark应用失败,但直接执行脚本正常
问题描述
按照Spark官方文档的「独立应用」示例编写了SimpleApp.py与setup.py文件,执行pip install .完成安装后,直接运行python SimpleApp.py可正常输出统计结果,但使用spark-submit --master local[*] SimpleApp.py执行时,仅输出ShutdownHookManager相关日志,无预期的统计结果,操作完全遵循文档步骤。
相关代码与执行信息
setup.py代码
from setuptools import setup, find_packages setup( name='my-spark-project', version='0.1', packages=find_packages(), install_requires=[ 'pyspark==3.5.1' # Add other dependencies here ], )
SimpleApp.py代码
"""SimpleApp.py""" from pyspark.sql import SparkSession logFile = "C:\\apache-spark\\README.md" # 需替换为你系统中存在的文件路径 spark = SparkSession.builder.appName("SimpleApp").getOrCreate() logData = spark.read.text(logFile).cache() numAs = logData.filter(logData.value.contains('a')).count() numBs = logData.filter(logData.value.contains('b')).count() print("Lines with a: %i, lines with b: %i" % (numAs, numBs)) spark.stop()
执行命令
> pip install . > spark-submit --master local[*] SimpleApp.py
执行结果
Python24/04/05 14:22:35 INFO ShutdownHookManager: Shutdown hook called 24/04/05 14:22:35 INFO ShutdownHookManager: Deleting directory C:\Users\hendr\AppData\Local\Temp\spark-e91e861f-3f9b-4e18-b064-44bee42a2fb0
解决方案
1. 检查目标文件路径与存在性
spark-submit的工作目录可能和直接执行python时不同,导致代码中指定的logFile无法被找到:
- 在SimpleApp.py开头添加路径校验代码,明确提示文件状态:
import os logFile = "C:\\apache-spark\\README.md" if not os.path.exists(logFile): print(f"错误:文件 {logFile} 不存在!") exit(1) - 打印当前工作目录确认路径基准:
import os print(f"当前工作目录:{os.getcwd()}")
2. 调整Spark日志级别,暴露调试信息
默认日志级别可能隐藏了文件读取失败等关键错误,可通过以下方式调整:
- 创建SparkSession时配置日志级别:
spark = SparkSession.builder \ .appName("SimpleApp") \ .config("spark.driver.log.level", "INFO") \ .getOrCreate() - 或者在spark-submit命令中直接指定:
spark-submit --master local[*] --conf spark.driver.log.level=INFO SimpleApp.py
3. 解决PySpark环境冲突
通过pip install .安装的PySpark可能与spark-submit自带的PySpark版本冲突:
- 卸载已安装的PySpark:
pip uninstall -y pyspark,直接使用spark-submit自带的环境运行 - 确保spark-submit对应的Spark版本与代码中指定的
pyspark==3.5.1一致
4. 强制Driver端输出到控制台
部分环境下spark-submit会重定向Driver的标准输出,可通过配置强制显示:
spark-submit --master local[*] --conf spark.driver.stdout=console SimpleApp.py
内容的提问来源于stack exchange,提问作者HoLee Puk
相关产品推荐
相关产品推荐

