11

我正在使用带有图像版本和 Python 2.7 的Google Cloud Composercomposer-0.5.3-airflow-1.9.0 (Google Cloud Platform 上的托管 Airflow) ,我遇到了一个奇怪的问题:导入我的 DAG 后,它们无法从 Web UI 中点击(并且没有按钮“Trigger DAG”,“Graph view”,...),而在运行本地 Airflow 时,所有这些都可以完美运行。

即使 Composer 上的网络服务器无法使用,我的 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

Cloud Composer 上的结果

将此文件导入 Composer 后,结果如下(我有 4 个以 in 开头的文件my_dagmy-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 Graph View的时候报错:DAG "my_dag_1" seems to be missing.

本地气流的结果

在本地 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'],那么 DAG 在 Composer Web UI 上是可点击的(并且“链接”列上的所有按钮都会出现)。看来,从我对最初问题所做的其他测试来看,从钩子调用方法(不仅仅是初始化钩子)会导致问题。当然,Composer 中的 DAG 在简单示例上正常工作(不涉及挂钩方法调用)。

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

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

更新

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

4

1 回答 1

3

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

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

foo-tp.appspot.com

那么服务帐户是:

foo-tp@appspot.gserviceaccount.com
于 2018-07-17T16:28:02.830 回答