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页面,单击创建Livy Gateway。
在创建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页面,单击创建Livy Gateway。
在创建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插件。
%load_ext sparkmagic.magics
修改Session启动配置。
延长启动超时时间,防止因资源调度延迟导致超时失败。
import sparkmagic.utils.configuration as conf conf.override("livy_session_startup_timeout_seconds", 1000)
(可选)自定义 Spark 资源配置。
您可自行添加ttl、conf等参数,详情请参见Livy Docs - REST API。
例如,以下配置示例展示了如何修改Driver的资源配置。
%% spark config { "conf": { "spark.driver.cores": "1", "spark.driver.memory": "7g" } }
创建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信息。
返回信息如下所示。
请耐心等待1至5分钟直至Session状态变为
idle
,则表明Session已成功创建并准备就绪。此时,界面会展示新创建的Session详情,您可以开始进行Pyspark交互式开发。您还可以通过Serverless Spark控制台,在目标Livy Gateway的Session列表页签,查看Session信息。验证Session。
Session创建成功后,您可以通过
%%spark
执行代码。例如,通过以下代码查看当前 Spark 环境中的所有数据库。%%spark spark.sql("show databases").show()
返回信息如下所示。
(可选)步骤四:释放Session资源
自动释放。
创建的Session会在闲置达到两小时后自动终止。
手动释放。
通过
sparkmagic
插件释放。%spark delete -s <session_name>
通过Serverless Spark控制台释放。
在目标Livy Gateway的Session列表页签,单击已创建Session操作列的关闭。