在 requirements.txt 中 Python 理依賴關係 - Amazon Managed Workflows for Apache Airflow

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

在 requirements.txt 中 Python 理依賴關係

本頁說明我們建議在適用於 Apache 氣流環境之 Amazon 受管工作流程的requirements.txt檔案中安裝和管理 Python 相依性的最佳實務。

使用 Amazon MWAA CLI 實DAGs用程序測試

  • 命令列介面 (CLI) 公用程式可在本機複寫 Apache 氣流環境的 Amazon 受管工作流程。

  • 它會在本地CLI構建類似於 Amazon MWAA 生產映像的 Docker 容器映像。這可讓您在部署到 Amazon 之前執行本機 Apache Airflow 環境來開發和測試DAGs、自訂外掛程式和相依性MWAA。

  • 要運行CLI,請參閱(詳見) GitHub。aws-mwaa-local-runner

使用 PyPi .org 要求文件格式安裝 Python 依賴關係

以下部分描述了根據 PyPi .org 要求文件格式安裝 Python 依賴關係的不同方法。

選項一:Python Package 索引中的依賴關係

以下部分介紹如何從requirements.txt文件中的 Python P ackage 索引指定 Python 依賴關係。

Apache Airflow v2
  1. 在本地測試。在建立檔案之前,以反覆方式新增其他程式庫,以尋找套件及其版本的正確組合。requirements.txt要運行 Amazon MWAA CLI 實用程序,請參閱(詳見) GitHub。aws-mwaa-local-runner

  2. 檢閱 Apache 氣流套件附加功能。要查看 Amazon 上為 Apache Airflow v2 安裝的軟件包列表MWAA,請參閱 GitHub 網站requirements.txt上的 Amazon MWAA 本地運行器。

  3. 新增條件約束陳述式。在檔案頂端新增 Apache 氣流 v2 環境的限制requirements.txt檔案。Apache 氣流限制檔案會指定 Apache 氣流發行時可用的提供者版本。

    從 Apache 氣流 v2.7.2 開始,您的需求文件必須包含一--constraint份聲明。如果您沒有提供限制,Amazon MWAA 會為您指定一個限制,以確保需求中列出的套件與您正在使用的 Apache Airflow 版本相容。

    在下列範例中,取代 {environment-version} 使用您環境的版本號碼,以及 {Python-version} 使用與您的環境兼容的 Python 版本。

    如需與 Apache 氣流環境相容的 Python 版本的相關資訊,請參閱 Apache 氣流版本

    --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-{Airflow-version}/constraints-{Python-version}.txt"

    如果條件約束檔案判斷xyz==1.0套件與您環境中的其他套件不相容,pip3 install將無法防止不相容的程式庫安裝到您的環境中。如果任何套件的安裝失敗,您可以在記錄檔上的對應記錄資料流中檢視每個 Apache Airflow 元件 (排程器、Worker 和 Web 伺服器) 的錯誤 CloudWatch 記錄。如需記錄類型的詳細資訊,請參閱在 Amazon 中查看氣流日誌 CloudWatch

  4. 阿帕奇氣流包。添加包附加功能和版本(==)。這有助於防止在您的環境中安裝相同名稱但版本不同的套件。

    apache-airflow[package-extra]==2.5.1
  5. Python 庫。在文件中添加軟requirements.txt件包名稱和版本(==)。這有助於防止將 future 自 PyPi.org 的重大更新被自動套用。

    library == version
    範例 肉毒桿菌毒素 3 和精神 2-二進制

    此範例是為了展示目的而提供。博托和 psycopg2 二進制庫包含在 Apache 氣流 v2 基本安裝中,不需要在文件中指定。requirements.txt

    boto3==1.17.54 boto==2.49.0 botocore==1.20.54 psycopg2-binary==2.8.6

    如果指定的套件沒有版本,Amazon MWAA 會從 PyPi.org 安裝最新版本的套件。此版本可能會與requirements.txt.

Apache Airflow v1
  1. 在本地測試。在建立檔案之前,以反覆方式新增其他程式庫,以尋找套件及其版本的正確組合。requirements.txt要運行 Amazon MWAA CLI 實用程序,請參閱(詳見) GitHub。aws-mwaa-local-runner

  2. 檢閱氣流套件附加功能查看可用於阿帕奇氣流 v1.10.12 的軟件包列表,在氣流/約束-3.7.txt。https://raw.githubusercontent.com/apache/

  3. 加入約束檔案。將 Apache 氣流 v1.10.12 的限制文件添加到文件的頂部。requirements.txt如果條件約束檔案判斷xyz==1.0套件與您環境中的其他套件不相容,pip3 install將無法防止不相容的程式庫安裝到您的環境中。

    --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-1.10.12/constraints-3.7.txt"
  4. 阿帕奇氣流 1.10.12 版軟件包。添加氣流包附加功能和阿帕奇氣流 v1.10.12 版本()。==這有助於防止在您的環境中安裝相同名稱但版本不同的套件。

    apache-airflow[package]==1.10.12
    範例 安全外殼 (SSH)

    下面的示例requirements.txt文件安裝SSH阿帕奇氣流 v1.10.12。

    apache-airflow[ssh]==1.10.12
  5. Python 庫。在文件中添加軟requirements.txt件包名稱和版本(==)。這有助於防止將 future 自 PyPi.org 的重大更新被自動套用。

    library == version
    範例 Boto3

    下面的示例requirements.txt文件安裝的博托 3 庫阿帕奇氣流 v1.10.12。

    boto3 == 1.17.4

    如果指定的套件沒有版本,Amazon MWAA 會從 PyPi.org 安裝最新版本的套件。此版本可能會與requirements.txt.

選項二:Python 輪(.whl)

Python 滾輪是一種包格式,旨在將庫與編譯的工件一起運送。輪子套件作為在 Amazon 中安裝相依性的方法有幾個好處MWAA:

  • 更快的安裝 — WHL 檔案會以單一的形式複製到容器中ZIP,然後在本機安裝,而無需下載每個檔案。

  • 減少衝突 — 您可以事先判斷套件的版本相容性。因此,不需要遞歸地計pip算出兼容的版本。

  • 彈性更高 — 使用外部託管的程式庫,下游需求可能會改變,導致 Amazon MWAA 環境上容器之間的版本不相容。由於不依賴於依賴關係的外部源,無論每個容器何時實例化,每個容器都具有相同的庫。

我們建議您使用以下方法來安裝 Python 的依賴關係從 Python 輪子存檔(.whl)在您的requirements.txt.

使用 Amazon S3 存儲桶上的plugins.zip文件

Apache 氣流排程器、工作者和網頁伺服器 (適用於 Apache Airflow v2.2.2 及更新版本) 會在您 AWS環境的受管理 Fargate 容器上啟動期間尋找自訂外掛程式。/usr/local/airflow/plugins/*這個過程在 Amazon MWAA 的 pip3 install -r requirements.txt Python 依賴關係和 Apache 氣流服務啟動之前開始。plugins.zip檔案可用於您不希望在環境執行期間持續變更的任何檔案,或是您可能不想將存取權授與寫入的使用者DAGs。例如,Python 庫輪盤文件,證書PEM文件和配置YAML文件。

下節說明如何在 Amazon S3 儲存貯體上安裝plugins.zip檔案中的輪子。

  1. 下載必要的WHL檔案您可以在 Amazon MWAA 本機執行器或其他 Amazon Linux 2 容器requirements.txt上使用pip download現有檔案,以解決並下載必要的 Python wheel 檔案。

    $ pip3 download -r "$AIRFLOW_HOME/dags/requirements.txt" -d "$AIRFLOW_HOME/plugins" $ cd "$AIRFLOW_HOME/plugins" $ zip "$AIRFLOW_HOME/plugins.zip" *
  2. 在中指定路徑requirements.txt。使用指定 requirements.txt 頂部的插件目錄,--find-links並指示pip不要使用從其他來源安裝 --no-index,如下所示

    --find-links /usr/local/airflow/plugins --no-index
    範例 在 requirements.txt 中的車輪

    下列範例假設您已將輪子上傳到 Amazon S3 儲存貯體根目錄的plugins.zip檔案中。例如:

    --find-links /usr/local/airflow/plugins --no-index numpy

    Amazon 從plugins文件夾中MWAA取出numpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whl輪子並將其安裝在您的環境中。

使WHL用託管在 URL

以下部分描述如何安裝託管在URL. URL必須可公開存取,或從您為 Amazon VPC MWAA 環境指定的自訂 Amazon 中存取。

  • 提供一個 URL. 提供一URL個輪子在你的requirements.txt.

    範例 在公共車輪檔案 URL

    下列範例會從公用網站下載操控盤。

    --find-links https://files.pythonhosted.org/packages/ --no-index

    Amazon 從URL您指定的中MWAA獲取輪子並將其安裝在您的環境中。

    注意

    URLs無法從 Amazon MWAA v2.2.2 及更新版本的私有網頁伺服器安裝需求存取。

從創建WHL文件 DAG

如果您擁有使用 Apache Airflow v2.2.2 或更新版本的私有網頁伺服器,且因為您的環境無法存取外部儲存庫而無法安裝需求,則可以使用以下指令取得現有的 Amazon MWAA 要求,並DAG將它們封裝在 Amazon S3 上:

from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow.utils.dates import days_ago S3_BUCKET = 'my-s3-bucket' S3_KEY = 'backup/plugins_whl.zip' with DAG(dag_id="create_whl_file", schedule_interval=None, catchup=False, start_date=days_ago(1)) as dag: cli_command = BashOperator( task_id="bash_command", bash_command=f"mkdir /tmp/whls;pip3 download -r /usr/local/airflow/requirements/requirements.txt -d /tmp/whls;zip -j /tmp/plugins.zip /tmp/whls/*;aws s3 cp /tmp/plugins.zip s3://{S3_BUCKET}/{S3_KEY}" )

執行之後DAG,請使用這個新檔案做為您的 Amazon MWAAplugins.zip,選擇性地與其他外掛程式一起封裝。然後,更新您requirements.txt之前的--find-links /usr/local/airflow/plugins--no-index不添加--constraint

此方法可讓您離線使用相同的程式庫。

選項三:託管在私有 PyPi/PEP-503 兼容存儲庫上的 Python 依賴關係

以下部分描述如何安裝 Apache 氣流額外託管在URL具有身份驗證的私有。

  1. 將您的使用者名稱和密碼新增為 Apache 氣流組態選項。例如:

    • foo.user : YOUR_USER_NAME

    • foo.pass : YOUR_PASSWORD

  2. 建立您的requirements.txt檔案。將下列範例中的預留位置替換為您的私人URL,以及您新增為 Apache Airflow 組態選項的使用者名稱和密碼。例如:

    --index-url https://${AIRFLOW__FOO__USER}:${AIRFLOW__FOO__PASS}@my.privatepypi.com
  3. 將任何其他程式庫新增至您的requirements.txt檔案。例如:

    --index-url https://${AIRFLOW__FOO__USER}:${AIRFLOW__FOO__PASS}@my.privatepypi.com my-private-package==1.2.3

在 Amazon MWAA 主控台上啟用日誌

Amazon MWAA 環境的執行角色需要許可才能將日誌傳送到 CloudWatch 日誌。若要更新執行角色的權限,請參閱Amazon MWAA 執行角色

您可以在INFOWARNINGCRITICAL層級啟用 Apache 氣流記錄。ERROR當您選擇日誌級別時,Amazon MWAA 會傳送該級別和所有更高嚴重性級別的日誌。例如,如果您在INFO層級啟用日誌,Amazon MWAA 會將INFO日誌WARNINGERROR、和CRITICAL日誌級別傳送到 CloudWatch 日誌。我們建議您在INFO層級啟用 Apache Airflow 記錄,讓排程器檢視為requirements.txt.

此影像顯示如何在INFO層級啟用記錄檔。

在記錄主控台上檢視 CloudWatch 記錄檔

您可以檢視排程排程工作流程和剖析dags資料夾的 Apache Airflow 記錄。下列步驟說明如何在 Amazon MWAA 主控台上開啟排程器的日誌群組,以及如何在日誌主控台上檢視 Apache Airflow CloudWatch 日誌。

若要檢視 requirements.txt
  1. 在 Amazon MWAA 控制台上打開「環境」頁面

  2. 選擇一個環境。

  3. 在 [監視] 窗格中選擇 Airflow 排程器記錄群組

  4. 在「requirements_install_ip記錄資料流」中選擇記錄檔

  5. 您應該會看到已安裝在環境中的套件清單,位於/usr/local/airflow/.local/bin。例如:

    Collecting appdirs==1.4.4 (from -r /usr/local/airflow/.local/bin (line 1)) Downloading https://files.pythonhosted.org/packages/3b/00/2344469e2084fb28kjdsfiuyweb47389789vxbmnbjhsdgf5463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl Collecting astroid==2.4.2 (from -r /usr/local/airflow/.local/bin (line 2))
  6. 檢閱套件清單,以及這些套件是否在安裝過程中遇到錯誤。如果發生錯誤,您可能會看到類似下列內容的錯誤:

    2021-03-05T14:34:42.731-07:00 No matching distribution found for LibraryName==1.0.0 (from -r /usr/local/airflow/.local/bin (line 4)) No matching distribution found for LibraryName==1.0.0 (from -r /usr/local/airflow/.local/bin (line 4))

檢視 Apache 氣流使用者介面中的錯誤

您也可以檢查 Apache 氣流使用者介面,以識別錯誤是否可能與其他問題有關。在 Amazon 上,您可能會遇到的 Apache 氣流的最常見錯誤MWAA是:

Broken DAG: No module named x

如果您在 Apache Airflow 使用者介面中看到此錯誤,表示您可能會遺漏requirements.txt檔案中必要的相依性。

登錄到阿帕奇氣流

您需要 AWS Identity and Access Management (IAM) 中的 AWS 帳戶阿帕奇氣流 UI 訪問策略:A mazonMWAAWeb ServerAccess權限才能檢視您的 Apache 氣流使用者介面。

存取您的 Apache 氣流使用者介面
  1. 在 Amazon MWAA 控制台上打開「環境」頁面

  2. 選擇一個環境。

  3. 選擇「開啟氣流 UI」。

範例requirements.txt案例

您可以混合和匹配不同的格式在你的requirements.txt. 下列範例使用不同方式的組合來安裝額外功能。

範例 PyPi.org 和公眾上的額外內容 URL

除了公URL共軟件包(例如自定義 PEP 503 兼容存儲庫)之外,您還需要在從 PyPi .org 指定軟件包時使用該--index-url選項URLs。

aws-batch == 0.6 phoenix-letter >= 0.3 --index-url http://dist.repoze.org/zope2/2.10/simple zopelib