繁体   English   中英

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

[英]DAGs not clickable on Google Cloud Composer webserver, but working fine on a local Airflow

我正在使用带有图像版本composer-0.5.3-airflow-1.9.0和 Python 2.7 的Google Cloud Composer (Google Cloud Platform 上的托管 Airflow),但我面临一个奇怪的问题:导入 DAG 后,它们不是可从 Web UI单击(并且没有“触发 DAG”、“图形视图”等按钮),而在运行本地 Airflow 时一切正常。

即使无法从 Composer 上的网络服务器使用,我的 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-bucket有 4 个以my_dag开头的文件):

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 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 上导入脚本时,网络服务器工作正常:

本地 Airflow 上的 DAG

一些测试

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

我不知道为什么会发生这种情况,我还检查了日志(通过在airflow.cfg设置logging_level = DEBUG ),但看不出有什么问题。 我怀疑网络服务器中存在错误,但我无法获得重要的堆栈跟踪。 来自 Composer(托管在 App Engine 上)的 Web 服务器日志不可用,或者至少我没有找到访问它们的方法。

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

更新

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

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

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

foo-tp.appspot.com

那么服务帐户是:

foo-tp@appspot.gserviceaccount.com

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM