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

  • 操作实现:

    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/

    2. 进入 ~/.bashrc 文件

      [root@master src]# vim ~/.bashrc 
      
    3. 添加如下内容:

      export PYSPARK_PYTHON=/usr/local/src/python3/python3/ #指定 pyspark 启动时使用的 python(修改为 python3)
      export PYSPARK_DRIVER_PYTHON=ipython3 #指定启动 pyspark 后的交互式界面(顺便修改为 python3)
      
    4. 保存退出,加载生效

      [root@master ~]# source ~/.bashrc
      
    5. 测试是否成功:

      [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
      ....
      

      可见修改成功,没有出现找不到包的问题

  • 心路历程:修改这个错误,我找了很多办法,包括但不限于:

    1. 修改代码文件

      • 因为 spark 是测试过能跑的,所以觉得应该是文件出问题了,于是把文件里里外外看透了,发现没有能影响 import 的代码
    2. 切换权限:

      • 因为一般使用的都是普通用户进行操作,但是安装软件一般以 root 安装,安装后再赋予权限。所以觉得可能权限有些没有赋予到,于是修改权限
    3. 添加依赖

      • 看见说:因为运行 Python 脚本的集群上的 Python 环境里缺乏脚本运行需要的依赖,所以尝试添加依赖:将需要的第三方库打成 zip,通过 spark-submit 命令的 –py-files 参数添加
      • 又说:如果软件包依赖于已编译的代码(比如 Numpy),并且自己集群中的计算机具有与自己编译 egg 的代码不同的 CPU体系结构,则这种方式不起作用。说主要原因是 Python 不允许动态导入 .so 文件,而 Numpy 由于是 C 编译的,存在 *.so文件
    4. 更新 numpy:

      • 说是版本低,可能会出问题,于是又查看自己的版本,又查看 numpy 是不是最新版,发现是最新版

        查看本机的模块版本:pip show numpy

        查看所有模块版本:pip install numpy==

      • 跟这个类似的,说没有安装 numpy 模块,又去自己 python3 的 lib 找是不是没有,发现是有的

    5. 重装 spark

      • 经过太多无头无脑的修改,实在疲惫了,就卸载重装了,结果还是报错
    6. 卸载本机 python2

      • 找着找着想起,有没有可能是因为冲突了,所以打算卸载 python2,通过命令查询,发现有很多包,又不是很清楚那些能够卸载,就放弃了这个操作

        1. 查询已安装的 python:rpm -qa|grep python
        2. 强制删除已安装 python 及其关联:rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps
        3. 删除残余文件:whereis python|xargs rm -frv
    7. 最后修改 ~/.bashrc

      • 顺着两个版本冲突的想法,想到了查查 pyspark 默认的 python 解释器,才得以解决这个问题
posted @   你是我的生命之源  阅读(616)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期

阅读目录(Content)

此页目录为空

页脚
点击右上角即可分享
微信分享提示