[英]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.