
# 使用Jupyter Notebook对接MRS Spark
#### 应用场景
在MRS服务中可以配合Jupyter Notebook使用PySpark，能够提高机器学习、数据探索和ETL应用开发效率。
本实践指导用户如何在MRS集群中配置Jupyter Notebook来使用Pyspark。
#### 方案架构
Spark的应用运行架构如[图1]所示，运行流程如下所示：
1. 应用程序（Application）是作为一个进程的集合运行在集群上的，由Driver进行协调。
2. 在运行一个应用时，Driver会去连接集群管理器（Standalone、Mesos、YARN）申请运行Executor资源，并启动ExecutorBackend。然后由集群管理器在不同的应用之间调度资源。Driver同时会启动应用程序DAG调度、Stage划分、Task生成。
3. 然后Spark会把应用的代码（传递给SparkContext的JAR或者Python定义的代码）发送到Executor上。
4. 所有的Task执行完成后，用户的应用程序运行结束。
图1Spark应用运行架构   
![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002009380905.png "点击放大")
#### 约束与限制
本实践仅适用于MRS 3.x及之后版本，且在集群外客户端节点中安装Python3。
#### 操作流程
本实践基本操作流程如下所示：
1. [步骤1：在MRS集群外节点安装客户端]
2. [步骤2：安装Python3]
3. [步骤3：安装Jupyter Notebook]
4. [步骤4：验证Jupyter Notebook访问MRS]
 
 #### 步骤1：在MRS集群外节点安装客户端
1. 准备一台不属于MRS集群的Linux弹性云服务器，绑定一个弹性IP，参考[集群外节点安装客户端](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html#mrs_01_0089__section49281012266)章节安装集群客户端，例如安装目录为"/opt/client"。
2. 确认MRS集群是否开启了Kerberos认证。 
   - 是，执行[步骤 3]。
   
   - 否，执行[步骤2：安装Python3]。
   
   
   
   
3. 登录集群的Manager界面。
4. 单击"系统 \> 权限 \> 用户"，创建一个业务用户。 
   用户类型为人机用户，用户组选择"hadoop"，主组选择"hadoop"，角色选择"Manager_operator"。
   例如创建的用户为"mrs-test"。
   图2创建MRS业务用户   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912841102.png)
   
   
5. 使用**root** 用户，登录到集群客户端节点，执行如下命令配置环境变量并进行认证，首次进行用户认证需要修改用户密码。
   
   **source /opt/client/bigdata_env**
   **kinit** *mrs-test*
   
   
 
 #### 步骤2：安装Python3
1. 使用**root** 用户，登录集群外客户端节点，执行如下命令，检查是否安装了Python3。
   
   **python3 --version**
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001945360309.png "点击放大")
   - 是，执行[步骤 8]。
   
   - 否，执行[步骤 2]。
   
   
   ![](https://support.huaweicloud.com/bestpractice-mrs/public_sys-resources/note_3.0-zh-cn.png)
   本案例仅适用于**集群外客户端**节点安装Python3。
   
   
2. 安装Python，此处以Python 3.6.6为例。
   
   1. 执行如下命令，安装相关依赖： **yum install zlib zlib-devel zip -y**
      **yum install gcc-c++**
      **yum install openssl-devel**
      **yum install sqlite-devel -y**
      如果pandas库需要额外安装如下依赖：
      **yum install -y xz-devel**
      **yum install bzip2-devel**
      
   
   2. 下载对应Python版本源码。 **wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz**
      
   
   3. 执行如下命令，解压python源码压缩包，例如下载在"opt"目录下。 **cd /opt**
      **tar -xvf Python-3.6.6.tgz**
      
   
   4. 创建Python的安装目录，此处以"/opt/python36"为例。 **mkdir /opt/python36**
      
   
   5. 编译Python。 **cd /opt/python-3.6.6**
      **./configure --prefix=/opt/python36**
      执行成功，显示结果如下：
      ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912681226.png "点击放大")
      执行**make -j8**命令，执行成功，显示结果如下：
      ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912841106.png "点击放大")
      执行**make install**命令，执行成功，显示结果如下：
      ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001945360313.png "点击放大")
      
   
   6. 执行如下命令，配置Python环境变量。 **export PYTHON_HOME=/opt/python36**
      **export PATH=$PYTHON_HOME/bin:$PATH**
      
   
   7. 执行**python3 --version** 命令，显示结果如下，表示Python已经安装完成。
      ```
      Python 3.6.6
      ```
      
   
   
   
   
3. 验证Python3。 
   **pip3 install helloword**
   **python3**
   **import helloworld**
   **helloworld.say_hello("test")**
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912681230.png "点击放大")
   
   
4. 测试安装第三方Python库（如pandas、sklearn）。 
   **pip3 install pandas**
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912841110.png "点击放大")
   **pip3 install backports.lzma**
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001945360317.png "点击放大")
   **pip3 install sklearn**
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912681234.png "点击放大")
   
   
5. 执行命令**python3 -m pip list** ，查看安装结果。
   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912841114.png "点击放大")
   
   
6. 打包Python.zip 
   **cd** **/opt/python36/**
   **zip -r python36.zip ./\***
   
   
7. 上传到HDFS指定目录。 
   **hdfs dfs -mkdir /user/python**
   **hdfs dfs -put python36.zip /user/python**
   
   
8. 配置MRS客户端。
   
   进入Spark客户端安装目录"/opt/client/*Spark2x*/spark/conf"，在"spark-defaults.conf"配置文件如下参数。
   ```
   spark.pyspark.driver.python=/usr/bin/python3
   spark.yarn.dist.archives=hdfs://hacluster/user/python/python36.zip#Python
   ```
   
   
 
 #### 步骤3：安装Jupyter Notebook
1. 使用**root** 用户登录客户端节点，执行如下命令安装Jupyter Notebook。
   
   **pip3 install jupyter notebook**
   显示结果如下，表示安装成功：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001945360321.png "点击放大")
   
   
2. 为保障系统安全，需要生成一个密文密码用于登录Jupyter，放到Jupyter Notebook的配置文件中。
   
   执行如下命令，需要输入两次密码：（进行到Out\[3\]退出）
   **ipython**
   ```
   [root@ecs-notebook python36]# ipython
   Python 3.6.6 (default, Dec 20 2021, 09:32:25)
   Type 'copyright', 'credits' or 'license' for more information
   IPython 7.16.2 -- An enhanced Interactive Python. Type '?' for help.
   In [1]: from notebook.auth import passwd
   In [2]: passwd()
   Enter password:
   Verify password:
   Out[2]: 'argon2:$argon2id$v=19$m=10240,t=10,p=8$g14BqLddl927n/unsyPlLQ$YmoKJzbUfNG7LcxylJzm90bgbKWUIiHy6ZV+ObTzdcA
   ```
   
   
3. 执行如下命令生成Jupyter配置文件。 
   **jupyter notebook --generate-config**
   
   
4. 修改配置文件。 
   **vi \~/.jupyter/jupyter_notebook_config.py**
   添加如下配置：
   ```
   # -*- coding: utf-8 -*- 
   c.NotebookApp.ip='*' #此处填写ecs对应的内网IP 
   c.NotebookApp.password = u'argon2:$argon2id$v=19$m=10240,t=10,p=8$NmoAVwd8F6vFP2rX5ZbV7w$SyueJoC0a5TbCuHYzqfSx1vQcFvOTTryR+0uk2MNNZA' # 填写步骤2，Out[2]密码生成的密文
   c.NotebookApp.open_browser = False # 禁止自动打开浏览器 
   c.NotebookApp.port = 9999 # 指定端口号 
   c.NotebookApp.allow_remote_access = True
   ```
   
   
 
 #### 步骤4：验证Jupyter Notebook访问MRS
1. 在客户端节点执行如下命令，启动Jupyter Notebook。 
   **PYSPARK_PYTHON=./Python/bin/python3 PYSPARK_DRIVER_PYTHON=jupyter-notebook PYSPARK_DRIVER_PYTHON_OPTS="--allow-root" pyspark --master yarn --executor-memory 2G --driver-memory 1G**
   
   
2. 在浏览器中输入"*弹性IP地址* :9999"地址，登录到Jupyter WebUI（保证ECS的安全组对外放通本地公网IP和9999端口），登录密码为[步骤 2]设置的密码。
   
   图3登录Jupyter WebUI   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912681238.png "点击放大")
   
   
3. 创建代码。 
   创建一个新的python3任务，使用Spark读取文件。
   图4创建Python任务   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912841118.png "点击放大")
   登录到集群Manager界面，在Yarn的WebUI页面上查看提交的pyspark应用。
   图5查看任务运行情况   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001945360325.png "点击放大")
   
   
4. 验证pandas库调用。 
   图6验证pandas   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912681242.png "点击放大")
   
   
 
#### 对接Jupyter常见问题
pandas本地import使用时，报错如下：
![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912841122.png "点击放大")
参考以下步骤进行处理：
1. 执行命令**python -m pip install backports.lzma** 安装lzma模块，如下图所示：
   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001945360329.png "点击放大")
   
   
2. 进入"/usr/local/python3/lib/python3.6"目录（机器不同，目录也有所不同，可以通过**which** 命令来查找当前运行Python是使用的那个目录的），然后编辑"lzma.py"文件。
   
   将：
   ```
   from _lzma import *
   from _lzma import _encode_filter_properties, _decode_filter_properties
   ```
   更改为：
   ```
   try:
       from _lzma import *
       from _lzma import _encode_filter_properties, _decode_filter_properties
   except ImportError:
       from backports.lzma import *
       from backports.lzma import _encode_filter_properties, _decode_filter_properties
   ```
   修改前：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912681246.png "点击放大")
   修改后：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001912841126.png "点击放大")
   
   
3. 保存退出，然后再次执行import。 
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001945360333.png "点击放大")
   
   
 
