当前位置: 首页 > article >正文

Apache Airflow 系列教程 | 第28课:Backfill 与数据回填策略

导读(Introduction)欢迎来到 Apache Airflow 源码深度解析系列的第二十八课。在数据工程的日常工作中,“回填”(Backfill)是一个高频操作。当你修复了一个数据转换逻辑的 bug、新增了一个数据列的计算、或者需要重新处理因上游系统故障导致的历史缺失数据时,你需要让 DAG 针对过去的时间区间重新执行——这就是 Backfill。与普通的定时调度不同,Backfill 涉及一系列独特的工程挑战:如何避免重复处理已成功的数据?如何控制回填的并发度以免压垮下游系统?如何处理依赖过去执行结果(depends_on_past)的任务?如何在多调度器环境下安全地并行回填?Airflow 3.x 引入了全新设计的 Backfill 模型——一个独立的数据库实体,通过BackfillDagRun关联表将回填操作与 DAG Run 解耦,支持暂停/恢复/取消等生命周期管理,并通过 REST API 和 CLI 提供完整的操作界面。本课将深入分析 Backfill 的数据模型、创建流程、调度集成和最佳实践,帮助你掌握安全高效的大规模数据回填方案。学习目标(Learning Objectives)完成本课学习后,你将能够:理解 Backfill 的概念与应用场景——明确回填在数据工程中解决的核心问题掌握 Backfill 数据模型——理解Backfill、BackfillDagRun的字段设计和关联关系理解 Backfill 与 DagRun 的关系——分析backfill_id如何关联到正常调度流程区分 catchup 与按需回填——理解两种历史数据补充方式的区别与适用场景掌握 ReprocessBehavior 策略——理解 NONE/FAILED/COMPLETED 三种重处理行为分析回填的安全保障机制——depends_on_past验证、未来日期检测、并发回填互斥使用 CLI 和 REST API 管理回填——掌握创建、暂停、取消回填的操作接口设计大规模回填方案——掌握并发控制、分区回填、错误处理等最佳实践正文内容(Main Content)1. Backfill 的概念与应用场景1.1 什么是 BackfillBackfill(回填)是指让一个 DAG 针对过去的时间区间执行,补充历史数据处理。在 Airflow 的调度模型中,每个 DAG Run 对应一个特定的数据区间(data_interval),回填就是为那些"本应执行但未执行"或"需要重新执行"的数据区间创建 DAG Run。时间线: ──────────────────────────────────────────────→ 现在 │ 2024-01-01 │ 2024-01-02 │ 2024-01-03 │ ... │ 2024-06-15 │ 正常调度:只创建当前时间点对应的 DAG Run Backfill:为 2024-01-01 到 2024-03-31 的每一天创建 DAG Run1.2 典型应用场景场景描述回填策略Bug 修复修复了数据转换逻辑,需要重算历史数据全量回填(COMPLETED)新增字段添加了新的计算列,需要填充历史值全量回填(COMPLETED)数据恢复上游系统故障导致某些天数据缺失失败重跑(FAILED)新 DAG 上线新建 DAG 需要处理从 start_date 至今的所有数据增量回填(NONE)Schema 变更数据仓库表结构变化,需要重新加载全量回填(COMPLETED)1.3 Backfill 与正常调度的区别维度正常调度Backfill触发方式调度器自动创建用户手动触发DagRun 类型scheduledbackfill_job并发控制max_active_runs(DAG 级)max_active_runs(Backfill 级)时间方向仅向前可正序或反序生命周期管理无支持暂停/恢复/取消调度器参与创建 + 调度仅调度(创建由 Backfill 系统完成)2. Backfill 数据模型2.1 Backfill 主表Backfill模型是回填操作的核心实体,记录了一次回填的完整配置和状态:# airflow-core/src/airflow/models/backfill.pyclassBackfill(Base):"""Model representing a backfill job."""__tablename__="backfill"id:Mapped[int]=mapped_column(Integer,primary_key=True,autoincrement=True)dag_id:Mapped[str]=mapped_column(StringID(),nullable=False)from_date:Mapped[datetime]=mapped_column(UtcDateTime,nullable=False)to_date:Mapped[datetime]=mapped_column(UtcDateTime,nullable=False)dag_run_conf:Mapped[dict]=mapped_column(sa.JSON(),nullable=False,default={})is_paused:Mapped[bool|None]=mapped_column(Boolean,default=False,nullable=True)reprocess_behavior:Mapped[str]=mapped_column(StringID(),nullable=False,default=ReprocessBehavior.NONE)max_active_runs:Mapped[int]=mapped_column(Integer,default=10,nullable=False)created_at:Mapped[datetime]=mapped_column(UtcDateTime,default=timezone.utcnow)completed_at:Mapped[datetime|None]=mapped_column(UtcDateTime,nullable=True)updated_at:Mapped[datetime]=mapped_column(UtcDateTime,default=timezone.utcnow,onupdate=timezone.utcnow)triggering_user_name:Mapped[str|None]=mapped_column(String(512),nullable=True)字段设计解析:字段作用设计考量dag_id关联的 DAG一个 DAG 同时只允许一个活跃的 Backfillfrom_date/to_date回填时间范围定义需要处理的数据区间dag_run_confDAG Run 配置参数支持传递运行时参数is_paused暂停标志控制是否继续创建新的 DAG Runreprocess_behavior重处理策略控制遇到已有 Run 时的行为max_active_runs最大并发数独立于 DAG 级别的并发控制completed_at完成时间NULL 表示进行中,非 NULL 表示已完成triggering_user_name触发用户审计追踪2.2 BackfillDagRun 关联表BackfillDagRun是 Backfill 和 DagRun 之间的映射表,记录了回填中每个时间点的处理状态:classBackfillDagRun(Base):"""Mapping table between backfill run and Dag run."""__tablename__="backfill_dag_run"id:Mapped[int]=mapped_column(Integer,primary_key=True,autoincrement=True)backfill_id:Mapped[int]=mapped_column(Integer,nullable=False)dag_run_id:Mapped[int|None]=mapped_column(Integer,nullable=True)exception_reason:Mapped[str|None]=mapped_column(StringID(),nullable=True)logical_date:Mapped[datetime]=mapped_column(UtcDateTime,nullable=True)partition_key:Mapped[datetime]=mapped_column(StringID(),nullable=True)sort_ordinal:Mapped[int]=mapped_column(Integer,nullable=False)__table_args__=(UniqueConstraint("backfill_id","dag_run_id",name="ix_bdr_backfill_id_dag_run_id"),ForeignKeyConstraint([backfill_id],["backfill.id"],name="bdr_backfill_fkey",ondelete="cascade",),ForeignKeyConstraint([dag_run_id],["dag_run.id"],name="bdr_dag_run_fkey",ondelete="set null",),)@validates("sort_ordinal")defvalidate_sort_ordinal(self,key,val):ifval1:raiseValueError("sort_ordinal must be = 1")returnval关键设计要点:dag_run_id可为 NULL:当 DAG Run 无法创建时(如已存在同时间点的 Run),dag_run_id为 NULL,原因记录在exception_reason中ondelete="cascade":删除 Backfill 时自动清除所有关联记录ondelete="set null":删除 DagRun 时保留 BackfillDagRun 记录,仅置空dag_run_idsort_ordinal:记录执行顺序,支持正序和反序回填2.3 BackfillDagRunExceptionReason当某个时间点的 DAG Run 无法创建时,原因被记录为枚举值:classBackfillDagRunExceptionReason(str,Enum):IN_FLIGHT="in flight"# 该时间点的 Run 正在执行中ALREADY_EXISTS="already exists"# 已存在且不需要重处理UNKNOWN=

相关文章:

Apache Airflow 系列教程 | 第28课:Backfill 与数据回填策略

导读(Introduction) 欢迎来到 Apache Airflow 源码深度解析系列的第二十八课。 在数据工程的日常工作中,“回填”(Backfill)是一个高频操作。当你修复了一个数据转换逻辑的 bug、新增了一个数据列的计算、或者需要重新处理因上游系统故障导致的历史缺失数据时,你需要让…...

SAP供应商创建后,BP界面贸易伙伴字段不显示?手把手教你用FS_API_BP001_CHANGE补传数据

SAP供应商创建后BP界面贸易伙伴字段不显示的解决方案 在SAP系统中创建供应商时,经常会遇到一个令人困惑的问题:明明已经通过标准BAPI(如vmd_ei_api)将贸易伙伴信息成功写入数据库表LFA1的VBUND字段,但在业务伙伴(BP)界…...

门电路的电气特性详解

门电路的电气特性详解 深入理解门电路的电气参数,是设计可靠数字系统的必备知识。 🎯 本章学习要点 理解输入/输出电压阈值参数掌握扇入扇出的概念和计算了解传输延迟对电路的影响理解功耗来源及优化策略 1️⃣ 输入输出特性参数 1.1 电压阈值参数 &a…...

如何彻底解决Windows风扇控制难题:Fan Control完整指南

如何彻底解决Windows风扇控制难题:Fan Control完整指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...

手把手复现1G通话:用Python模拟FM调制、FSK信令与FDMA多用户通信

手把手复现1G通话:用Python模拟FM调制、FSK信令与FDMA多用户通信 在移动通信的演进史中,1G系统如同数字时代的罗塞塔石碑,用模拟信号承载了人类首次无线对话的自由。今天我们将穿越回1983年摩托罗拉DynaTAC 8000X面世的年代,用Py…...

高级技巧:利用SharpShooter实现COM Staging和应用程序白名单绕过

高级技巧:利用SharpShooter实现COM Staging和应用程序白名单绕过 【免费下载链接】SharpShooter Payload Generation Framework 项目地址: https://gitcode.com/gh_mirrors/sh/SharpShooter SharpShooter 是一款功能强大的Payload生成框架,专为安…...

告别激活烦恼:KMS_VL_ALL_AIO智能激活脚本的终极解决方案

告别激活烦恼:KMS_VL_ALL_AIO智能激活脚本的终极解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经为Windows系统激活而烦恼?或者为Office办公软件的激活…...

Gridfinity Rebuilt OpenSCAD优化技巧:节省材料、提升打印质量的7个方法

Gridfinity Rebuilt OpenSCAD优化技巧:节省材料、提升打印质量的7个方法 【免费下载链接】gridfinity-rebuilt-openscad A ground-up rebuild of the stock gridfinity bins in OpenSCAD 项目地址: https://gitcode.com/gh_mirrors/gr/gridfinity-rebuilt-opensca…...

如何轻松解密Widevine加密视频:完整免费指南

如何轻松解密Widevine加密视频:完整免费指南 【免费下载链接】video_decrypter Decrypt video from a streaming site with MPEG-DASH Widevine DRM encryption. 项目地址: https://gitcode.com/gh_mirrors/vi/video_decrypter 还在为付费视频无法离线保存而…...

如何3步解决网页数学公式复制到Word的世纪难题?

如何3步解决网页数学公式复制到Word的世纪难题? 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 你是否曾为了将维基百科、学术论文或…...

Verilog分频器进阶:从6分频到1.5分频的实战设计与波形分析

1. 分频器基础与设计思路 在数字电路设计中,时钟信号就像人的心跳一样重要。分频器的作用,就是把这个"心跳"调整到我们需要的节奏。简单来说,分频器就是把输入时钟的频率降低N倍,得到一个新的时钟信号。比如6分频&#…...

MTCNN级联网络设计精讲:从P-Net到O-Net,看作者如何用‘奇数特征图’和‘重叠池化’提升召回率

MTCNN级联网络架构解密:奇数特征图与重叠池化的工程智慧 人脸检测领域的技术演进始终围绕着两个核心命题:如何在有限计算资源下实现实时检测,以及如何在小目标场景中保持高召回率。2016年问世的MTCNN(Multi-task Cascaded Convol…...

vue3-vant-mobile项目部署指南:Netlify零配置发布终极教程

vue3-vant-mobile项目部署指南:Netlify零配置发布终极教程 【免费下载链接】vue3-vant-mobile An mobile web apps template based on the Vue 3 ecosystem。一个基于 Vue 3 生态系统的移动 web 应用模板,帮助你快速完成业务开发。 项目地址: https://…...

对比 Codex 和 Claude Code

要在使用千问或 DeepSeek 等国产模型的前提下,对比 Codex 和 Claude Code,这已经不是一个简单的“二选一”问题,而是一个关于聪明“组合”的选题。虽然它们的设计理念差别很大,但在国产大模型强大的适配能力和高性价比面前&#x…...

告别杂乱地图标注!Arcgis中标注位置与多边形中心点提取的‘黄金搭档’技巧

告别杂乱地图标注!Arcgis中标注位置与多边形中心点提取的‘黄金搭档’技巧 当你在制作行政区划图或设施分布图时,是否曾被密密麻麻的标注搞得焦头烂额?标注重叠、位置不当、中心点偏移——这些问题不仅影响地图美观,更会降低信息的…...

从零开始:sherpa-onnx跨平台语音识别终极指南

从零开始:sherpa-onnx跨平台语音识别终极指南 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support…...

小白程序员也能抓住的AI高薪机遇:大模型时代的机会与挑战

某书成立AI一级部门,预示着AI成为大厂核心战略。AI已从噱头渗透到工作和生活中,带来高薪机遇。AI大模型应用开发工程师年薪可达70万,薪资高源于需求大、供给少。无论技术岗还是非技术岗,AI都将创造更多机会。普通人应主动学习AI工…...

CANN/asc-devkit bfloat16转half API

__bfloat162half_ru 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://git…...

MySQL 基础:SELECT、WHERE、JOIN 的第一次使用

不用怕数据库,跟着这三个单词,你就能查到你想要的一切。欢迎来到 《大一突围》 专栏。很多大一同学第一次接触 MySQL,看到“数据库”三个字就觉得很难。其实,你日常生活中每天都在“查数据”——查成绩、翻通讯录、筛选淘宝商品……...

HEIF Utility:Windows平台HEIF格式兼容性完整解决方案实战

HEIF Utility:Windows平台HEIF格式兼容性完整解决方案实战 【免费下载链接】HEIF-Utility HEIF Utility - View/Convert Apple HEIF images on Windows. 项目地址: https://gitcode.com/gh_mirrors/he/HEIF-Utility 对于使用iPhone或iPad的Windows用户而言&a…...

Notero:终极Zotero与Notion同步插件,简单快速实现文献管理一体化

Notero:终极Zotero与Notion同步插件,简单快速实现文献管理一体化 【免费下载链接】notero A Zotero plugin for syncing items and notes into Notion 项目地址: https://gitcode.com/gh_mirrors/no/notero 你是否正在为文献管理与笔记整理之间的…...

别再死记硬背了!用这三个等效模型,轻松搞定二极管电路分析(附典型例题)

二极管电路分析的三大等效模型实战指南 在电子工程和嵌入式开发领域,二极管作为基础元件却常常成为初学者的"拦路虎"。面对复杂的二极管电路,很多人陷入死记硬背的困境——记住各种电路的输出结果,却无法理解背后的分析逻辑。这种学…...

Pixelle-Video深度解析:AI全自动短视频引擎,一句话生成专业级短视频

https://github.com/AIDC-AI/Pixelle-Videohttps://github.com/AIDC-AI/Pixelle-Video 引言 刷到一条短视频,画面精美、配乐到位、解说流畅——你以为这至少得花两小时剪出来?其实可能只花了一句话的时间。今天我们要深入介绍的,就是GitHub…...

5分钟解锁浏览器Markdown阅读新体验:告别文档查看烦恼

5分钟解锁浏览器Markdown阅读新体验:告别文档查看烦恼 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 你是否经常需要查看技术文档、API说明或学习笔记,却…...

从无人机到平衡车:MPU6050姿态融合(互补滤波)的实战调参指南与避坑心得

从无人机到平衡车:MPU6050姿态融合实战调参与避坑指南 姿态解算在无人机飞控、平衡车和机器人系统中扮演着核心角色。MPU6050作为一款集成了三轴陀螺仪和三轴加速度计的惯性测量单元(IMU),其数据融合质量直接决定了系统稳定性。许多开发者虽然理解了互补…...

轻量级内存清理神器Mem Reduct:如何让旧电脑重获新生?[特殊字符]

轻量级内存清理神器Mem Reduct:如何让旧电脑重获新生?😊 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirr…...

从通信原理到Verilog:一个约束长度7的卷积码编码器是如何炼成的?

从通信原理到Verilog:一个约束长度7的卷积码编码器是如何炼成的? 在数字通信系统的设计中,纠错编码技术如同隐形的守护者,确保数据在嘈杂信道中可靠传输。卷积码因其优异的纠错性能和简洁的编码结构,成为卫星通信、深空…...

【Gemini赋能Google Maps路线优化实战指南】:20年导航算法专家亲授5大降本增效核心策略

更多请点击: https://intelliparadigm.com 第一章:Gemini赋能Google Maps路线优化的底层逻辑与演进脉络 Google Maps 路线规划正经历从传统图算法向多模态智能推理的范式迁移。Gemini 模型并非简单替代 Dijkstra 或 A*,而是作为实时决策中枢…...

Obsidian-Templates:卡片盒笔记法的终极模板库,构建你的第二大脑

Obsidian-Templates:卡片盒笔记法的终极模板库,构建你的第二大脑 【免费下载链接】Obsidian-Templates A repository containing templates and scripts for #Obsidian to support the #Zettelkasten method for note-taking. 项目地址: https://gitco…...

Wat完整使用教程:从基础语法到高级修饰符

Wat完整使用教程:从基础语法到高级修饰符 【免费下载链接】wat Deep inspection of Python objects 项目地址: https://gitcode.com/gh_mirrors/wat2/wat Wat是一款强大的Python对象深度检查工具,能帮助开发者快速获取任何Python对象的详细信息&a…...