通过Jupyter Notebook与Serverless Spark进行交互

Jupyter Notebook是一个强大的交互式开发工具,您可以在Web界面中即时编写和执行代码,并实时查看结果,无需进行预编译或单独执行脚本。本文将为您介绍如何构建高效的与Serverless Spark交互的开发环境。

背景信息

Apache Livy通过REST接口与Spark进行交互,极大地简化了Spark和应用程序服务器之间的通信复杂度。关于Livy API,请参见REST API

在使用Jupyter Notebook进行开发时,您可以通过使用sparkmagic插件或Docker镜像两种方式与Serverless Spark进行交互。请根据实际情况选择最适合的方案。

方式

适用场景

方式一:使用Docker镜像快速启动环境

如果您希望快速构建一个独立的开发环境,或者需要在不同机器上复现相同的设置,使用Docker镜像将是一个便捷的选择。

方式二:使用sparkmagic插件启动环境

Jupyter Notebooksparkmagic插件通过REST接口与Spark进行交互,目前sparkmagic支持Livy、Livy LighterIlum三种协议。配置Jupyter Notebook中的sparkmagic插件,并利用Serverless SparkLivy API,以实现一个高效的与远程Spark集群交互的开发环境。

前提条件

方式一:使用Docker镜像快速启动环境

步骤一:创建Gateway及访问Token

  1. 创建并启动Gateway。

    1. 进入Gateway页面。

      1. 登录E-MapReduce控制台

      2. 在左侧导航栏,选择EMR Serverless > Spark

      3. Spark页面,单击目标工作空间名称。

      4. EMR Serverless Spark页面,单击左侧导航栏中的运维中心 > Gateway

    2. 单击Livy Gateway页签。

    3. Livy Gateway页面,单击创建Livy Gateway

    4. 在创建Gateway页面,输入名称(例如,Livy-gateway),单击创建

      其余参数请根据具体情况进行调整,更多参数信息请参见管理Gateway

    5. Livy Gateway页面,单击已创建Gateway操作列的启动

  2. 创建Token。

    1. Gateway页面,单击Livy-gateway操作列的Token管理

    2. 单击创建Token

    3. 创建Token对话框中,输入名称(例如,Livy-token),单击确定

    4. 复制Token信息。

      重要

      Token创建完成后,请务必立即复制新Token的信息,后续不支持查看。如果您的Token过期或遗失,请选择新建Token或重置Token。

步骤二:使用Docker拉取并启动镜像

  1. 执行以下命令,拉取镜像。

    docker pull emr-registry-registry.cn-hangzhou.cr.aliyuncs.com/serverless-spark-public/emr-spark-jupyter:latest
  2. 执行以下命令,启动镜像。

    docker run -p <host_port>:8888 emr-registry-registry.cn-hangzhou.cr.aliyuncs.com/serverless-spark-public/emr-spark-jupyter:latest <endpoint> <token>

    涉及参数说明如下表所示。

    参数

    说明

    <host_port>

    替换为您的主机端口。

    <endpoint>

    替换为Livy GatewayEndpoint信息。

    您可以在Livy Gateway页面,单击已创建的Livy Gateway的名称,在总览页签,查看Endpoint信息。

    <token>

    替换为您前一个步骤中复制的Token信息。

    待镜像启动后,您可以看到返回如下提示信息。

    [I 2024-09-23 05:38:14.429 ServerApp] jupyter_lsp | extension was successfully linked.
    [I 2024-09-23 05:38:14.432 ServerApp] jupyter_server_terminals | extension was successfully linked.
    [I 2024-09-23 05:38:14.436 ServerApp] jupyterlab | extension was successfully linked.
    [I 2024-09-23 05:38:14.439 ServerApp] notebook | extension was successfully linked.
    [I 2024-09-23 05:38:14.439 ServerApp] Writing Jupyter server cookie secret to /root/.local/share/jupyter/runtime/jupyter_cookie_secret
    [I 2024-09-23 05:38:14.596 ServerApp] notebook_shim | extension was successfully linked.
    [I 2024-09-23 05:38:14.624 ServerApp] notebook_shim | extension was successfully loaded.
    [I 2024-09-23 05:38:14.625 ServerApp] jupyter_lsp | extension was successfully loaded.
    [I 2024-09-23 05:38:14.626 ServerApp] jupyter_server_terminals | extension was successfully loaded.
    [I 2024-09-23 05:38:14.627 LabApp] JupyterLab extension loaded from /root/miniforge3/envs/livy/lib/python3.8/site-packages/jupyterlab
    [I 2024-09-23 05:38:14.627 LabApp] JupyterLab application directory is /root/miniforge3/envs/livy/share/jupyter/lab
    [I 2024-09-23 05:38:14.628 LabApp] Extension Manager is 'pypi'.
    [I 2024-09-23 05:38:14.637 ServerApp] jupyterlab | extension was successfully loaded.
    [I 2024-09-23 05:38:14.640 ServerApp] notebook | extension was successfully loaded.
    [I 2024-09-23 05:38:14.640 ServerApp] Serving notebooks from local directory: /root
    [I 2024-09-23 05:38:14.640 ServerApp] Jupyter Server 2.14.2 is running at:
    [I 2024-09-23 05:38:14.640 ServerApp] http://6eca53b95ca2:8888/lab?token=258c0dd75e22a10fb6e2c87ac738c2a7ba6a314c6b******
    [I 2024-09-23 05:38:14.640 ServerApp]     http://127.0.0.1:8888/lab?token=258c0dd75e22a10fb6e2c87ac738c2a7ba6a314c6b******
  3. 访问Jupyter UI。

    请复制返回信息中的http://127.0.0.1:8888/lab?token=258c0dd75e22a10fb6e2c87ac738c2a7ba6a314c6b******链接到浏览器中,即可直接使用Jupyter服务连接Serverless Spark。

    说明
    • 如果您是通过远程服务器进行连接,请将IP地址127.0.0.1替换为服务器的实际IP地址。

    • 如果启动镜像时的host_port不是8888,请将端口号替换为实际的端口号。

步骤:测试连通性

  1. JupyterLab页面,单击PySpark。

    image

  2. 执行以下命令,查询可访问的所有数据库。

    spark.sql("show databases").show()
    

    返回信息如下所示。

    image

方式二:使用sparkmagic插件启动环境

步骤一:创建Gateway及访问Token

  1. 创建并启动Gateway。

    1. 进入Gateway页面。

      1. 登录E-MapReduce控制台

      2. 在左侧导航栏,选择EMR Serverless > Spark

      3. Spark页面,单击目标工作空间名称。

      4. EMR Serverless Spark页面,单击左侧导航栏中的运维中心 > Gateway

    2. 单击Livy Gateway页签。

    3. Livy Gateway页面,单击创建Livy Gateway

    4. 在创建Gateway页面,输入名称(例如,Livy-gateway),单击创建

      其余参数请根据具体情况进行调整,更多参数信息请参见管理Gateway

    5. Livy Gateway页面,单击已创建Gateway操作列的启动

  2. 创建Token。

    1. Gateway页面,单击Livy-gateway操作列的Token管理

    2. 单击创建Token

    3. 创建Token对话框中,输入名称(例如,Livy-token),单击确定

    4. 复制Token信息。

      重要

      Token创建完成后,请务必立即复制新Token的信息,后续不支持查看。如果您的Token过期或遗失,请选择新建Token或重置Token。

步骤二:安装并启用sparkmagic插件

  1. 执行以下命令,安装sparkmagic插件。

    pip install sparkmagic
  2. 根据您使用的Jupyter环境(Jupyter NotebookJupyterLab),启用相应的插件。

    • 对于Jupyter Notebook用户

      jupyter nbextension enable --py --sys-prefix widgetsnbextension
    • 对于JupyterLab用户

      jupyter labextension install "@jupyter-widgets/jupyterlab-manager"

sparkmagic插件的更多详细信息和高级配置选项,请参见sparkmagic

步骤三:配置与启动交互式Spark Session

  1. 访问Jupyter UI,详情请参见JupyterLab

  2. 导入sparkmagic插件。

    %load_ext sparkmagic.magics
  3. 修改Session启动配置。

    1. 延长启动超时时间,防止因资源调度延迟导致超时失败。

      import sparkmagic.utils.configuration as conf
      conf.override("livy_session_startup_timeout_seconds", 1000)
      
    2. (可选)自定义 Spark 资源配置。

      您可自行添加ttl、conf等参数,详情请参见Livy Docs - REST API

      例如,以下配置示例展示了如何修改Driver的资源配置。

      %% spark config
      {
        "conf": {
              "spark.driver.cores": "1",
              "spark.driver.memory": "7g"
               }
      }
      
  4. 创建Session。

    %spark add -s <session_name> -l python -u https://<endpoint> -a username -p <token>

    请根据您的实际情况替换以下信息。

    参数

    说明

    <session_name>

    Spark Session的名称。您可以自定义。

    <endpoint>

    您在总览页签获取的Endpoint(外网)Endpoint(内网)信息。

    如果使用内网Endpoint,请确保运行 Jupyter 的机器与 Livy Gateway部署在同一Region,且Endpoint前的https://需改为http://

    <token>

    替换为您在步骤一中复制的Token信息。

    返回信息如下所示。

    image

    请耐心等待15分钟直至Session状态变为idle,则表明Session已成功创建并准备就绪。此时,界面会展示新创建的Session详情,您可以开始进行Pyspark交互式开发。您还可以通过Serverless Spark控制台,在目标Livy GatewaySession列表页签,查看Session信息。

  5. 验证Session。

    Session创建成功后,您可以通过%%spark执行代码。例如,通过以下代码查看当前 Spark 环境中的所有数据库。

    %%spark
    spark.sql("show databases").show()
    

    返回信息如下所示。

    image

(可选)步骤四:释放Session资源

  • 自动释放。

    创建的Session会在闲置达到两小时后自动终止。

  • 手动释放。

    • 通过 sparkmagic 插件释放。

      %spark delete -s <session_name>
    • 通过Serverless Spark控制台释放。

      在目标Livy GatewaySession列表页签,单击已创建Session操作列的关闭

      image