全部產品
Search
文件中心

E-MapReduce:通過Jupyter Notebook與Serverless Spark進行互動

更新時間:Jun 12, 2025

Jupyter Notebook是一個強大的互動式開發工具,您可以在Web介面中即時編寫和執行代碼,並即時查看結果,無需進行先行編譯或單獨執行指令碼。本文將為您介紹如何構建高效的與Serverless Spark互動的開發環境。

背景資訊

Apache Livy通過REST介面與Spark進行互動,極大地簡化了Spark和應用程式伺服器之間的通訊複雜度。關於Livy API,請參見REST API

在使用Jupyter Notebook進行開發時,您可以通過使用sparkmagic外掛程式或Docker鏡像兩種方式與Serverless Spark進行互動。請根據實際情況選擇最適合的方案。

方式

適用情境

方式一:使用Docker鏡像快速啟動環境

如果您希望快速構建一個獨立的開發環境,或者需要在不同機器上複現相同的設定,使用Docker鏡像將是一個便捷的選擇。

方式二:使用sparkmagic外掛程式啟動環境

Jupyter Notebook的sparkmagic外掛程式通過REST介面與Spark進行互動,目前sparkmagic支援Livy、Livy Lighter和Ilum三種協議。配置Jupyter Notebook中的sparkmagic外掛程式,並利用Serverless Spark的Livy API,以實現一個高效的與遠程Spark叢集互動的開發環境。

前提條件

方式一:使用Docker鏡像快速啟動環境

步驟一:建立Gateway及訪問Token

  1. 建立並啟動Gateway。

    1. 進入Gateway頁面。

      1. 登入E-MapReduce控制台

      2. 在左側導覽列,選擇EMR Serverless > Spark

      3. Spark頁面,單擊目標工作空間名稱。

      4. EMR Serverless Spark頁面,單擊左側導覽列中的營運中心 > Gateway

    2. 單擊Livy Gateway頁簽。

    3. Livy Gateway頁面,單擊建立Livy Gateway

    4. 在建立Gateway頁面,輸入名稱(例如,Livy-gateway),單擊建立

      其餘參數請根據具體情況進行調整,更多參數資訊請參見Gateway管理

    5. Livy Gateway頁面,單擊已建立Gateway操作列的啟動

  2. 建立Token。

    1. Gateway頁面,單擊Livy-gateway操作列的Token管理

    2. 單擊建立Token

    3. 建立Token對話方塊中,輸入名稱(例如,Livy-token),單擊確定

    4. 複製Token資訊。

      重要

      Token建立完成後,請務必立即複製新Token的資訊,後續不支援查看。如果您的Token到期或遺失,請選擇建立Token或重設Token。

步驟二:使用Docker拉取並啟動鏡像

  1. 執行以下命令,拉取鏡像。

    docker pull emr-registry-registry.cn-hangzhou.cr.aliyuncs.com/serverless-spark-public/emr-spark-jupyter:latest
  2. 執行以下命令,啟動鏡像。

    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******
  3. 訪問Jupyter UI。

    請複製返回資訊中的http://127.0.0.1:8888/lab?token=258c0dd75e22a10fb6e2c87ac738c2a7ba6a314c6b******連結到瀏覽器中,即可直接使用Jupyter服務串連Serverless Spark。

    說明
    • 如果您是通過遠程伺服器進行串連,請將IP地址127.0.0.1替換為伺服器的實際IP地址。

    • 如果啟動鏡像時的host_port不是8888,請將連接埠號碼替換為實際的連接埠號碼。

步驟:測試連通性

  1. 在JupyterLab頁面,單擊PySpark。

    image

  2. 執行以下命令,查詢可訪問的所有資料庫。

    spark.sql("show databases").show()
    

    返回資訊如下所示。

    image

方式二:使用sparkmagic外掛程式啟動環境

步驟一:建立Gateway及訪問Token

  1. 建立並啟動Gateway。

    1. 進入Gateway頁面。

      1. 登入E-MapReduce控制台

      2. 在左側導覽列,選擇EMR Serverless > Spark

      3. Spark頁面,單擊目標工作空間名稱。

      4. EMR Serverless Spark頁面,單擊左側導覽列中的營運中心 > Gateway

    2. 單擊Livy Gateway頁簽。

    3. Livy Gateway頁面,單擊建立Livy Gateway

    4. 在建立Gateway頁面,輸入名稱(例如,Livy-gateway),單擊建立

      其餘參數請根據具體情況進行調整,更多參數資訊請參見Gateway管理

    5. Livy Gateway頁面,單擊已建立Gateway操作列的啟動

  2. 建立Token。

    1. Gateway頁面,單擊Livy-gateway操作列的Token管理

    2. 單擊建立Token

    3. 建立Token對話方塊中,輸入名稱(例如,Livy-token),單擊確定

    4. 複製Token資訊。

      重要

      Token建立完成後,請務必立即複製新Token的資訊,後續不支援查看。如果您的Token到期或遺失,請選擇建立Token或重設Token。

步驟二:安裝並啟用sparkmagic外掛程式

  1. 執行以下命令,安裝sparkmagic外掛程式。

    pip install sparkmagic
  2. 根據您使用的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

  1. 訪問Jupyter UI,詳情請參見JupyterLab

  2. 匯入sparkmagic外掛程式。

    %load_ext sparkmagic.magics
  3. 修改Session啟動配置。

    1. 延長啟動逾時時間,防止因資源調度延遲導致逾時失敗。

      import sparkmagic.utils.configuration as conf
      conf.override("livy_session_startup_timeout_seconds", 1000)
      
    2. (可選)自訂 Spark 資源配置。

      您可自行添加ttl、conf等參數,詳情請參見Livy Docs - REST API

      例如,以下配置樣本展示了如何修改Driver的資源配置。

      %% spark config
      {
         "conf": {
             "spark.driver.cores": "1",
             "spark.driver.memory": "7g"
         }
      }
      
  4. 建立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語言為例,返回資訊如下所示。

    image

    請耐心等待1至5分鐘直至Session狀態變為idle,則表明Session已成功建立並準備就緒。此時,介面會展示新建立的Session詳情,您可以開始進行Pyspark互動式開發。您還可以通過Serverless Spark控制台,在目標Livy Gateway的Session列表頁簽,查看Session資訊。

  5. 驗證Session。

    Session建立成功後,您可以通過%%spark執行代碼。例如,通過以下代碼查看當前 Spark 環境中的所有資料庫。

    %%spark
    spark.sql("show databases").show()
    

    返回資訊如下所示。

    image

(可選)步驟四:釋放Session資源

  • 自動釋放。

    建立的Session會在閑置達到兩小時後自動終止。

  • 手動釋放。

    • 通過 sparkmagic 外掛程式釋放。

      %spark delete -s <session_name>
    • 通過Serverless Spark控制台釋放。

      在目標Livy Gateway的Session列表頁簽,單擊已建立Session操作列的關閉

      image