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來提前結束并釋放會話資源。