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

  • 架构剖析

    • server与agent协作详解[一]
    • server与agent协作详解[二]
    • ambari install逻辑详解[一]
      • 1. 引言与问题概述 🎯
        • 1.1 背景介绍
        • 1.2 目标
      • 2. 核心概念解析 🧠
        • 2.1 组件入口
        • 2.2 调用入口(Server-Agent 双流程)
        • 2.3 self.install_packages(env) 与自定义 Hook
      • 3. 实操与代码解析 🔧
        • 3.1 具体操作步骤
        • 3.1.1 调用入口命令
        • 3.1.1.1 改造 PythonExecutor.py
        • 3.2 代码详解
        • 3.2.1 执行命令入口
        • 3.2.1.1 py文件的 __main__
    • ambari install逻辑详解[二]
    • ambari install逻辑详解[三]
    • stack-hooks逻辑详解[一]
    • stack-hooks逻辑详解[二]
    • distro-select逻辑详解
    • java 请求过程解读[一]
    • java 请求过程解读[二]
    • java 请求过程解读[三]
    • java 请求过程泛化及补充[一]
    • java 请求过程泛化及补充[二]
  • UI样式

  • GOD-Ambari
  • 架构剖析
JaneTTR
2025-06-02
目录

ambari install逻辑详解[一]

# 1. 引言与问题概述 🎯

# 1.1 背景介绍

提示

Ambari 在大数据集群管理领域的最大价值,就是简化和统一运维体验,让组件安装和运维变得高度自动化。

但你每次在 Ambari UI 上点击“安装”按钮时,其实背后发生的是一整条分层协作的自动化链路:

  • 前端 UI 捕获用户请求,传递给后端;
  • 后端服务解析配置文件(如 metainfo.xml、themes.json),调度实际的安装、初始化和配置任务;
  • 自动触发多个脚本,完成组件部署;
  • 全流程有实时反馈机制,你可以监控每一步的执行进度。

笔记

这些环节不仅体现了 Ambari 各模块的协同,还为后续二次开发、自动化扩展打下了坚实的技术底座。

理解每一个环节,能够让你真正吃透 Ambari 的安装原理,为定制开发和组件扩展打好基础。

提示

建议在阅读本节前,先熟悉 Ambari 的 metainfo.xml 结构,或者参考相关基础资料。

# 1.2 目标

提示

本节帮助你实现三大能力提升:

  • 理清安装流程全生命周期 还原用户点击“安装”后,从初始化到部署、启动、监控的每个关键环节。
  • 掌握 hook 封装机制 明白如何通过 hook 在各节点插入自定义逻辑,实现灵活扩展和流程自控。
  • 支撑企业级二开需求 学会基于 Ambari 框架安全地定制组件部署,提高运维灵活性与可控性。

# 2. 核心概念解析 🧠

# 2.1 组件入口

提示

元数据驱动,一切皆配置。

  • 每个组件都通过 metainfo.xml 定义自己的入口脚本、安装、启动、停止等行为。
  • 例如 Kafka 组件: metainfo.xml 中 kafka_broker 指向 kafka_broker.py,一旦 UI 触发安装,Ambari 自动调用该脚本方法完成操作。

笔记

这种模式确保了界面操作与后端脚本强绑定,不同组件都能灵活定制自己的安装逻辑。

# 2.2 调用入口(Server-Agent 双流程)

Ambari 的“安装”流程分为两大核心链路:

提示

ambari-server 端

  • 接收 UI 安装请求。
  • 根据集群配置生成详细指令集(环境、依赖、安装步骤)。
  • 网络下发指令至各主机的 agent。

提示

ambari-agent 端

  • 解析收到的指令集。
  • 启动子进程,调用组件脚本(如 kafka_broker.py),执行 install 方法。
  • 保证所有节点动作一致、流程可扩展。

# 2.3 self.install_packages(env) 与自定义 Hook

提示

self.install_packages(env) 是自动依赖安装的核心入口,但企业实战往往要插入自己的前后逻辑。

Ambari 提供**pre_ / post_ Hook 机制**,你可以:

  • 实现 pre_install,在安装前自动检查环境、准备依赖。
  • 实现 post_install,在安装后做日志清理、环境设置、服务健康自检等。

笔记

通过 hook,你可轻松为组件插入个性化前后处理,真正实现高度灵活的自动化安装。

# 3. 实操与代码解析 🔧

# 3.1 具体操作步骤

# 3.1.1 调用入口命令

在开始解析如何具体执行组件安装之前,我们需要了解调用入口和流程。

# 3.1.1.1 改造 PythonExecutor.py

我们已经介绍了如何通过 Ambari Server 与 Agent 进行通信。在这里,我们的目标是对 PythonExecutor.py 进行改造,以便记录实际的执行命令。这有助于更好地理解 Ambari 在安装和管理组件时的工作原理。

image-20241025150517566

def python_command(self, script, script_params):
    """
    :type script str
    :type script_params list|set
    """
    python_command = [sys.executable, script] + script_params
    # 加入了命令
    self.logger.info("========== Executing Python command: %s", ' '.join(python_command))
    return python_command
1
2
3
4
5
6
7
8
9

如上所示,我们在 python_command 方法中添加了一行日志。这会记录下每次执行的 Python 命令,帮助我们实时监控和调试。

image-20241025150136326

通过这段代码,我们能够看到最终生成并执行的命令。例如:

/usr/bin/python \
/var/lib/ambari-agent/cache/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/kafka_broker.py \
INSTALL \
/var/lib/ambari-agent/data/command-405.json \
/var/lib/ambari-agent/cache/stacks/BIGTOP/3.2.0/services/KAFKA/package \
/var/lib/ambari-agent/data/structured-out-405.json \
INFO \
/var/lib/ambari-agent/tmp \
PROTOCOL_TLSv1_2 
1
2
3
4
5
6
7
8
9

这样,我们清楚地知道 Ambari Agent 是如何调用组件的脚本进行安装或管理操作的。

# 3.2 代码详解

在了解了整体的入口之后,让我们深入解析代码中关键的执行和安装流程。

# 3.2.1 执行命令入口

每个组件的安装、启动等操作,都是通过执行特定的 Python 脚本来实现的。

# 3.2.1.1 py文件的 __main__

以 KafkaBroker 为例,这个组件的执行脚本通过 __main__ 函数作为入口:

if __name__ == "__main__":
    KafkaBroker().execute()
1
2

所有组件类(如 KafkaBroker)都继承自 Script 类。因此,execute() 方法是启动一切的关键:

  def execute(self):
    """
    Sets up logging;
    Parses command parameters and executes method relevant to command type
    """
    # ... 省略部分代码 ...

    self.command_name = str.lower(sys.argv[1])
    self.command_data_file = sys.argv[2]
    self.basedir = sys.argv[3]
    self.stroutfile = sys.argv[4]

    # 加载并解析 JSON 命令文件
    with open(self.command_data_file) as f:
        Script.config = ConfigDictionary(json.load(f))

    # 根据 command_name 动态选择方法执行
    method = self.choose_method_to_execute(self.command_name)
    with Environment(self.basedir, tmp_dir=Script.tmp_dir) as env:
        env.config.download_path = Script.tmp_dir

        # 执行前置方法 (pre)
        self.execute_prefix_function(self.command_name, 'pre', env)

        # 执行实际的任务方法
        method(env)

        # 执行后置方法 (post)
        self.execute_prefix_function(self.command_name, 'post', env)
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

通过这种方式,Ambari 会根据 INSTALL、START、STOP 等命令名称调用对应的 Python 函数进行操作。

#Ambari#metainfo.xml#安装流程#hook机制#组件自定义#运维自动化
server与agent协作详解[二]
ambari install逻辑详解[二]

← server与agent协作详解[二] ambari install逻辑详解[二]→

最近更新
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
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式