跳至内容

如何对 Amazon MWAA 中的“Was the task killed externally”(任务是否在外部终止)错误进行故障排除?

2 分钟阅读
0

我想对 Amazon Managed Workflows for Apache Airflow (Amazon MWAA) 中的“Was the task killed externally”(任务是否在外部终止)错误进行故障排除。

简短描述

当 Airflow 元数据数据库和任务启动器之间的任务状态不同时,将会出现“Was the task killed externally”(任务是否在外部终止)错误。以下是错误的原因:

  • 已达到 task_queued_timeout 值。默认值为 600 秒。对于 Apache Airflow 的早期版本,请查看 task_adoption_timeout 值。有关详细信息,请参阅 Apache Airflow 网站上的 task_queued_timeout_check_interval
  • 由于 Worker 的资源利用率高,该任务失败。

解决方法

查看您的调度器日志

完成以下步骤:

  1. 打开 Amazon CloudWatch 控制台

  2. 在导航窗格中,选择 Logs(日志)。

  3. 选择 Log groups(日志组)。

  4. 选择要查看的日志组。

  5. 选择 Search All LogStream(搜索所有 LogStream)。

  6. 要搜索任务失败的时间段,请更新时间间隔。另外,使用您的任务 ID 筛选搜索:

    "example-dag-name.example-task-name manual__example-time-202X-XX-XXTXX:XX:XX.758774+00:00"

    **注意:**将 example-dag-name 替换为您的有向无环图 (DAG) 名称,将 example-task-name 替换为您的任务名称,将 example-time 替换为要使用的时间段。

  7. 在搜索结果中确定两条引用您的任务的日志行:

    以下是您的排队任务示例:

    [[34m**2024-01-17T11:19:07.487+0000**[0m] [34mscheduler_job_runner.py:[0m713 INFO[0m - Setting external_id for <TaskInstance: dag_name.task_name manual__202X-XX-XXTXX:XX:XX.758774+00:00[queued]> to 8b49b168-992d-4db6-bdc7-a143d55720c8[0m

    以下是已停止任务的示例:

    [[34m**2024-01-17T11:30:18.936+0000**[0m] [34mscheduler_job_runner.py:[0m771 ERROR[0m - Executor reports task instance <TaskInstance: dag_name.task_name manual__202X-XX-XXTXX:XX:XX.758774+00:00 [queued]> finished (failed) although the task says it's queued. (Info: None) Was the task killed externally?[0m

您可以针对以下情境进一步排除故障。

任务因 task_queued_timeout 而失败

比较您计划任务的时间戳和任务停止的时间戳。如果差值大于或等于 task_queued_timeout 值,则您的任务排队时间过长。

要解决此问题,请执行以下操作:

  • 增加 task_queued_timeout 值,以便任务可以在队列中等待更长的时间而不会超时。
  • 升级到更高的环境等级,以增加每个 Worker 容器中的 Celery Worker 槽的数量。可以在环境中运行的并发任务数量为 maxWorkers * celery.worker_autoscale
  • 分散 DAG 和任务的负载。不要同时运行多个 DAG。
  • 检查您的调度器是否过载。如果您的调度器过载,则可能无法按时安排任务。

**注意:**调度器数量的增加可能会影响元数据库的利用率和解析时间。更多的调度器可以提高高可用性 (HA),但不会为任务调度增加更多资源。如果未达到 task_queued_timeout 的值,请检查您的 Worker 日志。

要检查您的 Worker 日志,请完成以下步骤:

  1. 访问您的 Apache Airflow UI
  2. 选择 DAG。
  3. 选择 Graph(图表)。
  4. 选择任务运行。
  5. 选择 Instance details(实例详细信息)。然后,记下任务的 external_executor_id 值。
  6. 打开 Amazon CloudWatch 控制台
  7. 在导航窗格中,选择 Logs(日志)。
  8. 选择 Log groups(日志组)。
  9. 选择要查看的日志组。
  10. 选择 Search All LogStream(搜索所有 LogStream)。
  11. 要搜索任务失败的时间段,请更新时间间隔。
  12. 使用 external_executor_id 值筛选搜索,以查看与您在 Worker 上的任务相关的日志行。
  13. 识别与您的任务相关的错误消息。有关错误的详细信息,请选择日志流的名称。

由于 CPU 或内存利用率过高,任务失败

如果您收到以下错误消息,则说明您的 Worker 存在资源利用率问题,例如 CPU 或 RAM 过高。这样一来,在 Worker 容器上运行的 Worker 进程会失败并过早退出。

"[2023-07-26 13](tel:2023072613):00:49,356: ERROR/MainProcess] Task handler raised error: WorkerLostError('Worker exited prematurely: signal 15 (SIGTERM) Job: 1049.')"

要对前面的错误消息进行故障排除,请检查 CPUUtilization 和 MemoryUtilization 指标。如果这些指标持续居高不下或出现峰值,则您的 Amazon MWAA Worker 会过载。

要解决 Worker 过载问题,请执行以下操作:

  • 减少 celery.worker_autoscale 值以降低在您的 Worker 上并行运行的任务数量。
  • 使用更高的 Amazon MWAA 实例类获得更多的 RAM 和 vCPU。
  • 重写您的 DAG,将计算工作负载从 Amazon MWAA 转移到其他计算平台。

相关信息

Apache Airflow 网站上的最佳实践