如何在 AWS Glue ETL 工作中使用外部 Python 程式庫?

3 分的閱讀內容
0

我想在 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 模組,請完成下列步驟:

  1. 開啟 AWS Glue 主控台
  2. 在導覽窗格中,選擇工作
  3. 選取您想要在其中新增 Python 模組的工作。
  4. 選擇動作,然後選擇編輯工作
  5. 展開安全組態、指令碼程式庫和工作參數 (選用) 區段。
  6. 工作參數下,執行下列動作:
    對於索引鍵,輸入 --additional-python-modules
    對於,請輸入您要新增之模組的以逗號分隔清單。
  7. 選擇 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 模組 (例如 spacygrpc) 需要根使用者權限才可安裝。AWS Glue 不會在套件安裝期間提供根使用者存取權。若要解決此問題,請將二進位檔案預先編譯成與 AWS Glue 相容的 wheel,然後安裝該 wheel。

若要以 C 語言編譯程式庫,編譯器必須與目標作業系統及處理器架構相容。如果程式庫是根據不同的作業系統或處理器架構編譯,則 wheel 並未安裝在 AWS Glue 中。因為 AWS Glue 為受管服務,所以不會提供叢集存取權來開發這些相依項。

若要預先編譯需要 root 權限的 C 語言 Python 模組,請完成下列步驟:

  1. 啟動具有足夠磁碟區空間可供程式庫使用的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 執行個體 (Amazon Linux 2 AMI)。

  2. 在 EC2 執行個體上安裝 Docker,設定非 sudo 存取權,然後啟動 Docker。若要這麼做,請執行下列命令:

    安裝 Docker:

    sudo yum install docker -y

    設定 sudo 存取權:

    sudo su

    啟動 Docker:

    sudo service docker start
  3. 為模組建立一個 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
  4. 執行 docker 組建以建置您的 Dockerfile:

    docker build -f dockerfile\_grpcio .
  5. 重新啟動 Docker 常駐程式:

    sudo service docker restart

    當 docker 建置命令完成後,您會收到包含您的 Docker 映像檔 ID 的成功訊息。例如 「成功建置 1111222233334444」。記下要在下一步中使用的 Docker 映像檔 ID。

  6. 從 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

  7. 若要將 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

  8. 開啟 AWS Glue 主控台

  9. 對於 AWS Glue ETL 工作,請在 Job parameters (工作參數) 下輸入下列項目:
    對於索引鍵,輸入 --additional-python-modules
    對於,請輸入 s3://aws-glue-add-modules/grpcio/grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl

相關資訊

搭配 AWS Glue 使用 Python 程式庫

AWS 官方
AWS 官方已更新 2 個月前