通过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 Notebook的sparkmagic插件通过REST接口与Spark进行交互,目前sparkmagic支持Livy、Livy Lighter和Ilum三种协议。配置Jupyter Notebook中的sparkmagic插件,并利用Serverless Spark的Livy 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页面,单击创建Livy Gateway

    3. 在创建Gateway页面,输入名称(例如,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 Gateway的Endpoint信息。

    您可以在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页面,单击创建Livy Gateway

    3. 在创建Gateway页面,输入名称(例如,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 Notebook或JupyterLab),启用相应的插件。

    • 对于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插件。

    首次载入sparkmagic插件可能要求重启Jupyter。

    # 载入sparkmagic插件。
    %load_ext sparkmagic.magics
    # 管理session。
    %manage_spark
    # 调大创建session的超时时间。
    import sparkmagic.utils.configuration as conf
    conf.override("livy_session_startup_timeout_seconds", 1000)
    说明

    需要调大sparkmagic插件的启动session超时时间,否则可能会出现无法启动session的情况。

    image

  3. 管理Endpoint配置。

    1. 单击Add Endpoint标签。

    2. 配置以下信息,单击Add endpoint

      image

      涉及参数信息如下。

      参数

      说明

      Auth type

      选择Basic_Access。

      Address

      填写格式为https://<Gateway的Endpoint信息>

      Username

      使用默认值即可。

      Password

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

  4. 创建Session。

    1. 单击Create Session标签。

    2. 配置以下信息,单击Create Session

      image

      涉及参数信息如下。

      参数

      说明

      Endpoint

      选择前一个步骤添加的Endpoint。

      Name

      Session名称,您可以自定义。

      Language

      本文以Python为例。

      Properties

      在Properties中可自定义driver和executor的资源配置。不填写则默认为两个executor,driver和executor各1 CU。

      说明

      Spark默认会有10%的堆外内存,例如设置4 GB内存,则实际消耗约为4.4 GB。

      Properties示例如下。

      {
        "driverMemory": "3584m",
        "driverCores": 1,
        "executorMemory": "7372m",
        "executorCores": 2,
        "numExecutors": 4
      }
  5. 验证Session。

    请耐心等待1至5分钟直至Session状态变为idle,则表明Session已成功创建并准备就绪。此时,界面会展示新创建的Session详情,您可以开始进行Pyspark交互式开发。

    image

    • 示例1:查询可访问的所有数据库。

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

      返回信息如下所示。

      image

    • 示例2: 输出从1到9的数字之和。

      %%spark
      import os
      sum = sc.range(1,10).sum()
      print("sum = " + str(sum))

      返回信息如下所示。

      image

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

创建的Session会在闲置达到两小时后自动终止,确保资源的及时回收。此外,您也可以手动单击sparkmagic插件界面上的Delete来提前结束并释放会话资源。