使用 Docker 映像在本機開發和測試 AWS Glue 任務 - AWS Glue

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

使用 Docker 映像在本機開發和測試 AWS Glue 任務

對於生產就緒的資料平台,開發程序和 AWS Glue 任務的 CI/CD 管道是關鍵主題。您可以在 Docker 容器中彈性開發和測試 AWS Glue 任務。在 Docker Hub 上 AWS Glue 託管 Docker 映像,以使用其他公用程式設定您的開發環境。您可以使用 ETL 程式庫來使用您偏好的 AWS Glue IDE、筆記本或 REPL。本主題說明如何使用 Docker 映像在 Docker 容器中開發和測試 5.0 AWS Glue 版任務。

可用的 Docker 映像

下列 Docker 映像可在 Amazon ECR AWS Glue 上使用: https://gallery.ecr.aws/glue/aws-glue-libs

  • 對於 5.0 AWS Glue 版: public.ecr.aws/glue/aws-glue-libs:5

  • 對於 4.0 AWS Glue 版: public.ecr.aws/glue/aws-glue-libs:glue_libs_4.0.0_image_01

  • 對於 3.0 AWS Glue 版: public.ecr.aws/glue/aws-glue-libs:glue_libs_3.0.0_image_01

  • 對於 2.0 AWS Glue 版: public.ecr.aws/glue/aws-glue-libs:glue_libs_2.0.0_image_01

注意

AWS Glue Docker 映像與 x86_64 和 arm64 相容。

在此範例中,我們會在本機機器 (Mac、Windows 或 Linux) 上使用public.ecr.aws/glue/aws-glue-libs:5和執行容器。此容器映像已針對 5.0 AWS Glue 版 Spark 任務進行測試。映像包含下列項目:

  • Amazon Linux 2023

  • AWS Glue ETL 程式庫

  • Apache Spark 3.5.4

  • 開啟資料表格式程式庫;Apache Iceberg 1.7.1、Apache Hudi 0.15.0 和 Delta Lake 3.3.0

  • AWS Glue Data Catalog 用戶端

  • Amazon Redshift Apache Spark 連接器

  • Amazon DynamoDB Apache Hadoop 連接器

若要設定容器,請從 ECR Public Gallery 提取映像,然後執行容器。本主題示範如何使用下列方法執行容器,視您的需求而定:

  • spark-submit

  • REPL 殼層 (pyspark)

  • pytest

  • Visual Studio 程式碼

先決條件

在開始之前,請務必安裝 Docker 並確保 Docker 常駐程式正在執行。如需安裝說明,請參閱 MacLinux 專用的 Docker 文件。執行 Docker 的機器託管 AWS Glue 容器。亦請確保執行 Docker 的主機上至少有 7 GB 的磁碟空間可供映像檔使用。

如需在本機開發 AWS Glue 程式碼時限制的詳細資訊,請參閱本機開發限制。

設定 AWS

若要從容器啟用 AWS API 呼叫,請依照下列步驟設定 AWS 登入資料。在下列各節中,我們將使用此 AWS 具名設定檔。

  1. 建立 AWS 具名設定檔

  2. cmd 在 Windows 或 Mac/Linux 上的終端機上開啟,並在終端機中執行下列命令:

    PROFILE_NAME="<your_profile_name>"

在下列各節中,我們會使用此 AWS 具名設定檔。

如果您在 Windows 上執行 Docker,請選擇 Docker 圖示 (按一下滑鼠右鍵),然後選擇切換到 Linux 容器,然後再提取映像。

執行下列命令,從 ECR Public 提取映像:

docker pull public.ecr.aws/glue/aws-glue-libs:5

執行容器

然後再使用此映像檔執行容器。您可根據自己的需求選擇下列任何選項。

spark-submit

您可以在容器上執行 spark-submit命令,以執行 AWS Glue 任務指令碼。

  1. 撰寫指令碼並將其儲存為以下範例sample.py,並使用下列命令將其儲存在 /local_path_to_workspace/src/目錄下:

    $ WORKSPACE_LOCATION=/local_path_to_workspace $ SCRIPT_FILE_NAME=sample.py $ mkdir -p ${WORKSPACE_LOCATION}/src $ vim ${WORKSPACE_LOCATION}/src/${SCRIPT_FILE_NAME}
  2. 這些變數用於下面的 docker run 命令。以下 spark-submit 命令中使用的範例程式碼 (sample.py://) 包含在本主題結尾的附錄中。

    執行下列命令可在容器上執行 spark-submit 命令以提交新的 Spark 應用程式:

    $ docker run -it --rm \ -v ~/.aws:/home /hadoop/.aws \ -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \ -e AWS_PROFILE=$PROFILE_NAME \ --name glue5_spark_submit \ public.ecr.aws/glue/aws-glue-libs:5 \ spark-submit /home/hadoop/workspace/src/$SCRIPT_FILE_NAME
  3. (選用) 設定 spark-submit 以符合您的環境。例如,可以將相依項與 --jars 組態一起傳遞。如需詳細資訊,請參閱 Spark 文件中的動態載入 Spark 屬性

REPL Shell (Pyspark)

您可以執行 REPL (read-eval-print loops) shell 進行互動式開發。執行以下命令可在容器上執行 PySpark 命令以啟動 REPL Shell:

$ docker run -it --rm \ -v ~/.aws:/home/hadoop/.aws \ -e AWS_PROFILE=$PROFILE_NAME \ --name glue5_pyspark \ public.ecr.aws/glue/aws-glue-libs:5 \ pyspark

您將看到下列輸出:

Python 3.11.6 (main, Jan 9 2025, 00:00:00) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)] on linux Type "help", "copyright", "credits" or "license" for more information. Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /__ / .__/\_,_/_/ /_/\_\ version 3.5.4-amzn-0 /_/ Using Python version 3.11.6 (main, Jan 9 2025 00:00:00) Spark context Web UI available at None Spark context available as 'sc' (master = local[*], app id = local-1740643079929). SparkSession available as 'spark'. >>>

使用此 REPL shell,您可以以互動方式編寫程式碼和進行測試。

Pytest

對於單元測試,您可以使用 pytest進行 AWS Glue Spark 任務指令碼。執行下列命令以完成前置作業。

$ WORKSPACE_LOCATION=/local_path_to_workspace $ SCRIPT_FILE_NAME=sample.py $ UNIT_TEST_FILE_NAME=test_sample.py $ mkdir -p ${WORKSPACE_LOCATION}/tests $ vim ${WORKSPACE_LOCATION}/tests/${UNIT_TEST_FILE_NAME}

執行下列命令,以pytest使用 執行 docker run

$ docker run -i --rm \ -v ~/.aws:/home/hadoop/.aws \ -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \ --workdir /home/hadoop/workspace \ -e AWS_PROFILE=$PROFILE_NAME \ --name glue5_pytest \ public.ecr.aws/glue/aws-glue-libs:5 \ -c "python3 -m pytest --disable-warnings"

一旦pytest完成執行單元測試,您的輸出將如下所示:

============================= test session starts ============================== platform linux -- Python 3.11.6, pytest-8.3.4, pluggy-1.5.0 rootdir: /home/hadoop/workspace plugins: integration-mark-0.2.0 collected 1 item tests/test_sample.py . [100%] ======================== 1 passed, 1 warning in 34.28s =========================

將容器設為使用 Visual Studio Code

若要使用 Visual Studio Code 設定容器,請完成下列步驟:

  1. 安裝 Visual Studio Code。

  2. 安裝 Python

  3. 安裝 Visual Studio Code Remote - Containers

  4. 在 Visual Studio Code 中開啟 workspace (工作區) 資料夾。

  5. Ctrl+Shift+P(Windows/Linux) 或 Cmd+Shift+P(Mac)。

  6. 輸入 Preferences: Open Workspace Settings (JSON)

  7. 按 Enter。

  8. 將下列 JSON 貼上並儲存。

    { "python.defaultInterpreterPath": "/usr/bin/python3.11", "python.analysis.extraPaths": [ "/usr/lib/spark/python/lib/py4j-0.10.9.7-src.zip:/usr/lib/spark/python/:/usr/lib/spark/python/lib/", ] }

若要設定容器:

  1. 執行 Docker 容器。

    $ docker run -it --rm \ -v ~/.aws:/home/hadoop/.aws \ -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \ -e AWS_PROFILE=$PROFILE_NAME \ --name glue5_pyspark \ public.ecr.aws/glue/aws-glue-libs:5 \ pyspark
  2. 啟動 Visual Studio Code。

  3. 選擇左側選單中的 Remote Explorer (遠端檔案總管),然後選擇 amazon/aws-glue-libs:glue_libs_4.0.0_image_01

  4. 目前視窗中按一下滑鼠右鍵並選擇連接

    按滑鼠右鍵時,會顯示一個視窗,其中包含要在目前視窗中連接的選項。
  5. 如果出現下列對話方塊,請選擇取得

    視窗警告,其中包含「連接至容器可能會執行任意程式碼」訊息。
  6. 打開 /home/handoop/workspace/.

    含有「工作區」選項的視窗下拉式清單會反白顯示。
  7. 建立 a AWS Glue PySpark 指令碼,然後選擇執行

    您會看到指令碼成功執行。

    指令碼成功執行。

AWS Glue 4.0 和 AWS Glue 5.0 Docker 映像之間的變更

AWS Glue 4.0 和 AWS Glue 5.0 Docker 映像檔之間的主要變更:

  • 在 AWS Glue 5.0 中,批次和串流任務都有單一容器映像。這與 Glue 4.0 不同,其中有一個影像用於批次,另一個用於串流。

  • 在 AWS Glue 5.0 中,容器的預設使用者名稱為 hadoop。在 AWS Glue 4.0 中,預設使用者名稱為 glue_user

  • 在 AWS Glue 5.0 中,已從映像中移除多個其他程式庫,包括 JupyterLab 和 Livy。您可以手動安裝它們。

  • 在 AWS Glue 5.0 中,預設會預先載入所有 Iceberg、Hudi 和 Delta 程式庫,且DATALAKE_FORMATS不再需要環境變數。在 AWS Glue 4.0 之前,環境變數DATALAKE_FORMATS環境變數用於指定應載入哪些特定資料表格式。

上述清單專屬於 Docker 映像。若要進一步了解 AWS Glue 5.0 更新,請參閱簡介 AWS Glue 5.0 for Apache Spark 遷移 AWS Glue for Spark 任務至 5.0 AWS Glue 版。

考量事項

請注意,使用 AWS Glue 容器映像在本機開發任務指令碼時,不支援下列功能。

附錄:新增 JDBC 驅動程式和 Java 程式庫

若要新增目前容器中無法使用的 JDBC 驅動程式,您可以使用所需的 JAR 檔案在工作區下建立新的目錄,並在 docker run 命令/opt/spark/jars/中將目錄掛載到 。在容器/opt/spark/jars/內找到的 JAR 檔案會自動新增至 Spark Classpath,並可在任務執行期間使用。

例如,使用下列 docker run 命令,將 JDBC 驅動程式 jar 新增至 PySpark REPL shell。

docker run -it --rm \ -v ~/.aws:/home/hadoop/.aws \ -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \ -v $WORKSPACE_LOCATION/jars/:/opt/spark/jars/ \ --workdir /home/hadoop/workspace \ -e AWS_PROFILE=$PROFILE_NAME \ --name glue5_jdbc \ public.ecr.aws/glue/aws-glue-libs:5 \ pyspark

考量中反白顯示,customJdbcDriverS3Path連線選項無法用於從 AWS Glue 容器映像中的 Amazon S3 匯入自訂 JDBC 驅動程式。