每一次安装环境都是伤筋动骨的,心塞塞。由于线上zeppline实在是不太友好,而且和集群相关联,怕有所影响。所以本地安装pyspark,以便学习所用。
比较坑爹,之前学app爬虫,装的jdk10,spark好像不支持。建议安装jdk8,stackoverflow有讨论,可参看https://stackoverflow.com/questions/48603071/illegalargumentexception-with-spark-collect-on-jupyter。实测可行,jdk8的可以在https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载。
报错信息为:
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
官网地址:http://spark.apache.org/downloads.html,为了保持和公司集群的版本保持,下载版本选择spark-2.3.0-bin-hadoop2.6 。
官网下载速度感人,可以选择清华镜像https://mirrors.tuna.tsinghua.edu.cn/apache/spark/。下载压缩文件spark-2.3.1-bin-hadoop2.7.tgz(清华镜像站点没有我所需要的版本)。
安装本身没有问题,只需要把文件解压缩在指定目录下,比如我把文件解压在/Users/Simple/Coding/Spark/
下。下面需要添加环境变量,添加代码为:
# 查看配置文件
cat ~/.bash_profile
# 用vi命令添加环境变量
# add spark
export SPARK_HOME=/Users/Simple/Coding/Spark/spark-2.3.0-bin-hadoop2.6
export PATH="$PATH:${SPARK_HOME}/bin"
添加完环境变量后要执行以下命令:
source ~/.bash_profile
在shell下输入pyspark
即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vi1jyvq8-1575010408400)(pic0.jpg)]
最开始,pyspark默认的解释器应该为系统自带的python解释器,在我的Mac中python为python2.7,python3为Python3.6
有几种方式,分别介绍。
该方法不依赖jupyter,pycharm等都可以使用。选择pyspark对应的解释器,创建一个新的jupyter notebook。在import pyspark
时,先执行以下代码:
import os
import sys
os.environ['SPARK_HOME'] = "/Users/Simple/Coding/Spark/spark-2.3.0-bin-hadoop2.6"
sys.path.append("/Users/Simple/Coding/Spark/spark-2.3.0-bin-hadoop2.6/python")
sys.path.append("/Users/Simple/Coding/Spark/spark-2.3.0-bin-hadoop2.6/python/lib/py4j-0.10.7-src.zip")
from pyspark import SparkContext
from pyspark import SparkConf
sc = SparkContext('local')
words = sc.parallelize(["scala", "java", "hadoop", "spark", "akka"])
print(words.count())
5
直接调包,显得整洁一点。
import findspark
findspark.init()
from pyspark import SparkContext
from pyspark import SparkConf
sc = SparkContext()
words = sc.parallelize(["scala", "java", "hadoop", "spark", "akka"])
print(words.count())
sc.stop()
5
修改配置文件如下:
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"
此时在命令行输入pyspark
跳到jupyter
中。不过还是不太方便,最好的方式应该是在jupyter中可以选择,类似选择python2、python2、R
这样最方便了。
暂时说不出来为啥这么做,但是似乎可行,能用。在anaconda3安装目录anaconda3/share/jupyter/kernels
新建文件夹spark2
,该文件下新增json
文件,文件内容为:
{"argv":
["/Users/Simple/Coding/Py-Software/anaconda3/envs/python2/anaconda2/bin/python",
"-m",
"IPython.kernel",
"-f",
"{connection_file}"
],
"display_name":"PySpark2",
"language":"python" ,
"env": {
"SPARK_HOME": "/Users/Simple/Coding/Spark/spark-2.3.0-bin-hadoop2.6",
"PYTHONPATH": "/Users/Simple/Coding/Spark/spark-2.3.0-bin-hadoop2.6/python:/Users/Simple/Coding/Spark/spark-2.3.0-bin-hadoop2.6/python/lib/py4j-0.10.6-src.zip",
"PYTHONSTARTUP": "/Users/Simple/Coding/Spark/spark-2.3.0-bin-hadoop2.6/python/pyspark/shell.py ",
"PYSPARK_SUBMIT_ARGS": "pyspark-shell"
}
}
大概就是如此,反正可以用。具体可以参考:
[1] https://docs.anaconda.com/ae-notebooks/admin-guide/install/config/custom-pyspark-kernel/
[2] https://blog.csdn.net/moledyzhang/article/details/78850820
此外,由于目前没有安装hadoop,运行pyspark时会生成莫名其妙的文件,等下次有方法再补充。
在终端执行pyspark
时,会出现derby.log、metastore_db
两个文件,也不知道这是啥,总之,在/User
下会出现就是了。可以把他们放在指定目录下,在spark/conf
下执行编辑spark-default.conf
文件,如果没有复制对应template
文件即可。
spark.local.dir /Users/Simple/Coding/Spark/spark2.3-localdata
SPARK_LOCAL_DIRS /Users/Simple/Coding/Spark/spark2.3-localdata
spark.eventLog.dir /Users/Simple/Coding/Spark/spark2.3-localdata/logdata
## 前面是设置临时文件啥的,改变derby用下面的
spark.driver.extraJavaOptions -Dderby.system.home=/Users/Simple/Coding/Spark/spark2.3-localdata/derby_data
参考:https://stackoverflow.com/questions/38377188/how-to-get-rid-of-derby-log-metastore-db-from-spark-shell/40541384#40541384
jupyter中执行代码,会出现莫名其妙的文件夹,最后目录为spark-warehouse,可以改下设置,同样的,不知道为啥这么改,醉了。接触的越多,感受自己的局限性越大。
spark.sql.warehouse.dir /Users/simple/Coding/Spark/spark2.3-localdata/warehouse
参考:https://stackoverflow.com/questions/44781067/how-do-i-launch-pyspark-and-arrive-in-an-ipython-shell/44810603#44810603