Estoy usando Google Cloud Composer (flujo de air administrado en Google Cloud Platform) con la versión de imagen composer-0.5.3-airflow-1.9.0
y Python 2.7, y me enfrento a un problema extraño: después de importar mis DAG, no son se puede hacer clic desde la interfaz de usuario web (y no hay botones “Activar DAG”, “Vista de gráfico”, …), mientras que todo funciona perfectamente cuando se ejecuta un flujo de air local.
Incluso si no se puede utilizar desde el servidor web en Composer, mis DAG todavía existen. Puedo enumerarlos utilizando CLI ( list_dags
), describirlos ( list_tasks
) e incluso activarlos ( trigger_dag
).
Un ejemplo mínimo que utilicé para reproducir el problema se muestra a continuación. El uso de un gancho (aquí, GoogleCloudStorageHook
) es muy importante, ya que el error en Composer ocurre cuando se usa un gancho. Inicialmente, estaba usando un gancho personalizado (en un complemento personalizado), y estaba enfrentando el mismo problema.
Básicamente aquí, el ejemplo enumera todas las entradas en un grupo GCS ( my-bucket
) y genera un DAG para cada entrada que comienza con 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
Después de importar este archivo a Composer, aquí está el resultado (tengo 4 archivos que comienzan con my_dag
en my-bucket
):
Como expliqué, los DAG no se pueden hacer clic y las columnas “Tareas recientes” y “Ejecuciones DAG” se están cargando para siempre. La marca de “información” al lado de cada nombre de DAG dice: 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
.
Por supuesto, la actualización no es útil, y al acceder a la Vista de gráfico de DAG mediante la URL directa ( https://****.appspot.com/admin/airflow/graph?dag_id=my_dag_1
), muestra un error: DAG "my_dag_1" seems to be missing.
Al importar el script en un flujo de air local, el servidor web funciona bien:
Si sustituyo las entries = gcs_conn.list(bucket, prefix=prefix)
línea entries = gcs_conn.list(bucket, prefix=prefix)
con valores codificados como las entries = [u'my_dag_1', u'my_dag_2', u'my_dag_3', u'my_dag_4']
, entonces DAGS se puede hacer clic en Composer Web UI (y aparecen todos los botones en las columnas de “enlaces”). Parece que, a partir de otras pruebas que hice en mi problema inicial, llamar a un método desde un enlace (no solo inicializar el enlace) causa el problema. Por supuesto, los DAG en Composer funcionan normalmente en ejemplos simples (no se requieren llamadas a métodos de enganches).
No tengo idea de por qué sucedió esto, también he inspeccionado los registros (configurando logging_level = DEBUG
en airflow.cfg
) pero no pude ver algo incorrecto. Estoy sospechando un error en el servidor web, pero no puedo obtener un seguimiento significativo de la stack. Los registros del servidor web de Composer (alojados en App Engine) no están disponibles, o al menos no encontré la forma de acceder a ellos.
¿Alguien experimentó el mismo problema o problemas similares con Composer Web UI? Creo que el problema proviene del uso de ganchos, pero puedo estar equivocado. Sólo puede ser un efecto secundario. Para ser honesto, estoy perdido después de probar tantas cosas. Me alegraré si alguien me puede ayudar. ¡Gracias!
Al implementar un servidor web autogestionado en Kubernetes siguiendo esta guía: https://cloud.google.com/composer/docs/how-to/managing/deploy-webserver , se puede hacer clic en mis DAG desde este servidor web autogestionado.
El servidor web Composer se ejecuta con una cuenta de servicio diferente a la de los nodos en el cluster Composer GKE. Debe asegurarse de que ha asignado los roles / permisos apropiados a la cuenta de servicio de su servidor web.
Por ejemplo, si la url de su servidor web es:
foo-tp.appspot.com
entonces la cuenta de servicio es:
foo-tp@appspot.gserviceaccount.com