Airflow DAG和任务的结构/组织

Airflow DAG和任务的结构/组织,airflow,apache-airflow,Airflow,Apache Airflow,我的问题是: 为了组织DAG和任务,什么是好的目录结构?(dags示例仅显示两个任务) 我现在把我的DAG放在DAG文件夹的根目录下,把我的任务放在不同的目录下,不知道该怎么做 我们应该使用zip文件吗 我也想与其他人一起测试文件夹结构。也许这将取决于你使用气流来做什么,但我将分享我的案例。我正在使用数据管道来构建数据仓库,因此在高层,我基本上有两个步骤: 将大量数据转储到数据池中(只有少数人可以直接访问) 将数据从data lake加载到分析数据库中,在该数据库中,数据将被建模并公开给仪表板

我的问题是:

  • 为了组织DAG和任务,什么是好的目录结构?(dags示例仅显示两个任务)
  • 我现在把我的DAG放在DAG文件夹的根目录下,把我的任务放在不同的目录下,不知道该怎么做
  • 我们应该使用zip文件吗
我也想与其他人一起测试文件夹结构。也许这将取决于你使用气流来做什么,但我将分享我的案例。我正在使用数据管道来构建数据仓库,因此在高层,我基本上有两个步骤:

  • 将大量数据转储到数据池中(只有少数人可以直接访问)
  • 将数据从data lake加载到分析数据库中,在该数据库中,数据将被建模并公开给仪表板应用程序(许多sql查询用于建模数据)
  • 今天,我将文件组织到三个主要文件夹中,试图反映上述逻辑:

    ├── dags
    │   ├── dag_1.py
    │   └── dag_2.py
    ├── data-lake
    │   ├── data-source-1
    │   └── data-source-2
    └── dw
        ├── cubes
        │   ├── cube_1.sql
        │   └── cube_2.sql
        ├── dims
        │   ├── dim_1.sql
        │   └── dim_2.sql
        └── facts
            ├── fact_1.sql
            └── fact_2.sql
    

    这或多或少是我的基本文件夹结构

    我用这样的东西

    • 项目通常是完全独立或独特的。也许DAG可以处理我们从某个客户机接收到的文件,这些文件将与其他所有内容完全无关(几乎可以肯定是一个单独的数据库模式)
    • 我的操作符、挂钩和一些助手脚本(删除某个DAG的所有气流数据等)位于一个公用文件夹中
    • 我曾经为整个Airflow文件夹提供一个git存储库,但现在每个项目都有一个单独的git(这样可以更有序地授予Gitlab权限,因为项目之间非常不相关)。这意味着每个项目文件夹也可以作为.git和.gitignore等
    • 我倾向于保存原始数据,然后“保留”数据的修改副本,这正是复制到数据库中的数据。由于来自不同客户机的不同格式(Excel、网页抓取、HTML电子邮件抓取、平面文件、SalesForce查询或其他数据库源…),我不得不大量修改一些原始数据
    示例树:

    ├───dags
    │   ├───common
    │   │   ├───hooks
    │   │   │       pysftp_hook.py
    │   │   │
    │   │   ├───operators
    │   │   │       docker_sftp.py
    │   │   │       postgres_templated_operator.py
    │   │   │
    │   │   └───scripts
    │   │           delete.py
    │   │
    │   ├───project_1
    │   │   │   dag_1.py
    │   │   │   dag_2.py
    │   │   │
    │   │   └───sql
    │   │           dim.sql
    │   │           fact.sql
    │   │           select.sql
    │   │           update.sql
    │   │           view.sql
    │   │
    │   └───project_2
    │       │   dag_1.py
    │       │   dag_2.py
    │       │
    │       └───sql
    │               dim.sql
    │               fact.sql
    │               select.sql
    │               update.sql
    │               view.sql
    │
    └───data
        ├───project_1
        │   ├───modified
        │   │       file_20180101.csv
        │   │       file_20180102.csv
        │   │
        │   └───raw
        │           file_20180101.csv
        │           file_20180102.csv
        │
        └───project_2
            ├───modified
            │       file_20180101.csv
            │       file_20180102.csv
            │
            └───raw
                    file_20180101.csv
                    file_20180102.csv
    

    只是重申这只是我的组织方式。如果有人来问这个问题,最好用其他方法来构造文件夹和文件的基准测试我发现这个目录结构非常有用;只有一个疑问:
    scheduler
    的性能会因为将所有内容都放在
    dag
    目录下而受到影响吗?虽然即使我将包含
    运算符
    s(或除实际
    DAG
    s以外的任何内容)的文件放在
    DAG
    目录之外,并将它们导入
    DAG
    文件,但这或多或少意味着相同的事情。但是
    dag
    文件夹中的非
    python
    文件(如上面的
    .sql
    文件)可能(理论上)导致
    调度器不必要的开销
    哦,我不确定。不过我还是得调查一下。老实说,我从来没有想过——我之所以这样设置,更多是因为版本控制(易于克隆或端到端共享特定的项目,而不会混淆项目)
    我曾经为整个文件夹设置了一个git存储库,但是现在我每个项目都有一个单独的git
    那么如何将不同的回购协议粘在主回购协议中呢?(我当前的解决方案是使用git子模块)只是跟进这个线程。是否有人看到此存储库结构对调度程序有任何影响?