最近接到任务,要求在公司本地的服务器上搭建JupyterHub多用户平台以及配置PySpark分布式计算。折腾了几天,终于实现了!期间踩了很多坑,为了避免难兄难弟们重蹈覆辙,决定以图文并茂的形式完整地记录实现过程。如果能帮助到有需求的朋友,内心会十分地满足哈(欢迎评论及私信,点赞会更好哦~)
第一步:基本配置
接到任务之后,首先应该考虑一个配置表格。自己由于没有相关的经验,踩了很多版本不匹配的坑(以后必须养成这一习惯)。
背景信息:CentOS 7, Spark1.6
特别说明(选择使用Anaconda3-5.2.0版本安装JupyterHub):
Anaconda3-4.2.0中内置Python3.5,但是安装JupyterHub后无法正常使用(提示error:”no module named ‘alembic'”,可能与Anaconda3的低版本有关)
Anaconda3-5.2.0中可以正常使用JupyterHub,但内置的Python3.6只能在Spark2.0或者更高版本中使用
解决方法:通过Anaconda3-5.2.0安装JupyterHub,并创建一个基于Python3.5版本的新环境(命名为py35)。然后在py35环境中创建一个py3.5的kernel,在这个kernel中运行PySpark。#相关代码可参考附录1#
图1:创建py3.5的kernel以运行PySpark
第二步:JupyterHub搭建
1. JupyterHub简介
2. 安装JupyterHub
安装Anaconda
$ wget http://repo.continuum.io/archive/Anaconda3-5.2.0-Linux-x86_64.sh
# 从对应资源下载Anaconda3-5.2.0
$ bash Anaconda3-5.2.0-Linux-x86_64.sh
# 安装Anaconda,这一步骤中会询问多次,输入Enter表示同意即可
增加Anaconda环境变量
$ vim ~/.bashrc
export PATH=/PATH to Anaconda/bin:$PATH
# PATH to Anaconda为Anaconda的实际安装路径
# 如果在安装Anaconda过程中,选择了默认路径,可以跳过这一步
$ source ~/.bashrc
利用Anaconda安装JupyterHub
$ conda install -c conda-forge jupyterhub
# 运行此代码后,如果可以输出jupyterhub, configuarable-http-proxy的版本号,则表示安装成功
图3:JupyterHub安装成功
3. 配置JupyterHub
生成配置文件
$ jupyterhub --generate-config
# 运行此代码后,会生成jupyterhub_config.py文件。这里选择保存在~/etc/py36/jhub目录下
利用配置文件运行JupyterHub
$ jupyterhub -f ~/etc/py36/jhub/jupyterhub_config.py
打开浏览器访问
4. 运行JupyterHub过程中常见问题及其解决方法
Error:‘Failed to bind hub…, Address already in use’
问题原因:目标端口8081已被占用
图4:Error:‘Failed to bind hub…, Address already in use’
解决方法:修改jupyterhub_config.py文件,设置指向新的端口8182,运行JupyterHub即可
$ vim jupyterhub_config.py
c.JupyterHub.hub_port = 8182
图5:修改jupyterhub_config.py文件
图6:JupyterHub运行成功
如8182也被占用,可释放该端口,然后运行JupyterHub
$ netstat –tln | grep 8182
# 检查8182端口是否被占用
$ lsof -i :8182
# 检查该端口对应的PID
$ kill 28632
# 终止该进程,释放端口8182
图7:释放指定的端口
Error:‘HTTP 403: Forbidden’
问题原因:可能后台运行着基于旧API token的configurable-http-proxy实例
解决方法:找出该实例并关闭
$ ps aux | grep configurable-http-proxy
# 检查是否存在该实例
$ kill …
# 如果存在,找到对应ID并关闭
5. 管理多用户
创建管理员及新用户
$ vim ~/etc/py36/jhub/jupyterhub_config.py
c.Authenticator.admin_users = {'zxj'}
# 创建管理员
c.Authenticator.whitelist = {'zxj', 'spider'}
# 将系统中其他用户加入白名单
图8:JupyterHub多用户管理页面
备注:由于安装在个人目录下,所以其他用户暂时无法正常使用。后期需将软件迁移至系统根目录下。
图9:其他用户暂时无法正常使用
哈哈哈,JupyterHub搭建完成。
此外,安装Jupyter NbExtensions可以更加便捷地使用Jupyter Notebook(#相关代码可参考附录2#)。利用nohup命令可以在后台运行JupyterHub(#相关代码可参考附录3#)
第三步:PySpark配置
1. PySpark简介
2. 配置PySpark
路径配置
$ vim ~/.bashrc
export SPARK_HOME=/usr/hdp/2.5.0.0-1245/spark
# spark的安装路径
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH
# 指向spark目录下的python文件夹
path to python folder in spark
export PYSPARK_PYTHON=/home/zxj/user/anaconda3/envs/py35/bin/python3
# 指定pyspark中使用的python版本(这里使用py35环境下的python3.5版本)
$ source ~/.bashrc
在PySparkShell中检查Python版本
图11:路径设置后,PySparkShell使用指定的python3.5版本
图12:Spark管理器中可查看相应的进程
3. 路径设置中可能遇到的问题
Error: ‘can not find ‘SPARK_HOME’
问题原因:修改个人目录下.bashrc文件可以在shell命令中起作用,但是不会影响GUI(这里是Jupyter Notebook)
解决方法:取得root权限,在根目录/etc/profile中增加环境变量(需要root权限)
$ vim /etc/profile
export SPARK_HOME=/usr/hdp/2.5.0.0-1245/spark
$ source /etc/profile
图13:增加‘SPARK_HOME’到系统环境变量中
4. JupyterHub中运行PySpark简单实例
需要安装findspark,并运行findspark.init()以import pyspark as a regular library
替代方法:安装toree然后利用toree生成Apache Toree Pyspark kernel(我尝试过这个方法但没有成功,总是报错dead kernel)。具体可以参考以下链接,但是自己踩过的一个坑必须告知下(必须指定安装toree0.2.0版本,因为0.3.0版本中移除了PySpark和SparkR)
Installationtoree.apache.org
图14:PySpark简单实例
图15:Spark管理器中可查看相应的进程
哈哈哈,PySpark也配置完成。大家可以各显神通啦。如果觉得有所帮助,点个赞呗。
附录1:Jupyter Notebook创建新环境及新kernel
创建新环境py35
$ conda create -n py35 python=3.5
# 创建新环境py35,指定python版本为3.5
$ conda activate py35 (source activate py35)
# 进入py35环境
$ conda deactivate
# 退出py35环境
环境py35中创建kernel py3.5
$ conda activate py35
$ conda install notebook ipykernel
# 如果已有ipykernel,可跳过这一步
$ ipython kernel install --user --name “py3.5”
# 在环境py35中创建kernel py3.5
检查所有可用的kernels
附录 图1:新建的kernel py3.5相关信息
附录2:Jupyter Notebook安装Jupyter Nbextensions
关联Jupyter Notebook与conda
$ conda install -c conda-forge nb_conda
安装Jupyter Nbextensions
$ conda install -c conda-forge jupyter_contrib_nbextensions
$ conda install -c conda-forge jupyter_nbextensions_configurator
附录 图2:Jupyter Nbextensions管理页面
附录3:后台运行JupyterHub及终止
后台运行
$ nohup jupyterhub –f ~/etc/py36/jhub/jupyterhub_config.py &
# &符号表示后台运行,所以即使终端窗口关闭也可以继续运行
终止
$ jupyter notebook list
# 查找正在运行的jupyter notebooks
$ netstat –tulpn | grep xx
# 找出所属进程的PID
$ kill 28678
# 终止该进程
附录 图3:终止后台运行的JupyterHub