Ambari Agent Command 处理流程

一、概述:

根据 Ambari Server 架构 文章中的介绍,由于 Ambari Server 和 Ambari Agent 之间是通过 HTTP 短连接进行通信,所以 Server 无法把需要执行的 Command,直接推送给 Agent,而是需要把命令存储在 ActionQueue 中,

然后 Agent 通过定期发送 Heartbeat 请求,把 Command 拉过去执行,并通过下次的 Heartbeat 请求,返回执行结果。下面简单分析一下 Command 的处理过程。

二、Agent Command 类型

  • REGISTRATION_COMMAND:注册指令,当 Server 发现 节点未注册、节点当前状态为 HEARTBEAT_LOST、Agent 上传的主机状态 Server 处理失败的时候,会要求 Agent 重试进行注册。
  • STATUS_COMMAND:汇报状态指令,Server 端有个定时任务 HeartbeatMonitor 默认1分钟执行一次,要求 Agent 汇报当前的组件状态、当前使用的配置版本等信息。
  • EXECUTION_COMMAND:执行任务指令,当我们操作服务/组件的时候,比如:安装、启动、停止、更新配置等,就会发送这个指令。
  • CANCEL_COMMAND:取消任务指令,中断一个操作。
  • ALERT_DEFINITION_COMMAND:更新 Alert 定义指令,当我们修改了 Alert 信息、增删组件、删节点的时候,会发送这个指令。
  • ALERT_EXECUTION_COMMAND:立即执行一个 Alert。

上面这些指令,除了 REGISTRATION_COMMAND,其他指令都需要先添加到 ActionQueue 中,Server 处理心跳逻辑时,如果发现 Agent 需要重新注册,会立即生成 REGISTRATION_COMMAND,要求 Agent 重新注册。

下面着重介绍一下 EXECUTION_COMMAND,可以看出来这个指令使用频率最高、最重要,处理逻辑也是最复杂的,理解了这个指令,其他指令的处理逻辑大同小异。

三、EXECUTION_COMMAND 处理流程

时机:用户触发了一个服务/组件的操作

服务端处理逻辑:

(1) 计算依赖,生成 Command,并保存到数据库
(2) 定期从数据库加载 Command,并添加到 ActionQueue
(3) 心跳逻辑:
  · 把 ActionQueue 中的所有 Command 下发给 Agent
  · 根据 Agent 的汇报,处理 Command 执行结果

1、计算依赖

如下图所示:

  • 一个 Request 包含多个 Stage
  • 一个 Stage 包含多个 Task
  • 一个 Task 对应一条 Command

需要注意的是 Stage 之间有依赖关系,必须前一个 Stage 运行完,才能开始下一个 Stage;而多个 Task 可以并行执行。

 

Stage之间的依赖关系是使用有向无环图(DAG)计算出来的,下面简单介绍一下DAG:

  • 节点:要执行的任务
  • 有向边:依赖关系,A 到 B 的箭头,代表 B 依赖 A
  • 无环:指的是没有循环依赖

举一个启动 HDFS 的例子:

在 role_command_order.json 文件中定义依赖关系:  "DATANODE-START" : ["NAMENODE-START"]

生成 Command 并保存到数据库

表关系如下图:

 2、定期从数据库中载入 Command 添加到 ActionQueue

这段逻辑在 ActionScheduler 类中,总结一下:

(1) 处理被取消的 Request

  • 未下发的 Command,服务端直接改状态
  • 已下发的 Command,生成 CANCEL_COMMAND

(2) 从数据库载入 Command 并添加到 ActionQueue

  • 任务是否需要独占运行
  • 同一个 Request,只能有一个 Stage 运行
  • 超时逻辑
  • 重试逻辑
  • 前一个 Stage 运行失败,后边 Stage 直接取消
  • 满足条件的 Command 添加到 ActionQueue
posted @ 2017-05-11 16:22  basenet855x  阅读(1603)  评论(0编辑  收藏  举报