Linux环境下如何通过spark-submit运行经PyInstaller转成二进制的py文件
PySpark脚本加密后适配spark-submit运行的可行方案
针对你遇到的PyInstaller打包后二进制文件无法被spark-submit加载的问题,以下3种经过验证的方案可按需选择:
方案1:使用Python字节码(.pyc)加密(实现成本最低)
- 原理:Python编译后的字节码文件无法直接查看源码,且原生支持被spark-submit加载执行
- 操作步骤:
- 执行编译命令生成字节码:
python -m compileall your_script.py - 进入生成的
__pycache__目录,找到对应your_script.cpython-xx.pyc文件,重命名为your_script.pyc - 直接将重命名后的pyc文件分享给对方,对方可直接执行
spark-submit your_script.pyc,运行效果和原py文件完全一致
- 执行编译命令生成字节码:
- 注意事项:编译使用的Python大版本需和对方运行环境的Python大版本完全匹配,否则会出现字节码不兼容报错
方案2:使用Cython编译核心逻辑为动态链接库(最推荐)
- 原理:将核心业务逻辑编译为.so(Linux)/ .pyd(Windows)动态链接库,完全无法反编译为原始源码,同时可以被Python正常导入调用,兼容spark-submit的加载逻辑
- 操作步骤:
- 拆分代码:把核心逻辑封装到单独的py文件(比如
core_logic.py)中,保留一个极简入口文件run.py,仅负责导入核心逻辑并启动执行 - 编写Cython编译配置文件
setup.py,内容示例:
from setuptools import setup from Cython.Build import cythonize setup(ext_modules = cythonize("core_logic.py"))- 执行编译命令:
python setup.py build_ext --inplace,生成对应的动态链接库文件 - 分享时仅需要提供入口文件
run.py和生成的动态链接库文件,对方执行命令提交即可:spark-submit --py-files core_logic.so run.py
- 拆分代码:把核心逻辑封装到单独的py文件(比如
- 优势:安全性最高,完全兼容spark-submit的所有原生参数,不需要修改原有业务逻辑
方案3:全依赖打包为独立二进制(无需依赖spark-submit)
- 原理:如果你不需要用到spark-submit的动态参数配置能力,可以把PySpark、Py4J等所有依赖全部打入PyInstaller的二进制包中,用户直接执行二进制即可,不需要通过spark-submit提交
- 操作步骤:
- 执行打包命令:
pyinstaller --onefile --hidden-import pyspark --hidden-import py4j your_script.py - 打包完成后,dist目录下的二进制文件即可直接分享,用户执行
./your_script即可运行
- 执行打包命令:
- 注意事项:需要确保对方运行环境的Spark相关环境变量(SPARK_HOME、HADOOP_CONF_DIR等)配置正确,可正常连接到目标Spark集群
内容的提问来源于stack exchange,提问作者Jayant Malhotra
相关产品推荐
相关产品推荐

