本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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 常駐程式正在執行。如需安裝說明,請參閱 Mac
如需在本機開發 AWS Glue 程式碼時限制的詳細資訊,請參閱本機開發限制。
設定 AWS
若要從容器啟用 AWS API 呼叫,請依照下列步驟設定 AWS 登入資料。在下列各節中,我們將使用此 AWS 具名設定檔。
-
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 任務指令碼。
-
撰寫指令碼並將其儲存為以下範例
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}
-
這些變數用於下面的 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
-
(選用) 設定
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 設定容器,請完成下列步驟:
安裝 Visual Studio Code。
安裝 Python
。 在 Visual Studio Code 中開啟 workspace (工作區) 資料夾。
按
Ctrl+Shift+P
(Windows/Linux) 或Cmd+Shift+P
(Mac)。輸入
Preferences: Open Workspace Settings (JSON)
。按 Enter。
將下列 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/", ] }
若要設定容器:
-
執行 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
-
啟動 Visual Studio Code。
-
選擇左側選單中的 Remote Explorer (遠端檔案總管),然後選擇
amazon/aws-glue-libs:glue_libs_4.0.0_image_01
。 -
在目前視窗中按一下滑鼠右鍵並選擇連接。
-
如果出現下列對話方塊,請選擇取得。
-
打開
/home/handoop/workspace/
. -
建立 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 容器映像在本機開發任務指令碼時,不支援下列功能。
-
AWS Glue Parquet 寫入器 (在 中使用 Parquet 格式 AWS Glue)
-
屬性 customJdbcDriverS3Path,用於從 Amazon S3 路徑載入 JDBC 驅動程式
-
AWS Lake Formation 以許可為基礎的登入資料販賣
附錄:新增 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 驅動程式。