本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學課程:在 JupyterLab 中設定 Jupyter 筆記本以測試和偵錯 ETL 指令碼
在本教學課程中,您將在本機電腦上執行的 JupyterLab 中 Jupyter 筆記本連接到開發端點。您可以執行這項操作,在進行部署之前,先以互動方式執行、偵錯和測試 AWS Glue 擷取、轉換和載入 (ETL) 指令碼。此教學課程使用 Secure Shell (SSH) 連接埠轉送以連接您的本機至 AWS Glue 開發端點。如需詳細資訊,請參閱 Wikipedia 中的 Port forwarding
步驟 1:安裝 JupyterLab 和 Sparkmagic
您使用 conda
或 pip
來安裝 JupyterLab。conda
是可在 Windows、macOS 和 Linux 上執行的開源套件管理系統以及環境管理系統。pip
是 Python 的套件安裝程式。
如果您在 macOS 上安裝,您必須先安裝 Xcode,才能安裝 Sparkmagic。
-
安裝 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
-
檢查
Location
的sparkmagic
目錄。$
pip show sparkmagic | grep Location
Location: /Users/
username
/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages -
將您的目錄變更為
Location
傳回的目錄,並安裝 Scala 和 PySpark 的核心。$
cd /Users/
$username
/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packagesjupyter-kernelspec install sparkmagic/kernels/sparkkernel
$jupyter-kernelspec install sparkmagic/kernels/pysparkkernel
-
下載範例
config
檔案。$
curl -o ~/.sparkmagic/config.json https://raw.githubusercontent.com/jupyter-incubator/sparkmagic/master/sparkmagic/example_config.json
在此組態檔案中,您可以設定 Spark 相關的參數,如
driverMemory
和executorCores
。
步驟 2:啟動 JupyterLab
當您啟動 JupyterLab 時,系統會自動開啟您的預設網頁瀏覽器,然後顯示 URL http://localhost:8888/lab/workspaces/{workspace_name}
。
$
jupyter lab
步驟 3:啟動 SSH 連接埠轉送以連線到您的開發端點
然後,使用 SSH 本機連接埠轉送,將本機連接埠 (在這裡是 8998
) 轉送至 AWS Glue (169.254.76.1:8998
) 定義的遠端目的地。
-
開啟單獨的終端機視窗,讓您存取 SSH。在 Microsoft Windows 上,您可以使用 Git for Windows
所提供的 BASH shell,或安裝 Cygwin 。 -
執行以下 SSH 命令,修改如下:
-
以
.pem
檔案 (內含與您用於建立開發端點的公有金鑰相關聯的私有金鑰) 的路徑取代
。private-key-file-path
-
如果您轉送不同於
8998
的連接埠,請以您實際在本機使用的連接埠號取代8998
。地址169.254.76.1:8998
是遠端連接埠,且並非由您所變更。 -
以您的開發端點的公有 DNS 位址取代
。若要尋找此地址,請在 AWS Glue 主控台瀏覽到您的開發端點並選擇其名稱,然後將 Endpoint details (端點詳細資訊) 頁面中列出的 Public address (公有地址)。dev-endpoint-public-dns
ssh -i
private-key-file-path
-NTL8998
: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 時維持終端機視窗在開啟狀態。 -
-
檢查 SSH 連接埠轉送是否正確與開發端點一起運作。
$ curl localhost:8998/sessions {"from":0,"total":0,"sessions":[]}
步驟 4:在筆記本段落中執行簡單的指令碼片段
現在,您的 JupyterLab 中的筆記本應該可以與您的開發端點一起工作。將以下指令碼片段輸入筆記本並執行。
-
檢查 Spark 是否成功執行。下面的命令會指示 Spark 計算
1
,然後列印該值。spark.sql("select 1").show()
-
檢查 AWS Glue Data Catalog 整合是否正在運作。以下命令會列出 Data Catalog 中的資料表。
spark.sql("show tables").show()
-
檢查使用 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 網站上的安裝問題
。 -
如果在嘗試連接到開發端點時遇到連線遭拒的錯誤,有可能您使用的開發端點已過期。請嘗試建立新的開發端點並重新連線。