簡體   English   中英

Airflow DAG 調度程序循環在 Azure 數據工廠上產生高成本

[英]Airflow DAG scheduler loop generating high costs on Azure Data Factory

我們的 Airflow DAG 在 ADF 上產生了非常高的成本。

Airflow 調度程序不斷循環檢查 DAG 是否已更改。 在此日志中,我們找到了 ADF 管道列表。 每次檢查 DAG 的更改(> 每分鍾 3 次)時,都會查詢 ADF 管道列表。

以下是全天重復的日志項:

[2021-05-10 00:00:06,032] {{logging_mixin.py:112}} INFO - [2021-05-10 00:00:06,031] {{settings.py:253}} INFO - settings.configure_orm(): Using pool settings. pool_size=5, max_overflow=10, pool_recycle=1800, pid=29572
[2021-05-10 00:00:06,035] {{scheduler_job.py:153}} INFO - Started process (PID=29572) to work on /usr/local/airflow/dags/ingestSource.py
[2021-05-10 00:00:06,038] {{scheduler_job.py:1560}} INFO - Processing file /usr/local/airflow/dags/ingestSource.py for tasks to queue
[2021-05-10 00:00:06,038] {{logging_mixin.py:112}} INFO - [2021-05-10 00:00:06,038] {{dagbag.py:403}} INFO - Filling up the DagBag from /usr/local/airflow/dags/ingestSource.py
[2021-05-10 00:00:07,395] {{logging_mixin.py:112}} INFO - Existing data factory pipelines: ['Load Facts', 'Refresh Report', 'Post Staging Logic', 'Load Dimensions', 'etc..']
[2021-05-10 00:00:08,000] {{scheduler_job.py:161}} INFO - Processing /usr/local/airflow/dags/ingestSource.py took 1.965 seconds

這部分 DAG 似乎觸發了 ADF 上的查詢:

azure_data_factory_hook = AzureDataFactoryHook(
    subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"],
    resource_group_name=os.environ["AZURE_RESOURCE_GROUP_NAME"],
    factory_name=os.environ["AZURE_DATA_FACTORY_NAME"],
    credentials=MSIAuthentication() 
)

我真的很想知道為什么會觸發對 ADF 的查詢,以及如何防止這種情況在一整天的循環中發生。

謝謝你的幫助

完整的 DAG:

import json
import os
from datetime import datetime, timedelta
from typing import Dict, List

from airflow import DAG
from airflow.hooks.azure_data_factory_plugin import AzureDataFactoryHook
from airflow.operators.azure_data_factory_plugin import AdfPipelineRunOperator
from msrestazure.azure_active_directory import MSIAuthentication

DEFAULT_ARGS = {
    'owner': 'Me',
    'depends_on_past': False,
    'execution_timeout': timedelta(hours=6)
}

dag = DAG(dag_id="IngestSource",
          start_date=datetime(2020, 5, 29),
          default_args=DEFAULT_ARGS,
          max_active_runs=5,
          schedule_interval='0 1 * * *')

azure_data_factory_hook = AzureDataFactoryHook(
    subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"],
    resource_group_name=os.environ["AZURE_RESOURCE_GROUP_NAME"],
    factory_name=os.environ["AZURE_DATA_FACTORY_NAME"],
    credentials=MSIAuthentication() 
)

common_task_params = {
    "dag": dag,
    "azureDataFactoryHook": azure_data_factory_hook,
    "execution_timeout": timedelta(hours=2),
}

ingest_source = AdfPipelineRunOperator(
    **common_task_params,
    task_id="ingestSource",
    pipeline_name="From Source to Target",
    pipeline_parameters=json.dumps()
)

大概 Hook 中有一些東西可以檢索現有的 ADF 管道以寫出日志。 此 Hook 被認為是頂級代碼(任何 function、邏輯等,在 Operator 的execute()方法之外),並且被認為是在 DAG 文件中避免使用的最佳實踐。 頂級代碼在調度程序的每個文件解析間隔上執行 - 因此您注意到頻繁查詢。 您應該嘗試將 Hook 移動到execute()方法的 scope 中的自定義 Operator 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM