解决python3和jupyter-notebook中的报错No module named pyspark和No module named ‘py4j’

背景描述:
在centos7–CDH6下配置了spark2.4和hive2.3,在linux-shell中输入pyspark可以正常启动,执行下列语句可正常显示

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("Python Spark SQL Hive integration example").enableHiveSupport().getOrCreate()
spark.sql("show databases").show()
spark.sql("select * from db.table").show() #db代表数据库名,table表示该数据库下的表名

随后启动python,执行语句import spark时报错:No module named pyspark;
进入jupyter-notebook,执行语句import spark时同样报错:No module named pyspark;
解决思路:
虽然网络上的方法总结起来就两种:一种是在./.bashrc中增加对应的环境变量,好处是一劳永逸;另一种是下载finspark模块,利用该模块引入spark环境,不方便的地方是每次运行脚本时都得加载这段代码。但是我却着实花了好长一段时间,用网上的方法试了又试,才终于解决,在此做个记录,也希望能帮助受相同困扰的朋友。

解决方案:

(1)

解决Python-shell报错No module named pyspark
方法:在./.bashrc中增加对应的环境变量

首先,找到你的存放spark的路径,如果不记得了,使用命令find -name spark,如果返回多个路径而你又不能确定的话,一个一个进去看,比如,我这返回了/etc/spark,/opt/cdh6/lib/spark,/var/spark,输入cd 路径,发现/opt/cdh6/lib/spark路径下的文件如下
在这里插入图片描述
说明/opt/cdh6/lib/spark就是我们所要找的spark路径;接着cd python,该路径的文件如下
在这里插入图片描述
找到了py4j文件的路径

然后,在linux-shell中输入如下命令:

cd ~
vim ./.bashrc

进入.bashrc文件,在后面增加如下的环境变量

export SPARK_HOME=/opt/cdh6/lib/spark #您的spark路径
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.7-src.zip
#您的py4j路径,解决No module named ‘py4j’
export PYSPARK_PYTHON=/usr/bin/anaconda3/python/bin/python3.7#您的python3路径

退出编辑(esc 模式下输入:wq),输入更新文件命令source ./.bashrc (多更新几次).
这时进入python,就能成功导入了。

解决python3和jupyter-notebook中的报错No module named pyspark和No module named ‘py4j’_第1张图片
注意:网上有其他的建议路径比如PYTHONPATH后面写的是SPARK_HOME/libexec或者SPARK_HOME/build,这些都不重要,重要的是你要找到对应的SPARK_HOME/python和SPARK_HOME/python/lib/py4j这两个路径,还有最后的PYSPARK_PYTHON输入您想要的Python版本对应路径,这对于同时安装了python2.x和python3.x的人来说非常重要。

(2)
解决jupyter-notebook报错No module named pyspark
刚解决完python-shell的问题,以为在jupyter-notebook下肯定没问题了,结果。。。
解决python3和jupyter-notebook中的报错No module named pyspark和No module named ‘py4j’_第2张图片
先说有效的解决方法,安装findspark模块,并且在脚本加入初始化spark环境的相关代码,具体操作如下:
先在linux-shell 中输入命令:pip install findspark
再在Jupyternotebook的脚本下输入代码:

import findspark #行
findspark.init('/opt/cdh6/lib/spark') #之前找到的spark存放路径
from pyspark.sql import SparkSession

解决了问题!麻烦点就麻烦点吧,我也没找到其他解决方法了。

无效方法记录(尝试了挺多的,希望写出来有帮助):

无效方法一
在之前修改过的.bashrc文件下再加入一行环境变量:
export PYSPARK_DRIVER_PYTHON=/usr/bin/anaconda3/python/bin/ipython3
结果:不会报错,能正常启动pyspark,但在notebook上依然报错。。。

无效方法二
删除刚刚的PYSPARK_DRIVER_PYTHON的路径,改为:
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS=‘notebook’(或者notebook)
结果:启动pyspark报错,说没有’notebook’这个东西

无效方法三
删除无效方法二的路径,改为:
export PYSPARK_DRIVER_PYTHON=/usr/bin/anaconda3/python/bin/jupyter
export PYSPARK_DRIVER_PYTHON_OPTS=/usr/bin/anaconda3/python/bin/jupyter-notebook
结果:不会报错,能正常启动pyspark,但生成了一个新的notebook端口,而不是原来的notebook上能够正常import pyspark

无效方法四
在linux-shell下输入:conda install -c conda-forge pyspark==2.4.0
conda install -c cyclus java-jdk
结果:notebook上能够正常import pyspark,然而却不能与集群的hive相连接,只能够用spark默认的数据仓库,不是我们想要的结果。

终语:
在解决了导入问题后,尝试执行上述的代码,如果执行select部分的代码不成功,报错get_freq…,一定要注意版本问题,spark3.0要搭配hive2.3.6以上版本。

这个问题困扰了我许久,我觉得遇到问题还是先沉下心来分析错误,上网搜索相关的错误解决方法,找出比较详细和靠谱的,然后快速试验,一个不行换另一个,都不行的话分析背后可能原因,再赶紧变换关键词搜索,多试才行!

你可能感兴趣的:(pyspark,linux,python,python,linux,spark)