
本文详细阐述了如何在Apache Airflow中实现基于特定日期条件的DAG任务条件化执行。通过利用PythonSensor,结合自定义的Python函数来判断例如“是否为月末最后一个周二”等复杂日期逻辑,我们能够精确控制DAG的启动。教程提供了完整的代码示例,展示了如何构建一个PythonSensor来检查条件,并在条件不满足时阻止下游任务运行,从而确保DAG仅在符合业务规则时才被触发。
在数据管道和自动化工作流管理中,Apache Airflow因其强大的调度和编排能力而广受欢迎。然而,许多业务场景要求DAG(有向无环图)中的任务并非每次都运行,而是需要满足特定的条件。例如,某些报告任务可能只在每月的特定一天(如月末最后一个周二)执行。本文将深入探讨如何利用Airflow的PythonSensor来实现这种复杂的条件化执行逻辑,从而在任务实际运行前进行预检查。
Airflow提供了多种实现条件化执行的机制:
对于“如果条件满足则运行所有任务,否则不运行任何任务”的需求,传感器是更直接且推荐的解决方案。特别是当条件涉及复杂的自定义逻辑时,PythonSensor提供了最大的灵活性。
PythonSensor是Airflow中一个非常强大的传感器,它允许用户定义一个Python可调用对象(函数),该对象会周期性地被执行。只要这个可调用对象返回False,传感器就会继续等待(“poke”)。一旦返回True,传感器任务即成功完成,并触发其所有下游任务。
PythonSensor的关键参数包括:
我们的目标是创建一个检查,判断当前的Airflow执行日期(execution_date)是否是当月的最后一个周二。
堆友
Alibaba Design打造的设计师全成长周期服务平台,旨在成为设计师的好朋友
759
查看详情
首先,我们需要一个Python函数来执行这个日期逻辑。这个函数将接收Airflow的context字典作为参数,从中获取execution_date。
from datetime import datetime, timedelta
import calendar
def is_last_tuesday_of_month(**context):
"""
检查Airflow的execution_date是否是当前月份的最后一个周二。
"""
execution_date = context["execution_date"]
current_year = execution_date.year
current_month = execution_date.month
# 获取当前月份的总天数
# calendar.monthrange(year, month) 返回 (该月第一天的星期几, 该月总天数)
_, num_days_in_month = calendar.monthrange(current_year, current_month)
# 构建当前月份的最后一天
last_day_of_month = datetime(current_year, current_month, num_days_in_month).date()
# 从月末最后一天开始往前推,直到找到第一个周二
days_to_subtract = 0
while (last_day_of_month - timedelta(days=days_to_subtract)).weekday() != calendar.TUESDAY:
days_to_subtract += 1
# 安全检查,防止无限循环(虽然通常不会发生,因为每个月至少有一个周二)
if days_to_subtract > 7:
print(f"Error: Could not find Tuesday in {current_year}-{current_month}")
return False
last_tuesday_date = last_day_of_month - timedelta(days=days_to_subtract)
print(f"Execution Date: {execution_date.date()}")
print(f"Last Tuesday of {current_year}-{current_month}: {last_tuesday_date}")
# 比较执行日期与计算出的月末最后一个周二
return execution_date.date() == last_tuesday_date函数说明:
现在,我们将这个检查函数集成到Airflow DAG中。
from airflow import DAG
from airflow.sensors.python import PythonSensor
from airflow.operators.bash import BashOperator
from datetime import datetime, timedelta
import calendar
# 定义上述的 is_last_tuesday_of_month 函数
def is_last_tuesday_of_month(**context):
"""
检查Airflow的execution_date是否是当前月份的最后一个周二。
"""
execution_date = context["execution_date"]
current_year = execution_date.year
current_month = execution_date.month
_, num_days_in_month = calendar.monthrange(current_year, current_month)
last_day_of_month = datetime(current_year, current_month, num_days_in_month).date()
days_to_subtract = 0
while (last_day_of_month - timedelta(days=days_to_subtract)).weekday() != calendar.TUESDAY:
days_to_subtract += 1
if days_to_subtract > 7:
print(f"Error: Could not find Tuesday in {current_year}-{current_month}")
return False
last_tuesday_date = last_day_of_month - timedelta(days=days_to_subtract)
print(f"Checking date: {execution_date.date()}")
print(f"Calculated last Tuesday: {last_tuesday_date}")
return execution_date.date() == last_tuesday_date
with DAG(
dag_id='conditional_last_tuesday_dag',
start_date=datetime(2025, 1, 1),
schedule_interval='@daily', # 每天运行,但只有在条件满足时才执行下游任务
catchup=False,
tags=['example', 'sensor', 'conditional'],
) as dag:
# 传感器任务:检查是否是月末最后一个周二
check_last_tuesday = PythonSensor(
task_id='check_if_last_tuesday',
python_callable=is_last_tuesday_of_month,
poke_interval=60 * 5, # 每5分钟检查一次 (在实际生产中,对于日期检查可以设置更长的间隔或一次性检查)
timeout=60 * 60 * 24, # 最长等待24小时
soft_fail=True, # 如果条件不满足,任务标记为skipped,下游任务也skipped
mode='poke', # 默认模式,周期性执行callable
)
# 原始任务T1到T5,现在它们将依赖于传感器的成功
T1 = BashOperator(
task_id='delete_gcs_files',
bash_command='echo "Deleting all files from GCS..." && sleep 5',
)
T2 = BashOperator(
task_id='run_sql_query_1',
bash_command='echo "Running SQL query 1 and outputting to BigQuery..." && sleep 5',
)
T3 = BashOperator(
task_id='run_sql_query_2',
bash_command='echo "Running SQL query 2 and outputting to BigQuery..." && sleep 5',
)
T4 = BashOperator(
task_id='run_sql_query_3',
bash_command='echo "Running SQL query 3 and placing CSV in GCS..." && sleep 5',
)
T5 = BashOperator(
task_id='copy_append_history',
bash_command='echo "Copying and appending reference numbers to history table..." && sleep 5',
)
# 定义任务依赖关系
# 只有当check_last_tuesday传感器成功时,T1及后续任务才会运行
check_last_tuesday >> T1 >> T2 >> T3 >> T4 >> T5DAG结构解释:
通过巧妙地结合PythonSensor和自定义的Python日期检查函数,我们能够为Airflow DAG引入强大的条件化执行能力。这种方法不仅实现了“月末最后一个周二”这样的复杂日期逻辑,而且通过soft_fail=True参数,优雅地处理了条件不满足时停止下游任务的需求,避免了不必要的资源消耗和任务执行。掌握这种模式,将大大提升Airflow DAG的智能性和适应性,使其更好地服务于多样化的业务场景。
以上就是Airflow DAG条件化执行:利用PythonSensor实现特定日期检查的详细内容,更多请关注其它相关文章!
# apache
# python
# 中文网
# 会在
# 才会
# 浮点
# 自定义
# 不满足
# 月末
# python函数
# ai
# csv
# app
# 作品推广营销思路
# 衡水网络营销推广
# 众筹网站推广品牌
# 怀来网站建设项目推广
# 临县网站推广哪家好
# 常熟推广网站建设哪家好
# 品牌推广和营销的关系是
# 昆山网站建设硬件配置
# 网站关键词优化怎么设置
# 营口企业网站推广
# 是一个
# 时才
# 几种
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
Teambition网盘如何共享文件
《画加》约稿流程
英雄联盟争者留名活动介绍
AO3中文入口稳定分享_AO3官网HTTPS看文详解
网页版网易云音乐入口_网易云音乐在线官网登录
如何在CSS中实现盒模型多列间距_grid-gap与padding结合
Lar*el Eloquent中通过Join查询关联数据表:解决多行子查询问题
Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制
C++ bind函数使用教程_C++参数绑定与函数适配器的应用
ToDesk远程摄像头功能使用方法_ToDesk远程视频画面查看设置教程
win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】
Python中处理嵌套字典与列表的数据提取与过滤教程
极兔快递官网查询入口手机版 手机极兔快递登录查询入口官方
Python高效统计字典嵌套列表值在目标列表中的出现次数
《伊瑟》凶影追缉库卢鲁boss攻略
Eclipse开发J*a快速入门
德邦快递收费标准详解
教资成绩怎么查询
《蓝色星原:旅谣》坐骑获取攻略
word怎么将图片设置为页面背景并不影响打印_Word图片背景设置方法
AI图层蒙版怎么用_AI图层蒙版应用技巧与设计实例
抖音作品被限流怎么办 抖音内容优化与流量恢复方法
基于键值条件高效映射 Pandas DataFrame 多列数据
实现可重用自定义Python Range类
顺丰快递收费标准查询_如何查看顺丰最新收费价格
Yandex世界探索 最新官方免登录入口全知道
《撕歌》会员开通方法
sublime如何撤销关闭的标签页_sublime重新打开已关闭文件技巧
重返未来:1999卡戎全方位攻略
PHP实现等比数列:构建数组元素基于前一个值递增的方法
《荔枝fm》导出文件教程
163邮箱登录入口官网 163.com邮箱登录入口
我的世界游戏平台入口 我的世界官方官网直达链接
漫蛙漫画官方版直通入口 2025漫蛙漫画免注册访问说明
在PHP环境中正确加载HTML资源:CSS样式与图片路径指南
Win11怎么录屏_Windows 11自带Xbox Game Bar录制视频
谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录
PHP与SQL实践:高效实现数据复制与特定列值修改
在XML中嵌入二进制数据(如图片)的最佳实践是什么? Base64编码与解析注意事项
C#解析并修改XML后保存 如何确保格式与编码的正确性
TikTok网页版入口快速访问 TikTok官网账号登录方法
视频号视频怎么免费保存到相册?保存到相册需要注意什么?
如何修改Windows截图的默认保存位置_告别C盘让桌面更整洁【教程】
J*aScript实现下拉菜单驱动的动态表格数据展示
在PySimpleGUI中实现键盘按键绑定按钮事件
如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?
Go语言中方法与接收器:指针和值类型的调用机制详解
edge浏览器怎么修改语言为中文_Edge界面语言切换教程
《edge浏览器》关闭翻译功能方法
深入理解J*aScript异步操作:setTimeout与调用栈的真相
2025-12-07
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。