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頁面。
-
在左側導覽列,選擇EMR Serverless > Spark。
-
在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()返回資訊如下所示。
%%spark spark.sql("show databases").show() Starting Spark application ID YARN Application ID Kind State Spark UI Driver log User Current session? 1 livy-pxxx pyspark idle Link None ✔ SparkSession available as 'spark'. +--------------------+ | namespace| +--------------------+ | default| | xxx db| | xxx dome| | hive test| +--------------------+
方式二:使用sparkmagic外掛程式啟動環境
步驟一:建立Gateway及訪問Token
-
建立並啟動Gateway。
-
進入Gateway頁面。
-
在左側導覽列,選擇EMR Serverless > Spark。
-
在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。
在Jupyter Notebook中建立Spark Session,支援Python和Scala兩種語言,您可以根據實際需求選擇語言並完成相關配置。
%spark add -s <session_name> -l python -u https://<endpoint> -a username -p <token>%spark add -s <session_name> -l scala -u https://<endpoint> -a username -p <token>請根據您的實際情況替換以下資訊。
參數
說明
<session_name>Spark Session的名稱。您可以自訂。
<endpoint>您在总览頁簽擷取的Endpoint(外网)或Endpoint(内网)資訊。
如果使用內網Endpoint,請確保運行 Jupyter 的機器與 Livy Gateway部署在同一Region,且Endpoint前的
https://需改為http://。<token>替換為您在步驟一中複製的Token資訊。
本文樣本以Python語言為例。
%spark add -s test -l python -u https://emr-spark-livy-gateway-cn-hangzhou.data.aliyun.com/api/v1/workspace/w-0aaxxx livycompute/lc-76c4pcxxx -a username -p t6k2zy Starting Spark application ID YARN Application ID Kind State Spark UI Driver log User Current session? 0 livy-idqxxx pyspark idle Link None ✓ SparkSession available as 'spark'.請耐心等待1至5分鐘直至Session狀態變為
idle,則表明Session已成功建立並準備就緒。此時,介面會展示新建立的Session詳情,您可以開始進行Pyspark互動式開發。您還可以通過Serverless Spark控制台,在目標Livy Gateway的Session 列表頁簽,查看Session資訊。 -
驗證Session。
Session建立成功後,您可以通過
%%spark執行代碼。例如,通過以下代碼查看當前 Spark 環境中的所有資料庫。%%spark spark.sql("show databases").show()返回資訊如下所示。
%%spark spark.sql("show databases").show() +---------+ |namespace| +---------+ | default| | testdb| +---------+
(可選)步驟四:釋放Session資源
-
自動釋放。
建立的Session會在閑置達到兩小時後自動終止。
-
手動釋放。
-
通過
sparkmagic外掛程式釋放。%spark delete -s <session_name> -
通過Serverless Spark控制台釋放。
在目標Livy Gateway的Session 列表頁簽,單擊已建立Session操作列的关闭。
-