pyspark 提交任务出现 ImportError: No module named numpy
-
问题代码:
[root@master ~]# /usr/local/src/spark/bin/spark-submit --master=local /usr/local/test.py Traceback (most recent call last): File "/usr/local/src/python3/data/yq/sparktest.py", line 7, in <module> import numpy as np ImportError: No module named numpy
-
问题原因:
- 经过近半天的排查发现是因为 pyspark 默认使用 python2 解释器:电脑装有 python2 和 python3,我使用的是 python3,所以所有第三方库均下载到 python3,所以 python2 没有 numpy 库
-
解决办法:将 pyspark 的解释器设置为 python3 解释器
-
未修改时:
[root@master src]# spark/bin/pyspark Python 2.7.5 (default, Jun 28 2022, 15:30:04) ...... Using Python version 2.7.5 (default, Jun 28 2022 15:30:04) SparkSession available as 'spark'. >>> exit
进入 pyspark 后可以看到显示的默认解释器为 python2.7.5
-
修改后:
[root@master src]# spark/bin/pyspark Python 3.9.1 (default, Sep 14 2022, 18:07:28) Type 'copyright', 'credits' or 'license' for more information ...... Using Python version 3.9.1 (default, Sep 14 2022 18:07:28) SparkSession available as 'spark'. In [1]: exit();
可以看见更换为了 python3.9.1
-
-
操作实现:
-
查看本机 python 地址,用于修改
[root@master ~]# whereis python python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/local/src/python3/python3/bin/python3.9 /usr/local/src/python3/python3/bin/python3.9-config /usr/share/man/man1/python.1.gz
可见我有两个版本 python,记住 python3 地址:
/usr/local/src/python3/python3/
-
进入
~/.bashrc
文件[root@master src]# vim ~/.bashrc
-
添加如下内容:
export PYSPARK_PYTHON=/usr/local/src/python3/python3/ #指定 pyspark 启动时使用的 python(修改为 python3) export PYSPARK_DRIVER_PYTHON=ipython3 #指定启动 pyspark 后的交互式界面(顺便修改为 python3)
-
保存退出,加载生效
[root@master ~]# source ~/.bashrc
-
测试是否成功:
[root@master ~]# /usr/local/src/spark/bin/spark-submit --master=local /usr/local/test.py /usr/local/src/spark/python/lib/pyspark.zip/pyspark/cloudpickle.py:365: SyntaxWarning: "is" with a literal. Did you mean "=="? /usr/local/src/spark/python/lib/pyspark.zip/pyspark/cloudpickle.py:365: SyntaxWarning: "is" with a literal. Did you mean "=="? Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties ....
可见修改成功,没有出现找不到包的问题
-
-
心路历程:修改这个错误,我找了很多办法,包括但不限于:
-
修改代码文件
- 因为 spark 是测试过能跑的,所以觉得应该是文件出问题了,于是把文件里里外外看透了,发现没有能影响 import 的代码
-
切换权限:
- 因为一般使用的都是普通用户进行操作,但是安装软件一般以 root 安装,安装后再赋予权限。所以觉得可能权限有些没有赋予到,于是修改权限
-
添加依赖
- 看见说:因为运行 Python 脚本的集群上的 Python 环境里缺乏脚本运行需要的依赖,所以尝试添加依赖:将需要的第三方库打成 zip,通过
spark-submit
命令的–py-files
参数添加 - 又说:如果软件包依赖于已编译的代码(比如 Numpy),并且自己集群中的计算机具有与自己编译 egg 的代码不同的 CPU体系结构,则这种方式不起作用。说主要原因是 Python 不允许动态导入 .so 文件,而 Numpy 由于是 C 编译的,存在 *.so文件
- 看见说:因为运行 Python 脚本的集群上的 Python 环境里缺乏脚本运行需要的依赖,所以尝试添加依赖:将需要的第三方库打成 zip,通过
-
更新 numpy:
-
说是版本低,可能会出问题,于是又查看自己的版本,又查看 numpy 是不是最新版,发现是最新版
查看本机的模块版本:pip show numpy
查看所有模块版本:pip install numpy==
-
跟这个类似的,说没有安装 numpy 模块,又去自己 python3 的 lib 找是不是没有,发现是有的
-
-
重装 spark
- 经过太多无头无脑的修改,实在疲惫了,就卸载重装了,结果还是报错
-
卸载本机 python2
-
找着找着想起,有没有可能是因为冲突了,所以打算卸载 python2,通过命令查询,发现有很多包,又不是很清楚那些能够卸载,就放弃了这个操作
- 查询已安装的 python:rpm -qa|grep python
- 强制删除已安装 python 及其关联:rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps
- 删除残余文件:whereis python|xargs rm -frv
-
-
最后修改
~/.bashrc
- 顺着两个版本冲突的想法,想到了查查 pyspark 默认的 python 解释器,才得以解决这个问题
-