DAG在Google Cloud Composer网络服务器上不可点击,但在本地Airflow上可以正常工作

时间:2018-07-06 22:22:42

标签: python python-2.7 airflow airflow-scheduler google-cloud-composer

我正在将Google Cloud Composer(在Google Cloud Platform上管理的气流)与图像版本composer-0.5.3-airflow-1.9.0和Python 2.7结合使用,并且遇到一个奇怪的问题:导入DAG后,它们>不可点击(并且没有按钮“ Trigger DAG”,“图形视图”等),而在运行本地Airflow时,所有按钮都可以正常工作。

即使Composer上的Web服务器无法使用,我的DAG仍然存在。我可以使用CLI(list_dags)列出它们,描述它们(list_tasks)甚至触发它们(trigger_dag)。

再现问题的最小示例

下面是我用来重现该问题的一个最小示例。使用钩子(此处为GoogleCloudStorageHook)非常重要,因为使用钩子时会发生Composer上的错误。最初,我使用的是自定义挂钩(在自定义插件中),并且遇到了相同的问题。

基本上,在此示例中列出了GCS存储桶(my-bucket)中的所有条目,并为每个以my_dag开头的条目生成了DAG。

import datetime

from airflow import DAG
from airflow.contrib.hooks.gcs_hook import GoogleCloudStorageHook
from airflow.operators.bash_operator import BashOperator

google_conn_id = 'google_cloud_default'

gcs_conn = GoogleCloudStorageHook(google_conn_id)

bucket = 'my-bucket'
prefix = 'my_dag'

entries = gcs_conn.list(bucket, prefix=prefix)

for entry in entries:
    dag_id = str(entry)

    dag = DAG(
        dag_id=dag_id,
        start_date=datetime.datetime.today(),
        schedule_interval='0 0 1 * *'
    )

    op = BashOperator(
        task_id='test',
        bash_command='exit 0',
        dag=dag
    )

    globals()[dag_id] = dag

Cloud Composer上的结果

将此文件导入Composer之后,结果如下(我在my_dag中有4个文件以my-bucket开头):

DAGs on Google Cloud Composer

正如我所解释的,DAG不可单击,并且“最近任务”和“ DAG运行”列将永远加载。每个DAG名称旁边的“信息”标记表示:This DAG isn't available in the webserver DagBag object. It shows up in this list because the scheduler marked it as active in the metadata database

当然,刷新没有用,当通过直接URL(https://****.appspot.com/admin/airflow/graph?dag_id=my_dag_1)访问DAG Graph View时,它显示错误:DAG "my_dag_1" seems to be missing.

关于本地气流的结果

在本地Airflow上导入脚本时,网络服务器可以正常工作:

DAGs on local Airflow

一些测试

如果用诸如entries = gcs_conn.list(bucket, prefix=prefix)之类的硬编码值替换行entries = [u'my_dag_1', u'my_dag_2', u'my_dag_3', u'my_dag_4'],则在Composer Web UI上可以单击DAG(并且出现“链接”列上的所有按钮)。看来,从我对最初的问题进行的其他测试来看,从钩子中调用方法(不仅仅是初始化钩子)会导致问题。当然,Composer中的DAG可以在简单的示例上正常工作(不涉及任何钩子方法调用)。

我不知道为什么会这样,我还检查了日志(通过在logging_level = DEBUG中设置airflow.cfg),但是看不到任何错误。我怀疑网络服务器中存在错误,但无法获得大量堆栈跟踪信息。来自Composer(位于App Engine上)的Web服务器日志不可用,或者至少我没有找到访问它们的方法。

有人使用Composer Web UI遇到了相同或相似的问题吗?我认为问题出在钩子的使用上,但我可能是错的。这可能只是副作用。老实说,我在测试了很多东西后迷路了。如果有人可以帮助我,我会很高兴。谢谢!

更新

按照本指南https://cloud.google.com/composer/docs/how-to/managing/deploy-webserver在Kubernetes上部署自助式Web服务器时,可以从该自助式Web服务器上单击我的DAG。

1 个答案:

答案 0 :(得分:3)

Composer Web服务器运行的服务帐户与Composer GKE群集中的节点不同。您应该确保已为网络服务器的服务帐户分配了适当的角色/权限。

例如如果您的网络服务器的网址是:

foo-tp.appspot.com

然后该服务帐户为:

foo-tp@appspot.gserviceaccount.com