Spark 集群部署和 Jupyter Notebook 配置注意事项

文章主要记录了 spark 2.1.0 集群部署注意事项以及如何通过 Jupyter Notebook 访问 spark 集群。

spark 集群安装注意事项

安装过程主要参考了 spark 官方文档 https://spark.apache.org/docs/latest/spark-standalone.html

一些需要注意的事项如下

  • 每台机器需要先安装 Java,并配置环境变量 JAVA_HOMEPATH

  • 安装包解压到每台机器上,保持目录一致性,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
    2
    export PYSPARK_PYTHON=/opt/miniconda2/bin/python
    export PYSPARK_DRIVER_PYTHON=ipython

  • 通过 sbin 中的 script start-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
    4
    spark.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,需要先安装 sbt

1
2
3
4
echo "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
2
git clone https://github.com/apache/incubator-toree
cd incubator-toree/

编译前需要先修改 MakeFile 文件中的 APACHE_SPARK_VERSIONSCALA_VERSION 为对应的版本。我这里使用 spark 2.1.0,因此修改成如下

1
2
APACHE_SPARK_VERSION?=2.1.0
SCALA_VERSION?=2.11

然后执行 make dist && make release 这时会报错 /bin/sh: 1: docker: not found, 主要原因是没安装 docker,可以忽略这个错误,因为 docker 主要作用是将安装文件打包在一起再通过 pip 安装,但是这些文件已经生成在 dist 目录下,可以直接安装,因此可以执行下面的命令进行安装

1
2
cd dist/toree-pip/
python setup.py install
  1. 通过 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