TT Bigdata TT Bigdata
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 模板代码

    • 各类组件
    • 通用模板
  • 国产化&其他系统

    • Centos系列
    • Kylin系列
    • OpenEuler系列
    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 定制开发

    • 组件版本定制
    • 样式风格定制
  • 蓝图愿景
  • 技术支持
  • 合作共建
GitHub (opens new window)

JaneTTR

数据酿造智慧,每一滴都是沉淀!
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 模板代码

    • 各类组件
    • 通用模板
  • 国产化&其他系统

    • Centos系列
    • Kylin系列
    • OpenEuler系列
    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 定制开发

    • 组件版本定制
    • 样式风格定制
  • 蓝图愿景
  • 技术支持
  • 合作共建
GitHub (opens new window)
  • 方法论

  • 代码生命周期-metainfo

    • 加载原理深度剖析[一]
    • 加载原理深度剖析[二]
    • 加载原理深度剖析[三]
    • 结构与层级深入解读
    • configFile详解[一]
    • configFile详解[二]
    • cardinality详解[一]
    • cardinality详解[二]
    • cardinality详解[三]
    • category详解[一]
    • category详解[二]
    • category详解[三]
    • theme详解[一]
    • theme详解[二]
    • theme详解[三]
    • commandScript详解[二]
    • commandScript详解[一]
    • commandScript详解[三]
      • 流程简述:21 步全链路解读
        • Java端流程(服务请求到任务调度)
      • Agent端流程(命令接收与执行)
        • 图示流程(可直接引用于技术文档)
        • 端到端流程小结
      • 4. 最佳实践与技巧 💡
        • 4.1 服务级别 vs 组件级别职责
        • 4.2 健康检查最佳实践
      • 5. 总结与延伸学习 🚀
        • 5.1 文章回顾
    • customCommand详解[一]
    • customCommand详解[二]
    • customCommand详解[三]
    • requiredServices详解[一]
    • requiredServices详解[二]
    • osSpecifics详解[一]
    • osSpecifics详解[二]
    • osSpecifics详解[三]
    • quicklinks详解[一]
    • quicklinks详解[二]
    • quicklinks详解[三]
    • quicklinks详解[四]
  • 架构剖析

  • UI样式

  • GOD-Ambari
  • 代码生命周期-metainfo
JaneTTR
2025-06-02
目录

commandScript详解[三]

# 流程简述:21 步全链路解读

# Java端流程(服务请求到任务调度)

Ambari Server 端将一次 service_check 请求,从 API 接入直至下发到调度与命令派发,整体可以分为如下21步。每一步均是核心处理节点:

步骤 方法名 操作 说明
1 ClusterService.getRequestHandler() 处理 service_check 请求 获取请求处理器,准备后续任务分发。
2 RequestService.createRequests() 创建请求对象 生成新的请求实例,表征一次服务检查请求。
3 BaseRequest.process() 处理请求 进入 CreateHandler.handleRequest(),开启处理流程。
4 CreateHandler.handleRequest() 创建并处理请求 生成请求后准备持久化。
5 BaseManagementHandler.persist() 持久化请求 调用 PersistenceManagerImpl.create(),保存请求到存储。
6 PersistenceManagerImpl.create() 持久化资源 数据入库,确保请求不会丢失。
7 ClusterControllerImpl.createResources() 创建资源 集群控制器根据请求内容准备所需资源。
8 RequestResourceProvider.createResources() 资源创建 执行实际的资源创建和调度。
9 AmbariManagementControllerImpl.createAction() 创建操作 生成操作计划并分配到各主机或组件。
10 RequestStageContainer.persist() 持久化阶段 保证各阶段任务持久、可追踪。
11 ActionManager.sendActions() 发送任务 写入数据库,待Agent领取。
12 ActionManager.persistActions() 持久化任务 任务落盘,便于失败恢复与重试。
13 Scheduler.awake() 唤醒调度器 调度器唤醒,准备分发任务。
14 Scheduler.doWork() 广播任务 向所有 Agent 广播新任务。
15 agentCommandsPublisher.sendAgentCommand() 发送命令 推送任务命令到 Agent。
16 STOMPUpdatePublisher.publish() 发布消息 通过 STOMP 协议下发到 Agent,服务端处理结束。

# Agent端流程(命令接收与执行)

Ambari Agent 端的执行链路,聚焦于命令的接收、解析、队列与最终执行:

步骤 方法名 操作 说明
17 CommandsEventListener.on_event() 接收处理命令 监听到 STOMP 下发的命令消息,准备处理。
18 ActionQueue.run() 运行任务队列 管理待执行任务队列,调度下一步命令。
19 ActionQueue.process_command() 处理命令 解析服务器端命令,做参数适配。
20 ActionQueue.execute_command() 执行命令 实际执行已解析的操作命令。
21 customServiceOrchestrator.runCommand() 完成操作 最终运行命令,传入输出文件和重试参数,确保日志与健壮性。

# 图示流程(可直接引用于技术文档)

Java端链路:

ClusterService.getRequestHandler()
↓
RequestService.createRequests()
↓
BaseRequest.process()
↓
CreateHandler.handleRequest()
↓
BaseManagementHandler.persist()
↓
PersistenceManagerImpl.create()
↓
ClusterControllerImpl.createResources()
↓
RequestResourceProvider.createResources()
↓
AmbariManagementControllerImpl.createAction()
↓
RequestStageContainer.persist()
↓
ActionManager.sendActions()
↓
ActionManager.persistActions()
↓
Scheduler.awake()
↓
Scheduler.doWork()
↓
agentCommandsPublisher.sendAgentCommand()
↓
STOMPUpdatePublisher.publish()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

Agent端链路:

CommandsEventListener.on_event()
↓
ActionQueue.run()
↓
ActionQueue.process_command()
↓
ActionQueue.execute_command()
↓
customServiceOrchestrator.runCommand()
1
2
3
4
5
6
7
8
9

# 端到端流程小结

一次 service_check 请求,在后端 API 被封装为请求对象,层层流转到请求队列并持久化,调度器激活并广播任务,经由 STOMP 下发到 Agent。 Agent 订阅到任务后,解包 JSON,适配参数,依次调度队列、处理并最终执行。执行过程中涉及输出文件生成、重试机制和执行日志归档,确保了分布式任务的可观测性与可靠性。

# 4. 最佳实践与技巧 💡

# 4.1 服务级别 vs 组件级别职责

  • 服务级别:负责全局生命周期和集群健康,比如健康检查、批量重启等,跨节点、跨组件、强协作。
  • 组件级别:聚焦单节点/单组件操作,如配置热更新、单节点进程控制等,粒度小、操作快速。

提示

健康检查这类全局行为必须归属于服务级别,而不是组件。

# 4.2 健康检查最佳实践

  1. 在 metainfo.xml 指定服务级 commandScript 健康检查属于服务级责任,脚本和超时配置应如下设置:

    <!-- Redis 服务健康检查 -->
    <commandScript>
      <script>scripts/service_check.py</script>
      <scriptType>PYTHON</scriptType>
      <timeout>300</timeout>
    </commandScript>
    
    1
    2
    3
    4
    5
    6
  2. 健康检查脚本规范 代码应逻辑分明,支持密码校验、可重试,易于维护:

    # coding=utf-8
    import time
    from resource_management.core.exceptions import Fail
    from resource_management.core.logger import Logger
    from resource_management.core.resources.system import Execute
    from resource_management.libraries.functions.format import format
    from resource_management.libraries.script.script import Script
    
    class RedisServiceCheck(Script):
        def service_check(self, env):
            """
            检查 Redis 集群健康,支持密码、重试等逻辑
            """
            import params
            env.set_params(params)
            redis_port = params.redis_port
            client_bin = params.client_bin
            redis_password = params.redis_password
            retries = 5
            retry_delay = 5
            self.check_redis_cluster(redis_port, client_bin, redis_password, retries, retry_delay)
    
    if __name__ == "__main__":
        RedisServiceCheck().execute()
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
  3. 健康检查执行链 实际运维中,Ambari 通过如下命令触发 service_check:

    /usr/bin/python /var/lib/ambari-agent/cache/stacks/BIGTOP/3.2.0/services/REDIS/package/scripts/redis_service_check.py SERVICE_CHECK ...
    
    1

    由 Agent 通过发布订阅异步执行,检测结果实时反馈到服务端。

  4. 健康检查设计原则

    • 健康检查是服务级责任,不应切分为组件级;
    • 推荐实现重试机制,增强健壮性;
    • 超时应合理设置,避免集群调度阻塞。

最佳实践流程图

# 5. 总结与延伸学习 🚀

# 5.1 文章回顾

本篇围绕 Redis 服务健康检查案例,梳理了服务级与组件级 commandScript 分工、实际代码实现,以及 Ambari 执行链路全流程。你已经掌握:

  • 服务级 vs 组件级如何分工与协作;
  • 健康检查如何实现、配置、调用和回调;
  • Ambari 如何端到端调度与执行脚本。

延伸阅读

#Ambari#运维自动化#Agent#commandScript#健康检查#流程图解
commandScript详解[一]
customCommand详解[一]

← commandScript详解[一] customCommand详解[一]→

最近更新
01
Pandoc 缺失导致 SparkR 构建失败
06-08
02
Cyrus SASL/GSASL 缺失解决
06-07
03
Hadoop_3.3.4 编译实战 1.0.0+
06-06
更多文章>
Theme by Vdoing | Copyright © 2017-2025 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式