簡體   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