我前前后后花了两天时间才终于把环境调正确,以这篇文章叙述一下配置时的关键点。
pyspark-shell 有着所有交互式命令行的共同缺点,关掉后,已运行的代码也就随着一起销毁了,不能保存。说到兼具交互式命令行特点、代码保存功能、代码编译运行功能的软件,我们很自然就想到了jupyter notebook。事实上二代目jupyter lab也已经投入使用,但是我没有用它来集成,因为这是我遇到的第一个坑,目前jupyter lab只有高版本的Python才能下载(比如Python 3.8),而Spark截止到目前尚未兼容Python3.8。
所以在首先准备环境时一定要注意版本兼容性,我最终使用的是Spark 2.3.0(可以到官网下载spark-2.3.0-bin-hadoop2.7.tgz),hadoop 2.7.x(可以到github上下载windows下的hadoop 2.7.x/bin文件,替换当前的bin目录,关键是需要winutils.exe这个东西)以及 Python 3.6.2,当然你应该已经早已有了Java8
说到Python版本就涉及到版本控制问题,我建议安装一个Anaconda,可以使得同时存在多个Python版本,这是基于我早已单独下载了一个Python3.8,用了很久,第三方库很全,不愿卸载的原因。目前下载的是Anaconda3-Python3.8.8,也就是Base环境下是Python3.8.8版本,不符合我的需要,所以你应该先将Channel换成中科大的源(不要使用清华源,虽然很多博客都推荐,但现在清华源早就挂了),然后新建一个Python3.6.2的虚拟环境。并安装第三方库notebook(图形界面也可以下载)、py4j、findspark
当然,你要是觉得Anaconda下载慢、安装配置麻烦,然后之前本来就没有安装过Python,或者愿意卸载重装,那就到Python官网下载一个Python3.6.x的版本也是可以的,然后安装相应库。
将Spark包下的python目录下的pyspark文件复制到anaconda3/env/python36(你的环境名)/lib/site-packages目录下面,相当于增加了pyspark第三方库。
接下来就是最重要的环境变量设置,除了JAVA_HOME,HADOOP_HOME,再就是下面的
我最后遇到的一个问题就是执行results.collect()
后报错java.io.IOException: Cannot run program “E:\anaconda3\envs\python36”: CreateProcess error=5, Access is denied。
,就是因为没有设置PYTHON_HOME
,网上博客甚少提到这一点。
还有一个问题就是开始时说sc未定义
或者sc为''
,按道理,我只是给pyspark-shell换了个衣服而已。
所以在编辑pyspark代码前,执行以下代码。
import findspark
findspark.init()
import os
import sys
spark_name = os.environ.get('SPARK_HOME',None)
if not spark_name:
raise ValueErrorError('spark环境没有配置好')
sys.path.insert(0,os.path.join(spark_name,'python'))
sys.path.insert(0,os.path.join(spark_name,'python/lib/py4j-0.10.6-src.zip'))
#(python/lib/py4j-0.10.6-src.zip位于D:spark-2.3.0-bin-hadoop2.7中python文件夹中lib文件夹内,请根据自己的版本更改)
exec(open(os.path.join(spark_name,'python/pyspark/shell.py')).read())
然后拿一个wordcount举例:
成了,兄弟!