Creating a basic DAG file in Apache Airflow - Performance & Efficiency
When we create a basic DAG file in Airflow, we want to know how the time it takes to run grows as we add more tasks.
We ask: How does adding more tasks affect the total work Airflow does?
Analyze the time complexity of the following code snippet.
from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime
default_args = {'start_date': datetime(2024, 1, 1)}
dag = DAG('basic_dag', default_args=default_args, schedule_interval='@daily')
task1 = BashOperator(task_id='task1', bash_command='echo Hello', dag=dag)
task2 = BashOperator(task_id='task2', bash_command='echo World', dag=dag)
task1 >> task2
This code creates a DAG with two tasks that run simple shell commands in order.
- Primary operation: Defining tasks and their dependencies in the DAG.
- How many times: Each task is defined once; no loops or recursion in this snippet.
As you add more tasks, the number of operations grows roughly in a straight line.
| Input Size (n tasks) | Approx. Operations |
|---|---|
| 10 | 10 task definitions |
| 100 | 100 task definitions |
| 1000 | 1000 task definitions |
Pattern observation: Adding tasks increases work evenly, one by one.
Time Complexity: O(n)
This means the time to create the DAG grows directly with the number of tasks.
[X] Wrong: "Adding more tasks will make the DAG creation time grow much faster, like squared or exponential."
[OK] Correct: Each task is defined once without nested loops, so the work grows evenly, not faster.
Understanding how task count affects DAG creation helps you design workflows that scale well and run smoothly.
"What if we added nested loops to create tasks dynamically? How would the time complexity change?"
Practice
Solution
Step 1: Understand what a DAG file represents
A DAG file in Airflow is a Python script that defines a Directed Acyclic Graph, which represents tasks and their dependencies.Step 2: Identify the role of the DAG file
The DAG file schedules and organizes tasks to automate workflows, not for logging, configuration, or package installation.Final Answer:
To define tasks and their schedule for workflow automation -> Option DQuick Check:
DAG file purpose = Define tasks and schedule [OK]
- Confusing DAG file with Airflow config files
- Thinking DAG files store logs
- Assuming DAG files install packages
Solution
Step 1: Recall the correct import syntax in Python
Python imports use 'from module import class' syntax for specific classes.Step 2: Match with Airflow's module structure
The recommended import used in official Airflow documentation is 'from airflow.models import DAG'.Final Answer:
from airflow.models import DAG -> Option CQuick Check:
Correct import syntax = from airflow.models import DAG [OK]
- Using incorrect import syntax
- Trying to import DAG directly from airflow
- Using invalid Python import statements
from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime
default_args = {'start_date': datetime(2024, 1, 1)}
with DAG('example_dag', default_args=default_args, schedule_interval='@daily') as dag:
task = BashOperator(task_id='print_date', bash_command='date')Solution
Step 1: Identify the task_id parameter in BashOperator
The BashOperator is created with task_id='print_date', which names the task.Step 2: Understand task_id usage
task_id is the unique identifier for the task in the DAG, so the task's id is 'print_date'.Final Answer:
print_date -> Option AQuick Check:
task_id value = print_date [OK]
- Confusing variable name with task_id
- Using DAG id as task_id
- Mistaking bash_command as task_id
from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime
with DAG('my_dag', start_date=datetime(2024, 1, 1), schedule_interval='@daily') as dag:
task1 = BashOperator(task_id='task1', bash_command='echo Hello')
task2 = BashOperator(task_id='task2', bash_command='echo World')
task1 >> task2
print('DAG created')Solution
Step 1: Check imports and DAG definition
Imports are correct, DAG is created with start_date and schedule_interval directly in constructor.Step 2: Verify task creation and dependencies
Tasks are created with valid task_ids and bash commands, and dependency is set with 'task1 >> task2'.Step 3: Confirm print statement usage
Print outside DAG context is allowed and does not affect DAG creation.Final Answer:
No error, DAG is correctly defined -> Option AQuick Check:
DAG syntax correct = No error [OK]
- Assuming default_args is mandatory
- Thinking print inside DAG causes error
- Confusing import paths for operators
Solution
Step 1: Determine the cron expression for Monday 7 AM
Cron '0 7 * * 1' runs every Monday at 7:00 AM (1=Monday).Step 2: Validate start_date
March 1, 2024 (Friday) is before the first Monday (March 4), so first run on March 4, 7 AM.Step 3: Eliminate other options
A: '@weekly'='0 0 * * 0' (Sunday midnight), wrong day/time. C: daily. D: Sunday (0).Final Answer:
schedule_interval='0 7 * * 1', start_date=datetime(2024, 3, 1) -> Option BQuick Check:
Monday 7AM cron = '0 7 * * 1' [OK]
- Setting start_date on wrong weekday
- Confusing cron day numbers (0=Sunday, 1=Monday)
- Using daily schedule for weekly task
Ready to prove it?
Pass the test and this pattern moves unknown
