Zeppelin中PySpark训练随机森林时无法导入Numpy问题求助
解决PySpark在Zeppelin中训练模型时的numpy找不到问题
我一眼就看出问题所在了——你虽然在Zeppelin里把PySpark解释器指向了conda环境的Python,但Spark的executor进程(哪怕是本地模式下的worker)并没有使用这个环境!
直接在笔记本里执行import numpy as np没问题,是因为这段代码跑在Zeppelin的driver进程里,已经用上了你配置的conda环境;但当你调用rf.fit()时,Spark会把任务分发到executor去执行,这时候worker进程默认用的是系统自带的Python(或者Spark默认配置的Python),而这个环境里没装numpy,自然就报ModuleNotFoundError了。
下面给你几个靠谱的解决办法:
方法1:在Zeppelin的Spark解释器全局配置中设置
这是最推荐的方式,一次配置所有笔记本生效:
- 打开Zeppelin的解释器管理页面,找到Spark解释器
- 添加两个环境变量配置:
spark.executorEnv.PYSPARK_PYTHON:值设为你conda环境中Python的绝对路径,比如/home/user/miniconda3/envs/your_env/bin/pythonspark.driverEnv.PYSPARK_PYTHON:同样设为上面的路径,确保driver和executor用同一个Python环境
- 保存配置,重启Spark解释器
方法2:在单个笔记本开头临时配置
如果不想改全局配置,可以在当前笔记本最开头添加这段代码:
%spark.pyspark import os # 替换成你的conda环境Python路径 conda_python_path = "/home/user/miniconda3/envs/your_env/bin/python" os.environ['PYSPARK_PYTHON'] = conda_python_path os.environ['PYSPARK_DRIVER_PYTHON'] = conda_python_path
方法3:修改Spark的全局配置文件(spark-env.sh)
如果你的Spark是独立部署的,也可以直接修改Spark的环境配置:
- 找到Spark安装目录下的
conf/spark-env.sh(如果没有就复制spark-env.sh.template重命名) - 添加两行:
export PYSPARK_PYTHON=/home/user/miniconda3/envs/your_env/bin/python export PYSPARK_DRIVER_PYTHON=/home/user/miniconda3/envs/your_env/bin/python
- 重启Spark和Zeppelin服务
验证配置是否生效
可以运行这段代码检查executor使用的Python路径,确认是不是你的conda环境:
result = sc.parallelize([1,2,3]).map(lambda x: __import__('sys').executable).collect() print(result)
如果输出的都是你conda环境的Python路径,说明配置成功了,再去跑随机森林模型应该就没问题了。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

