Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何在 AWS Glue ETL 工作中使用外部 Python 程式庫?
我想在 AWS Glue 擷取、轉換和載入 (ETL) 工作中使用外部 Python 程式庫。
簡短說明
當您使用 AWS Glue 2.0、3.0 和 4.0 版本時,您可以在工作層級安裝其他 Python 模組或不同的模組版本。若要新增模組或變更現有模組的版本,請使用 --additional-python-modules 工作參數索引鍵。索引鍵的值是以逗號分隔的 Python 模組名稱清單。當您使用此參數時,AWS Glue ETL 工作會透過 Python 套件安裝程式 (pip3) 安裝其他模組。
您也可以使用 --additional-python-modules 參數來安裝以 C 為基礎的語言編寫的 Python 程式庫。
解決方法
安裝或更新 Python 模組
若要為 AWS Glue 工作安裝其他 Python 模組,請完成下列步驟:
- 開啟 AWS Glue 主控台。
- 在導覽窗格中,選擇工作。
- 選取您想要在其中新增 Python 模組的工作。
- 選擇動作,然後選擇編輯工作。
- 展開安全組態、指令碼程式庫和工作參數 (選用) 區段。
- 在工作參數下,執行下列動作:
對於索引鍵,輸入 --additional-python-modules。
對於值,請輸入您要新增之模組的以逗號分隔清單。 - 選擇 Save (儲存)。
例如,假設您想新增兩個新模組,PyMySQL 1.0.2 版和自然語言工具箱 (NLTK) 3.6.2 版。您可以透過網際網路安裝 PyMySQL 模組,並透過 Amazon Simple Storage Service (Amazon S3) 儲存貯體安裝 NLTK 模組。在這種情況下,--additional-python-modules 參數索引鍵具有值 pymysql==1.0.2, s3://aws-glue-add-modules/nltk-3.6.2-py3-none-any.whl。
部分模組對其他模組有相依性。如果您安裝或更新此類模組,您也必須下載其相依的其他模組。這意味著您必須具有網際網路存取權限才能安裝或更新模組。如果您沒有網際網路存取權,請參閱使用 AWS Glue 2.0 從 wheel 為 Spark ETL 工作負載建立 Python 模組。
如需每個 AWS Glue 版本中預設包含的 Python 模組清單,請參閱 AWS Glue 中已提供的 Python 模組。
安裝 C 語言 Python 模組
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
AWS Glue 還支援使用 C 編寫的程式庫和擴充功能,並具有 --additional-python-modules 參數。但是,部分 Python 模組 (例如 spacy 和 grpc) 需要根使用者權限才可安裝。AWS Glue 不會在套件安裝期間提供根使用者存取權。若要解決此問題,請將二進位檔案預先編譯成與 AWS Glue 相容的 wheel,然後安裝該 wheel。
若要以 C 語言編譯程式庫,編譯器必須與目標作業系統及處理器架構相容。如果程式庫是根據不同的作業系統或處理器架構編譯,則 wheel 並未安裝在 AWS Glue 中。因為 AWS Glue 為受管服務,所以不會提供叢集存取權來開發這些相依項。
若要預先編譯需要 root 權限的 C 語言 Python 模組,請完成下列步驟:
-
啟動具有足夠磁碟區空間可供程式庫使用的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 執行個體 (Amazon Linux 2 AMI)。
-
在 EC2 執行個體上安裝 Docker,設定非 sudo 存取權,然後啟動 Docker。若要這麼做,請執行下列命令:
安裝 Docker:
sudo yum install docker -y設定 sudo 存取權:
sudo su啟動 Docker:
sudo service docker start -
為模組建立一個 Dockerfile 檔案。例如,若要安裝 grpcio 模組,請建立名為 dockerfile_grpcio 的檔案,然後將下列內容複製到檔案中:
FROM amazonlinux:2 \# Install required repositories and tools RUN yum update -y RUN yum install shadow-utils.x86\_64 -y \# Install Java 8 (corrected package name) RUN yum install -y java-1.8.0-openjdk.x86\_64 \# Install Python 3.7 WORKDIR /opt RUN yum install -y gcc openssl-devel bzip2-devel libffi-devel wget tar make \# Install Python 3.7 RUN wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz RUN tar xzf Python-3.7.12.tgz WORKDIR /opt/Python-3.7.12 RUN ./configure --enable-optimizations RUN make altinstall RUN ln -sf /usr/local/bin/python3.7 /usr/bin/python3 RUN ln -sf /usr/local/bin/pip3.7 /usr/bin/pip3 \# Verify Python version RUN python3 --version RUN pip3 --version \# Install other dependencies RUN yum install -y doxygen autoconf automake libtool zlib-devel openssl-devel maven wget protobuf-compiler cmake make gcc-c++ RUN yum install -y python3-devel \# Install Python packages RUN pip3 install --upgrade pip RUN pip3 install wheel RUN pip3 install cython numpy scipy RUN pip3 install cmake scikit-build \# Create wheel directory and install grpcio WORKDIR /root RUN mkdir wheel\_dir RUN pip3 install Cython RUN pip3 install grpcio RUN pip3 wheel grpcio -w wheel\_dir -
執行 docker 組建以建置您的 Dockerfile:
docker build -f dockerfile\_grpcio . -
重新啟動 Docker 常駐程式:
sudo service docker restart當 docker 建置命令完成後,您會收到包含您 Docker 映像檔 ID 的成功訊息。例如 "Successfully built 1111222233334444"。記下要在下一步中使用的 Docker 映像檔 ID。
-
從 Docker 容器中擷取 .whl wheel 檔案。若要這麼做,請執行下列命令:
取得 Docker 映像檔 ID:
docker image ls執行容器,但使用您的 Docker 映像檔 ID 替換 1111222233334444:
docker run -dit 111122223334444驗證 wheel 檔案的位置並擷取 wheel 檔案的名稱,但是用您的容器 ID 取代 5555666677778888:
docker exec -t -i 5555666677778888 ls /root/wheel\_dir/將 wheel 從 Docker 容器複製到 Amazon EC2:
docker cp 5555666677778888:/root/wheel\_dir/doc-example-wheel .**注意:**請使用產生成的 wheel 檔案名稱取代 doc-example-wheel
-
若要將 wheel 上傳至 Amazon S3,請執行下列命令:
aws s3 cp doc-example-wheel s3://path/to/wheel/aws s3 cp grpcio-1.32.0-cp37-cp37m-linux\_x86\_64.whl s3://aws-glue-add-modules/grpcio/**注意:**請使用 Python 套件檔案的名稱取代 grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl。
-
開啟 AWS Glue 主控台。
-
對於 AWS Glue ETL 工作,請在 Job parameters (工作參數) 下輸入下列項目:
對於索引鍵,輸入 --additional-python-modules。
對於值,請輸入 s3://aws-glue-add-modules/grpcio/grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl。

