在Google Cloud Composer中使用Airflow模板文件和template_searchpath

时间:2018-06-08 12:51:41

标签: airflow google-cloud-composer

我在Google Cloud Composer上的Airflow DAG中使用BigQueryOperator进行了扩展。

对于较长时间的查询,最好将每个查询放在自己的.sql文件中,而不是将DAG弄乱。 Airflow似乎支持所有SQL Query运算符,包括BigQueryOperator,如the documentation中所示。

我的问题:在我在.sql模板文件中编写了我的sql语句后,如何将其添加到Google Cloud Composer并在DAG中引用它?

3 个答案:

答案 0 :(得分:1)

在谷歌上搜索this related question之后。我找到了一种方法来完成这项工作(虽然它不是理想的解决方案,正如我们所见)。这是一个包含三个部分的工作示例:(1)带有一些jinja模板的sql模板文件,(2)DAG,以及(3)将模板上传到正确位置所需的gcloud命令。

(1) sql模板文件 这只是一个文本文件,其文件名以.sql扩展名结尾。我们假设此文件名为my-templated-query.sql并包含:

SELECT COUNT(1) FROM mytable WHERE _PARTITIONTIME = TIMESTAMP('{{ ds }}')

(2)引用DAG文件中的模板 要引用此模板,请创建如下运算符:

count_task = BigQueryOperator( task_id='count_rows', sql='/my-templated-query.sql')

(3)将模板文件添加到Google Cloud Composer 事实证明,默认情况下,airflow会在dags文件夹中查找模板文件。要将模板文件上传到dags文件夹,我们运行

gcloud beta composer environments storage dags import --environment my-env-name --location us-central1 --source path/to/my-templated-query.sql

您必须相应地替换env名称,位置和源路径。

将所有这些模板上传到dag文件夹似乎并不合适。更好的Airflow做法是将模板放在自己的文件夹中,并将template_searchpath参数指定为point to it when you create your DAG。但是,我不确定如何使用Google Cloud Composer执行此操作。

更新:我已经意识到可以将子文件夹放在DAG文件夹中,这对于组织大量SQL模板非常有用。我们假设我在DAG_FOLDER/dataset1/table1.sql放了一个SQL模板文件。在BigQueryOperator中,Ithen可以使用sql=/dataset1/table1.sql来引用它。如果您有一个包含大量文件的子文件夹以及其中的许多其他子文件夹,您还可以使用上面显示的dag import递归上传整个子文件夹 - 只需将其指向子文件夹即可。

答案 1 :(得分:0)

我们最近使用类似的策略解决了这一问题。这些步骤是:

  1. 将所有SQL文件放入Google Cloud Source Repository
  2. 在每次DAG运行的开始,将文件克隆到Cloud Storage Bucket的“数据”目录中,该目录会自动与您的Airflow环境共享。
  3. 使用BigQueryOperator中的模板读取执行时的查询。

这是一个最小的解决方案:

from airflow.operators import bash_operator
from airflow.contrib.operators import bigquery_operator

with models.DAG(
        'bigquery_dag',
        schedule_interval = None ,
        template_searchpath = ['/home/airflow/gcs/data/repo/queries/'],
        default_args = default_dag_args
        ) as dag:

    t1_clean_repo = bash_operator.BashOperator(
        task_id = 'clean_repo',
        bash_command = 'rm -rf /home/airflow/gcs/data/repo'
    )

    clone_command = """
        gcloud source repos clone repo --project=project_id
        cp -R repo /home/airflow/gcs/data
    """

    t2_clone_repo = bash_operator.BashOperator(
        task_id='clone_repo',
        bash_command=clone_command
        )

    t3_query = bigquery_operator.BigQueryOperator(
        task_id='query',
        sql= 'query.sql',
        use_legacy_sql = False,
        bigquery_conn_id='conn_id'
    )

我们在这里利用了一些重要的概念:

  1. 通过Fuse与您的Airflow实例自动共享Cloud Storage Bucket中的数据目录。大多数操作员都可以访问这里放的任何东西。
  2. 只要您的Google Cloud Source存储库与Cloud Composer在同一个项目中,您的Airflow实例就不需要git clone个文件的附加权限。
  3. 我们正在DAG参数中设置template_searchpath,扩展搜索范围以将data目录包括在Cloud Storage Bucket中。

答案 2 :(得分:0)

我找到了解决这个问题的理想方法。在您的 dag 声明中,您可以设置 template_searchpath,这是 Airflow 查找 jinja 模板文件的默认路径。

为了在您的 Cloud Composer 实例中执行此操作,您必须将其设置为以下内容

dag = DAG(
    ...
    template_searchpath=["/home/airflow/gcs/plugins"],
)

请注意,我在此示例中使用了 plugins 文件夹。您可以改用您的数据文件夹,也可以使用您希望存储在存储桶中的任何文件夹。