下面这一通设置只是在我的电脑上走通了,参考性存疑。可以多看看文中的参考文章。

  每一次安装环境都是伤筋动骨的,心塞塞。由于线上zeppline实在是不太友好,而且和集群相关联,怕有所影响。所以本地安装pyspark,以便学习所用。

1. 环境

  1. Mac:macOS High Sierra 10.13.4
  2. Spark:spark-2.3.0-bin-hadoop2.6

2. Spark安装

2.1 java安装

  比较坑爹,之前学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.

2.2 Spark下载

  官网地址:​​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(清华镜像站点没有我所需要的版本)。

2.3 Spark安装

  安装本身没有问题,只需要把文件解压缩在指定目录下,比如我把文件解压在​​/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)]

3 Pyspark相关配置

3.1 python解释器的选择

  最开始,pyspark默认的解释器应该为系统自带的python解释器,在我的Mac中python为python2.7,python3为Python3.6

3.2 在Jupyter Notebook中使用Pyspark

  有几种方式,分别介绍。

3.2.1 在代码里添加路径

  该方法不依赖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

3.2.2 利用findspark包

  直接调包,显得整洁一点。

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

3.2.3 修改配置文件

  修改配置文件如下:

export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"

此时在命令行输入​​pyspark​​​跳到​​jupyter​​​中。不过还是不太方便,最好的方式应该是在jupyter中可以选择,类似选择​​python2、python2、R​​这样最方便了。

3.2.4 添加pyspark的kernel

  暂时说不出来为啥这么做,但是似乎可行,能用。在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/​​​​​

4. 乱七八糟的坑

4.1 终端执行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​

4.2 jupyter中执行

  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​