【问题标题】:hello world of Apache Airflow not working你好Apache Airflow的世界不工作
【发布时间】:2021-05-10 23:57:13
【问题描述】:

我正在学习 Apache Airflow 并尝试编写它的 hello world 版本。

我已经用 python 3.8 版设置了 apache airflow 2.0 版,下面是包含 dag 和任务的代码

import datetime
import logging

from airflow import DAG
from airflow.operators.python import PythonOperator


def greet_hello():
    logging.info("Hello World")


dag = DAG("FirstDag", start_date=datetime.datetime.now(),schedule_interval=None)

first_task = PythonOperator(python_callable=greet_hello , dag=dag , task_id="first-task")

我已经通过以下方式配置了 apache 气流

  1. 在 venv 中 pip 安装 apache-airflow
  2. 气流创建用户 ....
  3. 气流数据库初始化
  4. 气流网络服务器
  5. 气流调度器

我可以在 UI 中看到 Dag

但是当我检查任务实例详细信息时,我会看到以下消息

“任务实例状态任务处于‘无’状态,这不是执行的有效状态。必须清除任务才能运行。”

即使调度程序正在运行,我也会在 UI 中收到以下消息

当我转到 graph view 并将鼠标悬停在 first-task 上时,它说尚未开始。我正在努力弄清楚我出了什么问题以及如何解决它。谢谢

【问题讨论】:

    标签: airflow


    【解决方案1】:

    我认为这里有两个问题。

    1. DAG 本身似乎已暂停。您需要将其设置为 Active 才能安排任务。

    2. 调度程序警报可能会给您一些误导性信息。气流涉及同时运行的多个独立进程。它使用“心跳”来跟踪调度程序进程是否处于活动状态。换句话说,调度程序正在定期检查另一个气流进程。如果调度器在预定的时间内没有发出心跳,Airflow 不确定调度器是否还活着,它会提出这个错误。

    这是误导的原因是,它可能只是意味着调度程序被配置为心跳频率低于气流“健康”截止时间间隔。这在本地使用气流时经常发生。默认配置设置为最小化系统资源,因此心跳可能不频繁。

    这很容易检查。

    1. 检查气流正在使用什么值来确定调度程序最近是否进行了足够的心跳。
    $ airflow config get-value scheduler scheduler_health_check_threshold
    
    30
    

    在我的机器上,如果调度程序在过去 30 秒内返回了心跳,则气流认为调度程序是健康的。

    1. 检查心率值。这是调度程序检查的频率,除其他外,表明它是健康的。
    $ airflow config get-value scheduler scheduler_heartbeat_sec
    
    5
    

    在这里,气流每 5 秒检查一次。

    如果scheduler_heartbeat_sec > scheduler_health_check_threshold,您将看到您指定的消息。这并不意味着任何东西都被破坏了,它只是意味着气流不确定调度程序是否处于活动状态。

    1. 要确保调度程序正在运行,请检查您用于运行调度程序的终端窗口。如果它定期输出日志并且您没有看到任何错误,那么它应该可以正常工作。

    2. 检查调度程序最后一次发出心跳http://localhost:8080/health(或您在本地使用的任何端口)。不要担心status 的值,因为它是使用围绕heartbeatheartrate 的相同逻辑生成的。但是latest_scheduler_heartbeat 会告诉您调度程序最近一次心跳的时间。

    【讨论】:

    • 检查调度器的健康状况......显示健康并且调度器日志中没有错误
    • 您是否执行了其他步骤,包括确保您的 DAG 处于活动状态?停止并重新启动调度程序也没有什么坏处。
    • 我能够按照您提到的步骤解决问题。非常感谢
    【解决方案2】:

    切勿将datetime.datetime.now() 用作start_date。请阅读https://airflow.apache.org/docs/apache-airflow/stable/faq.html#what-s-the-deal-with-start-date 了解为什么不这样做。

    start_date 应该尽可能是静态的。

    其次,正如 James 建议的那样,确保您 unpause 来自 Web 服务器的 DAG 或将 is_paused_upon_creation 设置为 True 到 DAG 对象

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2015-01-13
      相关资源
      最近更新 更多