我想对 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 的资源利用率高,该任务失败。
解决方法
查看您的调度器日志
完成以下步骤:
-
打开 Amazon CloudWatch 控制台。
-
在导航窗格中,选择 Logs(日志)。
-
选择 Log groups(日志组)。
-
选择要查看的日志组。
-
选择 Search All LogStream(搜索所有 LogStream)。
-
要搜索任务失败的时间段,请更新时间间隔。另外,使用您的任务 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 替换为要使用的时间段。
-
在搜索结果中确定两条引用您的任务的日志行:
以下是您的排队任务示例:
[[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 日志,请完成以下步骤:
- 访问您的 Apache Airflow UI。
- 选择 DAG。
- 选择 Graph(图表)。
- 选择任务运行。
- 选择 Instance details(实例详细信息)。然后,记下任务的 external_executor_id 值。
- 打开 Amazon CloudWatch 控制台。
- 在导航窗格中,选择 Logs(日志)。
- 选择 Log groups(日志组)。
- 选择要查看的日志组。
- 选择 Search All LogStream(搜索所有 LogStream)。
- 要搜索任务失败的时间段,请更新时间间隔。
- 使用 external_executor_id 值筛选搜索,以查看与您在 Worker 上的任务相关的日志行。
- 识别与您的任务相关的错误消息。有关错误的详细信息,请选择日志流的名称。
由于 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 网站上的最佳实践