教學課程:在 JupyterLab 中設定 Jupyter 筆記本以測試和偵錯 ETL 指令碼 - AWS Glue

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

教學課程:在 JupyterLab 中設定 Jupyter 筆記本以測試和偵錯 ETL 指令碼

在本教學課程中,您將在本機電腦上執行的 JupyterLab 中 Jupyter 筆記本連接到開發端點。您可以執行這項操作,在進行部署之前,先以互動方式執行、偵錯和測試 AWS Glue 擷取、轉換和載入 (ETL) 指令碼。此教學課程使用 Secure Shell (SSH) 連接埠轉送以連接您的本機至 AWS Glue​ 開發端點。如需詳細資訊,請參閱 Wikipedia 中的 Port forwarding

步驟 1:安裝 JupyterLab 和 Sparkmagic

您使用 condapip 來安裝 JupyterLab。conda 是可在 Windows、macOS 和 Linux 上執行的開源套件管理系統以及環境管理系統。pip 是 Python 的套件安裝程式。

如果您在 macOS 上安裝,您必須先安裝 Xcode,才能安裝 Sparkmagic。

  1. 安裝 JupyterLab、Sparkmagic 和相關的延伸項目。

    $ conda install -c conda-forge jupyterlab $ pip install sparkmagic $ jupyter nbextension enable --py --sys-prefix widgetsnbextension $ jupyter labextension install @jupyter-widgets/jupyterlab-manager
  2. 檢查 Locationsparkmagic 目錄。

    $ pip show sparkmagic | grep Location Location: /Users/username/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages
  3. 將您的目錄變更為 Location 傳回的目錄,並安裝 Scala 和 PySpark 的核心。

    $ cd /Users/username/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages $ jupyter-kernelspec install sparkmagic/kernels/sparkkernel $ jupyter-kernelspec install sparkmagic/kernels/pysparkkernel
  4. 下載範例 config 檔案。

    $ curl -o ~/.sparkmagic/config.json https://raw.githubusercontent.com/jupyter-incubator/sparkmagic/master/sparkmagic/example_config.json

    在此組態檔案中,您可以設定 Spark 相關的參數,如 driverMemoryexecutorCores

步驟 2:啟動 JupyterLab

當您啟動 JupyterLab 時,系統會自動開啟您的預設網頁瀏覽器,然後顯示 URL http://localhost:8888/lab/workspaces/{workspace_name}

$ jupyter lab

步驟 3:啟動 SSH 連接埠轉送以連線到您的開發端點

然後,使用 SSH 本機連接埠轉送,將本機連接埠 (在這裡是 8998) 轉送至 AWS Glue (169.254.76.1:8998) 定義的遠端目的地。

  1. 開啟單獨的終端機視窗,讓您存取 SSH。在 Microsoft Windows 上,您可以使用 Git for Windows 所提供的 BASH shell,或安裝 Cygwin

  2. 執行以下 SSH 命令,修改如下:

    • .pem 檔案 (內含與您用於建立開發端點的公有金鑰相關聯的私有金鑰) 的路徑取代 private-key-file-path

    • 如果您轉送不同於 8998 的連接埠,請以您實際在本機使用的連接埠號取代 8998。地址 169.254.76.1:8998 是遠端連接埠,且並非由您所變更。

    • 以您的開發端點的公有 DNS 位址取代 dev-endpoint-public-dns。若要尋找此地址,請在 AWS Glue 主控台瀏覽到您的開發端點並選擇其名稱,然後將 Endpoint details (端點詳細資訊) 頁面中列出的 Public address (公有地址)。

    ssh -i private-key-file-path -NTL 8998:169.254.76.1:8998 glue@dev-endpoint-public-dns

    您可能會看到類似如下的警告訊息:

    The authenticity of host 'ec2-xx-xxx-xxx-xx.us-west-2.compute.amazonaws.com (xx.xxx.xxx.xx)' can't be established. ECDSA key fingerprint is SHA256:4e97875Brt+1wKzRko+JflSnp21X7aTP3BcFnHYLEts. Are you sure you want to continue connecting (yes/no)?

    輸入 yes,然後在使用 JupyterLab 時維持終端機視窗在開啟狀態。

  3. 檢查 SSH 連接埠轉送是否正確與開發端點一起運作。

    $ curl localhost:8998/sessions {"from":0,"total":0,"sessions":[]}

步驟 4:在筆記本段落中執行簡單的指令碼片段

現在,您的 JupyterLab 中的筆記本應該可以與您的開發端點一起工作。將以下指令碼片段輸入筆記本並執行。

  1. 檢查 Spark 是否成功執行。下面的命令會指示 Spark 計算 1,然後列印該值。

    spark.sql("select 1").show()
  2. 檢查 AWS Glue Data Catalog 整合是否正在運作。以下命令會列出 Data Catalog 中的資料表。

    spark.sql("show tables").show()
  3. 檢查使用 AWS Glue 程式庫的簡單指令碼片段是否有效。

    以下指令碼使用 AWS Glue Data Catalog 中的 persons_json 資料表中繼資料以從範例資料中建立 DynamicFrame。接著它會列印出資料項目數和此資料的結構描述。

import sys from pyspark.context import SparkContext from awsglue.context import GlueContext # Create a Glue context glueContext = GlueContext(SparkContext.getOrCreate()) # Create a DynamicFrame using the 'persons_json' table persons_DyF = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="persons_json") # Print out information about *this* data print("Count: ", persons_DyF.count()) persons_DyF.printSchema()

指令碼的輸出如下。

Count: 1961 root |-- family_name: string |-- name: string |-- links: array | |-- element: struct | | |-- note: string | | |-- url: string |-- gender: string |-- image: string |-- identifiers: array | |-- element: struct | | |-- scheme: string | | |-- identifier: string |-- other_names: array | |-- element: struct | | |-- note: string | | |-- name: string | | |-- lang: string |-- sort_name: string |-- images: array | |-- element: struct | | |-- url: string |-- given_name: string |-- birth_date: string |-- id: string |-- contact_details: array | |-- element: struct | | |-- type: string | | |-- value: string |-- death_date: string

疑難排解

  • 在 JupyterLab 安裝期間,如果您的電腦位於公司代理伺服器或防火牆後方,您可能會因為公司 IT 部門管理的自訂安全性設定檔而遇到 HTTP 和 SSL 錯誤。

    以下是當 conda 無法連接到它自己的儲存庫時會發生的典型錯誤範例:

    CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/current_repodata.json>

    這可能是因為您的公司封鎖了與 Python 和 JavaScript 社群中廣泛使用的儲存庫的連線。如需詳細資訊,請參閱 JupyterLab 網站上的安裝問題

  • 如果在嘗試連接到開發端點時遇到連線遭拒的錯誤,有可能您使用的開發端點已過期。請嘗試建立新的開發端點並重新連線。