DAG无法在Google Cloud Composer网络服务器上点击,但在本地Airflow上正常运行

nor*_*bjd 9 python python-2.7 airflow airflow-scheduler google-cloud-composer

我正在使用带有图像版本和Python 2.7的Google Cloud Composer(在Google云平台上管理Airflow)composer-0.5.3-airflow-1.9.0,我面临一个奇怪的问题:导入我的DAG后,它们无法从Web UI中点击(并且没有按钮) "Trigger DAG","Graph view",...),虽然在运行本地Airflow时都能正常工作.

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

再现问题的最小例子

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

这里,该示例基本上列出了GCS存储桶(my-bucket)中的所有条目,并为每个以条目开头的条目生成DAG my_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
Run Code Online (Sandbox Code Playgroud)

Cloud Composer上的结果

将此文件导入Composer后,结果如此(我有4个以my_dagin 开头的文件my-bucket):

Google Cloud Composer上的DAG

正如我所解释的那样,DAG不可点击,"Recent Tasks"和"DAG Runs"列将永远加载.每个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图表视图时,它会显示错误:DAG "my_dag_1" seems to be missing.

当地气流的结果

在本地Airflow上导入脚本时,Web服务器正常工作:

本地Airflow上的DAG

一些测试

如果我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 = DEBUGairflow.cfg),但不能看到的东西是错误的.我怀疑网络服务器中存在错误,但我无法获得重要的堆栈跟踪.Composer(托管在App Engine上)的Webserver日志不可用,或者至少我找不到访问它们的方法.

是否有人使用Composer Web UI遇到了相同的问题或类似问题?我认为问题来自钩子的使用,但我可能错了.它可能只是副作用.说实话,我在测试了很多东西之后迷了路.如果有人可以帮助我,我会很高兴的.谢谢!

更新

按照本指南在Kubernetes上部署自我管理的网络服务器时:https://cloud.google.com/composer/docs/how-to/managing/deploy-webserver ,可以从此自我管理的网络服务器中点击我的DAG.

小智 3

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

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

foo-tp.appspot.com
Run Code Online (Sandbox Code Playgroud)

那么服务帐户是:

foo-tp@appspot.gserviceaccount.com
Run Code Online (Sandbox Code Playgroud)

  • 大家好,能详细解释一下吗?我也有同样的问题,dag 不可点击。我将在哪里分配网络服务器服务帐户? (3认同)