

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

# 教學課程：在 JupyterLab 中設定 Jupyter 筆記本以測試和偵錯 ETL 指令碼
<a name="dev-endpoint-tutorial-local-jupyter"></a>

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

## 步驟 1：安裝 JupyterLab 和 Sparkmagic
<a name="dev-endpoint-tutorial-local-jupyter-install"></a>

您使用 `conda` 或 `pip` 來安裝 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
   ```

1. 檢查 `Location` 的 `sparkmagic` 目錄。

   ```
   $ pip show sparkmagic | grep Location
   Location: /Users/{{username}}/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages
   ```

1. 將您的目錄變更為 `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
   ```

1. 下載範例 `config` 檔案。

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

   在此組態檔案中，您可以設定 Spark 相關的參數，如 `driverMemory` 和 `executorCores`。

## 步驟 2：啟動 JupyterLab
<a name="dev-endpoint-tutorial-local-jupyter-start"></a>

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

```
$ jupyter lab
```

## 步驟 3：啟動 SSH 連接埠轉送以連線到您的開發端點
<a name="dev-endpoint-tutorial-local-jupyter-port-forward"></a>

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

1. 開啟單獨的終端機視窗，讓您存取 SSH。在 Microsoft Windows 上，您可以使用 [Git for Windows](https://git-scm.com/downloads) 所提供的 BASH shell，或安裝 [Cygwin](https://www.cygwin.com/)。

1. 執行以下 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 時維持終端機視窗在開啟狀態。

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

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

## 步驟 4：在筆記本段落中執行簡單的指令碼片段
<a name="dev-endpoint-tutorial-local-jupyter-list-schema"></a>

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

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

   ```
   spark.sql("select 1").show()
   ```

1. 檢查 AWS Glue Data Catalog 整合是否正常運作。以下命令會列出 Data Catalog 中的資料表。

   ```
   spark.sql("show tables").show()
   ```

1. 檢查使用 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
```

## 疑難排解
<a name="dev-endpoint-tutorial-local-jupyter-troubleshooting"></a>
+ 在 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 網站上的[安裝問題](https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html#installation-problems)。
+ 如果在嘗試連接到開發端點時遇到*連線遭拒*的錯誤，有可能您使用的開發端點已過期。請嘗試建立新的開發端點並重新連線。