Jupyter Notebook是一个强大的交互式开发工具,您可以在Web界面中即时编写和执行代码,并实时查看结果,无需进行预编译或单独执行脚本。本文将为您介绍如何构建高效的与Serverless Spark交互的开发环境。
背景信息
Apache Livy通过REST接口与Spark进行交互,极大地简化了Spark和应用程序服务器之间的通信复杂度。关于Livy API,请参见REST API。
在使用Jupyter Notebook进行开发时,您可以通过使用sparkmagic插件或Docker镜像两种方式与Serverless Spark进行交互。请根据实际情况选择最适合的方案。
方式 | 适用场景 |
如果您希望快速构建一个独立的开发环境,或者需要在不同机器上复现相同的设置,使用Docker镜像将是一个便捷的选择。 | |
Jupyter Notebook的sparkmagic插件通过REST接口与Spark进行交互,目前sparkmagic支持Livy、Livy Lighter和Ilum三种协议。配置Jupyter Notebook中的sparkmagic插件,并利用Serverless Spark的Livy API,以实现一个高效的与远程Spark集群交互的开发环境。 |
前提条件
根据您选择的交互式开发的方式进行相应的操作:
方式一:使用Docker镜像快速启动环境:已安装Docker,详情请参见Docker官方文档。
方式二:使用sparkmagic插件启动环境:已安装并启动Jupyter Notebook,详情请参见Project Jupyter | Installing Jupyter。
本文示例使用的是Jupyter Notebook与Python 3.8进行演示。
已创建工作空间,详情请参见创建工作空间。
方式一:使用Docker镜像快速启动环境
步骤一:创建Gateway及访问Token
创建Gateway。
进入Gateway页面。
在左侧导航栏,选择
。在Spark页面,单击目标工作空间名称。
在EMR Serverless Spark页面,单击左侧导航栏中的
。
在Livy Gateway页面,单击创建Livy Gateway。
在创建Gateway页面,输入名称(例如,Livy-gateway),单击创建。
其余参数请根据具体情况进行调整,更多参数信息请参见管理Gateway。
创建Token。
在Gateway页面,单击Livy-gateway操作列的Token管理。
单击创建Token。
在创建Token对话框中,输入名称(例如,Livy-token),单击确定。
复制Token信息。
重要Token创建完成后,请务必立即复制新Token的信息,后续不支持查看。如果您的Token过期或遗失,请选择新建Token或重置Token。
步骤二:使用Docker拉取并启动镜像
执行以下命令,拉取镜像。
docker pull emr-registry-registry.cn-hangzhou.cr.aliyuncs.com/serverless-spark-public/emr-spark-jupyter:latest
执行以下命令,启动镜像。
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******
访问Jupyter UI。
请复制返回信息中的
http://127.0.0.1:8888/lab?token=258c0dd75e22a10fb6e2c87ac738c2a7ba6a314c6b******
链接到浏览器中,即可直接使用Jupyter服务连接Serverless Spark。说明如果您是通过远程服务器进行连接,请将IP地址
127.0.0.1
替换为服务器的实际IP地址。如果启动镜像时的
host_port
不是8888
,请将端口号替换为实际的端口号。
步骤三:测试连通性
在JupyterLab页面,单击PySpark。
执行以下命令,查询可访问的所有数据库。
spark.sql("show databases").show()
返回信息如下所示。
方式二:使用sparkmagic插件启动环境
步骤一:创建Gateway及访问Token
创建Gateway。
进入Gateway页面。
在左侧导航栏,选择
。在Spark页面,单击目标工作空间名称。
在EMR Serverless Spark页面,单击左侧导航栏中的
。
在Livy Gateway页面,单击创建Livy Gateway。
在创建Gateway页面,输入名称(例如,Livy-gateway),单击创建。
其余参数请根据具体情况进行调整,更多参数信息请参见管理Gateway。
创建Token。
在Gateway页面,单击Livy-gateway操作列的Token管理。
单击创建Token。
在创建Token对话框中,输入名称(例如,Livy-token),单击确定。
复制Token信息。
重要Token创建完成后,请务必立即复制新Token的信息,后续不支持查看。如果您的Token过期或遗失,请选择新建Token或重置Token。
步骤二:安装并启用sparkmagic插件
执行以下命令,安装sparkmagic插件。
pip install sparkmagic
根据您使用的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
访问Jupyter UI,详情请参见JupyterLab。
载入与配置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的情况。
管理Endpoint配置。
单击Add Endpoint标签。
配置以下信息,单击Add endpoint。
涉及参数信息如下。
参数
说明
Auth type
选择Basic_Access。
Address
填写格式为
https://<Gateway的Endpoint信息>
。Username
使用默认值即可。
Password
为您步骤一中复制的Token信息。
创建Session。
单击Create Session标签。
配置以下信息,单击Create Session。
涉及参数信息如下。
参数
说明
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 }
验证Session。
请耐心等待1至5分钟直至Session状态变为
idle
,则表明Session已成功创建并准备就绪。此时,界面会展示新创建的Session详情,您可以开始进行Pyspark交互式开发。示例1:查询可访问的所有数据库。
%%spark spark.sql("show databases").show()
返回信息如下所示。
示例2: 输出从1到9的数字之和。
%%spark import os sum = sc.range(1,10).sum() print("sum = " + str(sum))
返回信息如下所示。
(可选)步骤四:释放Session资源
创建的Session会在闲置达到两小时后自动终止,确保资源的及时回收。此外,您也可以手动单击sparkmagic插件界面上的Delete来提前结束并释放会话资源。