<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>调度 on 老张开工了</title>
    <link>/%E8%B0%83%E5%BA%A6/</link>
    <description>Recent content in 调度 on 老张开工了</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 27 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="/%E8%B0%83%E5%BA%A6/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>工作流编排：Apache Airflow</title>
      <link>/posts/2026/04/etl-airflow/</link>
      <pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate>
      <guid>/posts/2026/04/etl-airflow/</guid>
      <description>为什么需要工作流编排？ 上一章我们介绍了 Airbyte 和 dbt，它们各自负责 ETL 的不同环节。但一个完整的生产环境数据管道包含多个步骤：Airbyte 同步、dbt 运行、数据质量检查、异常告警、失败重试。这些步骤需要按特定顺序执行，并且要每天自动运行。这就是工作流编排工具的职责。&#xA;没有编排工具时，你可能用 cron 脚本把一堆命令串起来：&#xA;# cron 方案，很脆弱 0 2 * * * /usr/bin/airbyte sync-orders &amp;amp;&amp;amp; /usr/bin/dbt run &amp;amp;&amp;amp; /usr/bin/python check_quality.py [/code] 这种方案的问题很明显：没有任务依赖管理，失败无法自动重试，没有可视化的执行状态，难以扩展。当你有几十个数据管道时，cron 脚本很快就会变成一团乱麻。 Apache Airflow 就是为了解决这些问题而生的。 ## Apache Airflow 核心概念 ### DAG（有向无环图） DAG 是 Airflow 中最核心的概念。一个 DAG 定义了一个完整的工作流，包含所有任务以及它们之间的依赖关系。&amp;#34;有向无环&amp;#34;意味着任务之间有方向性的依赖，且不能形成循环依赖。 一个最简单的 DAG from airflow import DAG from airflow.operators.python import PythonOperator from datetime import datetime&#xA;def extract(): print(&amp;ldquo;抽取数据&amp;hellip;&amp;rdquo;)&#xA;def transform(): print(&amp;ldquo;转换数据&amp;hellip;&amp;rdquo;)&#xA;def load(): print(&amp;ldquo;加载数据&amp;hellip;&amp;rdquo;)&#xA;with DAG( dag_id=&amp;ldquo;simple_etl&amp;rdquo;, start_date=datetime(2026, 1, 1), schedule=&amp;quot;@daily&amp;quot;, catchup=False ) as dag: extract_task = PythonOperator( task_id=&amp;ldquo;extract&amp;rdquo;, python_callable=extract ) transform_task = PythonOperator( task_id=&amp;ldquo;transform&amp;rdquo;, python_callable=transform ) load_task = PythonOperator( task_id=&amp;ldquo;load&amp;rdquo;, python_callable=load )</description>
    </item>
  </channel>
</rss>
