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

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

在 requirements.txt 中 Python 理依賴關係

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

使用 Amazon MWAA CLI 公用程式測試 DAG

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

  • CLI 會在本機建置 Docker 容器映像,類似於 Amazon MWAA 生產映像。這可讓您執行本機 Apache 氣流環境來開發和測試 DAG、自訂外掛程式和相依性,然後再部署到 Amazon MWAA。

  • 若要執行 CLI,請參閱上的 aws-m waa 本機執行程式。 GitHub

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

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

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

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

Apache Airflow v2
  1. 在本地測試。在建立檔案之前,以反覆方式新增其他程式庫,以尋找套件及其版本的正確組合。requirements.txt若要執行 Amazon MVAA CLI 公用程式,請參閱上的 aw s-mwaa 本機執行程式。 GitHub

  2. 檢閱 Apache 氣流套件附加功能。若要檢視 Amazon MWAA 上為 Apache 氣流 v2 安裝的套件清單,請參閱網站上的 Amazon MWAA 本地運requirements.txt行器。 GitHub

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

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

    在下面的例子中,將 {環境版本} 替換為您環境的版本號,並將 {Python 版本} 替換為與您的環境兼容的 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 MVAA CLI 公用程式,請參閱上的 aw s-mwaa 本機執行程式。 GitHub

  2. 檢閱氣流套件附加功能檢閱可用於阿帕奇氣流 v1.10.12 的套件清單,網址為 https://raw.githubusercontent.com/apache/airflow/constraints-1.10.12/constraints-3.7.txt。

  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檔案可用於您不希望在環境執行期間持續變更的任何檔案,或是您可能不想要授與寫入 DAG 的使用者存取權。例如,Python 庫輪盤文件,證書 PEM 文件和配置 YAML 文件。

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

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

    $ 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 MWAA 會從plugins資料夾中取出numpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whl滾輪,並將其安裝在您的環境中。

使用託管在網址上的 WHL 文件

以下部分說明如何安裝裝載在 URL 上的操控盤。該 URL 必須可公開存取,或可從您為 Amazon MWAA 環境指定的自訂 Amazon VPC 中存取。

  • 提供網址。將 URL 提供給您的requirements.txt.

    範例 公共 URL 上的車輪歸檔

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

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

    Amazon MWAA 會從您指定的 URL 擷取滾輪,然後將它們安裝在您的環境中。

    注意

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

從 DAG 建立 WHL 檔案

如果您擁有使用 Apache Airflow v2.2.2 或更新版本的私有網頁伺服器,且因為您的環境無法存取外部儲存庫而無法安裝需求,則可以使用下列 DAG 取得您現有的 Amazon MWAA 要求,並將它們封裝在 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 會將日誌WARNINGERROR、和INFO日誌層級傳送到 CloudWatch 日CRITICAL誌。我們建議您在INFO層級啟用 Apache Airflow 記錄檔,以便排程器檢視接收的requirements.txt.

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

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

您可以檢視排程排程工作流程和剖析dags資料夾的 Apache Airflow 記錄。下列步驟說明如何在 Amazon MWAA 主控台上開啟排程器的日誌群組,以及如何在日誌主控台上檢視 Apache 氣流 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 MWAA 上,您可能會遇到的阿帕奇氣流的最常見錯誤是:

Broken DAG: No module named x

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

登錄到阿帕奇氣流

您需要 AWS Identity and Access Management (IAM) 中的 AWS 帳戶阿帕奇氣流 UI 訪問政策:亞馬遜WebServer訪問許可,才能檢視您的 Apache 氣流使用者介面。

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

  2. 選擇一個環境。

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

範例requirements.txt案例

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

範例 PyPi.org 和公共網址上的其他內容

除了公開 URL 上的套件之外,您還需要在指定 PyPi .org 的套件時使用此--index-url選項,例如自訂 PEP 503 相容的存放庫 URL。

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