通過Jupyter Notebook與Serverless Spark進(jìn)行交互
Jupyter Notebook是一個(gè)強(qiáng)大的交互式開發(fā)工具,您可以在Web界面中即時(shí)編寫和執(zhí)行代碼,并實(shí)時(shí)查看結(jié)果,無需進(jìn)行預(yù)編譯或單獨(dú)執(zhí)行腳本。本文將為您介紹如何構(gòu)建高效的與Serverless Spark交互的開發(fā)環(huán)境。
背景信息
Apache Livy通過REST接口與Spark進(jìn)行交互,極大地簡(jiǎn)化了Spark和應(yīng)用程序服務(wù)器之間的通信復(fù)雜度。關(guān)于Livy API,請(qǐng)參見REST API。
在使用Jupyter Notebook進(jìn)行開發(fā)時(shí),您可以通過使用sparkmagic插件或Docker鏡像兩種方式與Serverless Spark進(jìn)行交互。請(qǐng)根據(jù)實(shí)際情況選擇最適合的方案。
方式 | 適用場(chǎng)景 |
如果您希望快速構(gòu)建一個(gè)獨(dú)立的開發(fā)環(huán)境,或者需要在不同機(jī)器上復(fù)現(xiàn)相同的設(shè)置,使用Docker鏡像將是一個(gè)便捷的選擇。 | |
Jupyter Notebook的sparkmagic插件通過REST接口與Spark進(jìn)行交互,目前sparkmagic支持Livy、Livy Lighter和Ilum三種協(xié)議。配置Jupyter Notebook中的sparkmagic插件,并利用Serverless Spark的Livy API,以實(shí)現(xiàn)一個(gè)高效的與遠(yuǎn)程Spark集群交互的開發(fā)環(huán)境。 |
前提條件
根據(jù)您選擇的交互式開發(fā)的方式進(jìn)行相應(yīng)的操作:
方式一:使用Docker鏡像快速啟動(dòng)環(huán)境:已安裝Docker,詳情請(qǐng)參見Docker官方文檔。
方式二:使用sparkmagic插件啟動(dòng)環(huán)境:已安裝并啟動(dòng)Jupyter Notebook,詳情請(qǐng)參見Project Jupyter | Installing Jupyter。
本文示例使用的是Jupyter Notebook與Python 3.8進(jìn)行演示。
已創(chuàng)建工作空間,詳情請(qǐng)參見創(chuàng)建工作空間。
方式一:使用Docker鏡像快速啟動(dòng)環(huán)境
步驟一:創(chuàng)建Gateway及訪問Token
創(chuàng)建Gateway。
進(jìn)入Gateway頁(yè)面。
在左側(cè)導(dǎo)航欄,選擇
。在Spark頁(yè)面,單擊目標(biāo)工作空間名稱。
在EMR Serverless Spark頁(yè)面,單擊左側(cè)導(dǎo)航欄中的
。
在Livy Gateway頁(yè)面,單擊創(chuàng)建Livy Gateway。
在創(chuàng)建Gateway頁(yè)面,輸入名稱(例如,Livy-gateway),單擊創(chuàng)建。
其余參數(shù)請(qǐng)根據(jù)具體情況進(jìn)行調(diào)整,更多參數(shù)信息請(qǐng)參見管理Gateway。
創(chuàng)建Token。
在Gateway頁(yè)面,單擊Livy-gateway操作列的Token管理。
單擊創(chuàng)建Token。
在創(chuàng)建Token對(duì)話框中,輸入名稱(例如,Livy-token),單擊確定。
復(fù)制Token信息。
重要Token創(chuàng)建完成后,請(qǐng)務(wù)必立即復(fù)制新Token的信息,后續(xù)不支持查看。如果您的Token過期或遺失,請(qǐng)選擇新建Token或重置Token。
步驟二:使用Docker拉取并啟動(dòng)鏡像
執(zhí)行以下命令,拉取鏡像。
docker pull emr-registry-registry.cn-hangzhou.cr.aliyuncs.com/serverless-spark-public/emr-spark-jupyter:latest
執(zhí)行以下命令,啟動(dòng)鏡像。
docker run -p <host_port>:8888 emr-registry-registry.cn-hangzhou.cr.aliyuncs.com/serverless-spark-public/emr-spark-jupyter:latest <endpoint> <token>
涉及參數(shù)說明如下表所示。
參數(shù)
說明
<host_port>
替換為您的主機(jī)端口。
<endpoint>
替換為L(zhǎng)ivy Gateway的Endpoint信息。
您可以在Livy Gateway頁(yè)面,單擊已創(chuàng)建的Livy Gateway的名稱,在總覽頁(yè)簽,查看Endpoint信息。
<token>
替換為您前一個(gè)步驟中復(fù)制的Token信息。
待鏡像啟動(dòng)后,您可以看到返回如下提示信息。
[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。
請(qǐng)復(fù)制返回信息中的
http://127.0.0.1:8888/lab?token=258c0dd75e22a10fb6e2c87ac738c2a7ba6a314c6b******
鏈接到瀏覽器中,即可直接使用Jupyter服務(wù)連接Serverless Spark。說明如果您是通過遠(yuǎn)程服務(wù)器進(jìn)行連接,請(qǐng)將IP地址
127.0.0.1
替換為服務(wù)器的實(shí)際IP地址。如果啟動(dòng)鏡像時(shí)的
host_port
不是8888
,請(qǐng)將端口號(hào)替換為實(shí)際的端口號(hào)。
步驟三:測(cè)試連通性
在JupyterLab頁(yè)面,單擊PySpark。
執(zhí)行以下命令,查詢可訪問的所有數(shù)據(jù)庫(kù)。
spark.sql("show databases").show()
返回信息如下所示。
方式二:使用sparkmagic插件啟動(dòng)環(huán)境
步驟一:創(chuàng)建Gateway及訪問Token
創(chuàng)建Gateway。
進(jìn)入Gateway頁(yè)面。
在左側(cè)導(dǎo)航欄,選擇
。在Spark頁(yè)面,單擊目標(biāo)工作空間名稱。
在EMR Serverless Spark頁(yè)面,單擊左側(cè)導(dǎo)航欄中的
。
在Livy Gateway頁(yè)面,單擊創(chuàng)建Livy Gateway。
在創(chuàng)建Gateway頁(yè)面,輸入名稱(例如,Livy-gateway),單擊創(chuàng)建。
其余參數(shù)請(qǐng)根據(jù)具體情況進(jìn)行調(diào)整,更多參數(shù)信息請(qǐng)參見管理Gateway。
創(chuàng)建Token。
在Gateway頁(yè)面,單擊Livy-gateway操作列的Token管理。
單擊創(chuàng)建Token。
在創(chuàng)建Token對(duì)話框中,輸入名稱(例如,Livy-token),單擊確定。
復(fù)制Token信息。
重要Token創(chuàng)建完成后,請(qǐng)務(wù)必立即復(fù)制新Token的信息,后續(xù)不支持查看。如果您的Token過期或遺失,請(qǐng)選擇新建Token或重置Token。
步驟二:安裝并啟用sparkmagic插件
執(zhí)行以下命令,安裝sparkmagic插件。
pip install sparkmagic
根據(jù)您使用的Jupyter環(huán)境(Jupyter Notebook或JupyterLab),啟用相應(yīng)的插件。
對(duì)于Jupyter Notebook用戶
jupyter nbextension enable --py --sys-prefix widgetsnbextension
對(duì)于JupyterLab用戶
jupyter labextension install "@jupyter-widgets/jupyterlab-manager"
sparkmagic插件的更多詳細(xì)信息和高級(jí)配置選項(xiàng),請(qǐng)參見sparkmagic。
步驟三:配置與啟動(dòng)交互式Spark Session
訪問Jupyter UI,詳情請(qǐng)參見JupyterLab。
載入與配置sparkmagic插件。
首次載入sparkmagic插件可能要求重啟Jupyter。
# 載入sparkmagic插件。 %load_ext sparkmagic.magics # 管理session。 %manage_spark # 調(diào)大創(chuàng)建session的超時(shí)時(shí)間。 import sparkmagic.utils.configuration as conf conf.override("livy_session_startup_timeout_seconds", 1000)
說明需要調(diào)大sparkmagic插件的啟動(dòng)session超時(shí)時(shí)間,否則可能會(huì)出現(xiàn)無法啟動(dòng)session的情況。
管理Endpoint配置。
單擊Add Endpoint標(biāo)簽。
配置以下信息,單擊Add endpoint。
涉及參數(shù)信息如下。
參數(shù)
說明
Auth type
選擇Basic_Access。
Address
填寫格式為
https://<Gateway的Endpoint信息>
。Username
使用默認(rèn)值即可。
Password
為您步驟一中復(fù)制的Token信息。
創(chuàng)建Session。
單擊Create Session標(biāo)簽。
配置以下信息,單擊Create Session。
涉及參數(shù)信息如下。
參數(shù)
說明
Endpoint
選擇前一個(gè)步驟添加的Endpoint。
Name
Session名稱,您可以自定義。
Language
本文以Python為例。
Properties
在Properties中可自定義driver和executor的資源配置。不填寫則默認(rèn)為兩個(gè)executor,driver和executor各1 CU。
說明Spark默認(rèn)會(huì)有10%的堆外內(nèi)存,例如設(shè)置4 GB內(nèi)存,則實(shí)際消耗約為4.4 GB。
Properties示例如下。
{ "driverMemory": "3584m", "driverCores": 1, "executorMemory": "7372m", "executorCores": 2, "numExecutors": 4 }
驗(yàn)證Session。
請(qǐng)耐心等待1至5分鐘直至Session狀態(tài)變?yōu)?code data-tag="code" class="code blog-code" code-type="xCode">idle,則表明Session已成功創(chuàng)建并準(zhǔn)備就緒。此時(shí),界面會(huì)展示新創(chuàng)建的Session詳情,您可以開始進(jìn)行Pyspark交互式開發(fā)。
示例1:查詢可訪問的所有數(shù)據(jù)庫(kù)。
%%spark spark.sql("show databases").show()
返回信息如下所示。
示例2: 輸出從1到9的數(shù)字之和。
%%spark import os sum = sc.range(1,10).sum() print("sum = " + str(sum))
返回信息如下所示。
(可選)步驟四:釋放Session資源
創(chuàng)建的Session會(huì)在閑置達(dá)到兩小時(shí)后自動(dòng)終止,確保資源的及時(shí)回收。此外,您也可以手動(dòng)單擊sparkmagic插件界面上的Delete來提前結(jié)束并釋放會(huì)話資源。