我正在使用图像版本 composer-0.5.3-airflow-1.9.0
和Python 2.7的Google Cloud Composer(在Google Cloud 平台上管理Airflow),我面临一个奇怪的问题:导入我的DAG后,它们是来自Web UI的 not clickable (并且没有按钮"Trigger DAG", "Graph view",...),虽然在运行本地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-bucket
中以 my_dag
开头有4个文件):
正如我解释的那样,DAG不可点击,列"Recent Tasks"和"DAG Runs"将永远加载 . 每个DAG名称旁边的"info"标记显示: 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服务器正常工作:
一些测试
如果我用 entries = [u'my_dag_1', u'my_dag_2', u'my_dag_3', u'my_dag_4']
等硬编码值替换 entries = gcs_conn.list(bucket, prefix=prefix)
行,则可以在Composer Web UI上单击DAG(并显示"links"列上的所有按钮) . 从我在初始问题上做的其他测试看来,从钩子调用方法(而不仅仅是初始化钩子)会导致问题 . 当然,Composer中的DAG通常在简单的示例上工作(不涉及钩子方法调用) .
我不知道为什么会发生这种情况,我也检查了日志(通过在 airflow.cfg
中设置 logging_level = DEBUG
),但看不出有什么问题 . 我怀疑网络服务器中存在错误,但我无法获得重要的堆栈跟踪 . Composer(托管在App Engine上)的Webserver日志不可用,或者至少我找不到访问它们的方法 .
是否有人使用Composer Web UI遇到了相同的问题或类似问题?我认为这个问题来自钩子的使用,但我可能错了 . 它可能只是副作用 . 说实话,我在测试了很多东西之后迷了路 . 如果有人可以帮助我,我会很高兴的 . 谢谢!
更新
按照本指南在Kubernetes上部署自我管理的Web服务器时:https://cloud.google.com/composer/docs/how-to/managing/deploy-webserver,可以从此自我管理的Web服务器中单击我的DAG .
1 回答
Composer Web服务器使用与Composer GKE集群中的节点不同的服务帐户运行 . 您应确保已为网络服务器的服务帐户分配了相应的角色/权限 .
例如 . 如果您的网络服务器的网址是:
然后服务帐户是: