Spark 集群部署和 Jupyter Notebook 配置注意事项
文章主要记录了 spark 2.1.0 集群部署注意事项以及如何通过 Jupyter Notebook 访问 spark 集群。
spark 集群安装注意事项
安装过程主要参考了 spark 官方文档 https://spark.apache.org/docs/latest/spark-standalone.html
一些需要注意的事项如下
每台机器需要先安装 Java,并配置环境变量
JAVA_HOME
和PATH
安装包解压到每台机器上,保持目录一致性,master 能够通过密钥 ssh 到其他 workers
修改
/etc/hosts
文件,保证每台主机能够通过主机名称 ping 通其他机器,注意,如果原来/etc/hosts
文件中有类似于127.0.0.1 hostname
的解释需要注释掉(因为会与前面设置ip hostname
冲突)master 创建
conf/slaves
, 每行包含一个 worker 的 hostname各个主机的 python 路径和版本要一致,在各台主机上的
conf/spark-env.sh
中定义如下1
2export PYSPARK_PYTHON=/opt/miniconda2/bin/python
export PYSPARK_DRIVER_PYTHON=ipython通过
sbin
中的 scriptstart-all.sh
启动整个集群默认情况下 worker (slave) 所有的 cores 都会使用,但是内存默认只会使用 1g (可通过
http://SparkMaster:8080/
查看,SparkMaster 为 master 的 ip),如果需要修改可用的资源,需要修改conf/spark-defaults.conf
文件,如下是设置了每个 worker 分配 4 个 core 和 6g 内存给 executor,同时设定了 driver program 使用的 core 的数量和内存大小。1
2
3
4spark.executor.cores 4
spark.executor.memory 6g
spark.driver.cores 4
spark.driver.memory 6g
这里需要注意的是 conf/spark-env.sh
也有内存和 cores 相关的设定,但是设定的是可使用的最大值,并不是实际的使用值,设定实际的使用值必须要在文件 conf/spark-defaults.conf
中设置,且当 conf/spark-defaults.conf
设定值大于 conf/spark-env.sh
时,该项不生效,也就是实际的资源值会变为 0。
另外,spark 只是一个计算框架,并不提供存储的功能,往往需要结合其他的分布式数据库 HBase 或分布式文件系统 HDFS 等使用, 从中读取数据并进行将结果保存在其中。
jupyter notebook 配置
jupyter notebook
的前身是 ipython notebook
,网上的基本是通过 ipython
建立 profile 文件来解决,但是 jupyter notebook
已经不支持 profile 参数了,因此这种方法无效。
通过 Apache Toree
可以建立 jupyter notebook
使用的 kernel,从而将 kernel 连接到 spark 上,本来通过 pip install toree
可以简单地安装 toree,但是由于使用 spark 的版本是 2.1.0, 其对应的 Scala 的版本是 2.11, 这个版本的 Scala 与 toree 中的 2.10 的 Scala 版本不符。因此需要重新编译 toree 并安装,编译 toree 并安装可参考以下教程。
主要过程如下
1. 如果没有安装 sbt,需要先安装 sbt1
2
3
4echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823
sudo apt-get update
sudo apt-get install sbt
2. 下载并编译 toree 的源码1
2git clone https://github.com/apache/incubator-toree
cd incubator-toree/
编译前需要先修改 MakeFile 文件中的 APACHE_SPARK_VERSION
、SCALA_VERSION
为对应的版本。我这里使用 spark 2.1.0,因此修改成如下1
2APACHE_SPARK_VERSION?=2.1.0
SCALA_VERSION?=2.11
然后执行 make dist && make release
这时会报错 /bin/sh: 1: docker: not found
, 主要原因是没安装 docker,可以忽略这个错误,因为 docker 主要作用是将安装文件打包在一起再通过 pip 安装,但是这些文件已经生成在 dist
目录下,可以直接安装,因此可以执行下面的命令进行安装1
2cd dist/toree-pip/
python setup.py install
- 通过 toree 生成相应的 kernel 供 jupyter notebook 使用
可以通过 jupyter toree install --spark_home= path_to_spark-2.1.0 --interpreters=PySpark/SparkR/SQL/Scala
安装对应的 kernel,然后在 web 界面选择相应的 kernel 即可。
最后的问题,toree 默认使用的是单机模式,如果需要使用集群模式,需要通过环境变量设置提交时的参数,从这个脚本文件 /usr/local/share/jupyter/kernels/apache_toree_pyspark/bin/run.sh
可以看出提交任务时的参数通过 SPART_OPTS
获取,因此可以将这个换件变量的值设置为 --master spark://ip:7077
从而通过集群运行任务。
通过上面搭建的环境与 Spark 集群进行交互的一些 Jupyter Notebook 样例可参考 https://github.com/WuLC/MachineLearningWithSpark
参考资料
Machine Learning with Jupyter using Scala, Spark and Python: The Setup Installing Toree+Spark 2.1 on Ubuntu 16.04