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详解[三]
    • customCommand详解[一]
    • customCommand详解[二]
    • customCommand详解[三]
    • requiredServices详解[一]
    • requiredServices详解[二]
    • osSpecifics详解[一]
      • 1. 引言与问题概述 🎯
        • 1.1 背景介绍
        • 1.2 目标
      • 2. 核心概念解析 🧠
      • 3. 实操与代码解析 🔧
        • 3.1 具体操作步骤
        • 3.1.1 操作思路
        • 3.1.2 核心点剖析
        • 3.1.3 方法追踪
        • 3.2 上下文分析与请求逻辑
        • 3.2.1 上下文作用关系
        • 3.2.2 ClientConfigResourceProvider 方法定位
        • 3.2.2.1 定位 Resources 类型
        • 3.2.2.2 定位 Resource.Type
    • osSpecifics详解[二]
    • osSpecifics详解[三]
    • quicklinks详解[一]
    • quicklinks详解[二]
    • quicklinks详解[三]
    • quicklinks详解[四]
  • 架构剖析

  • UI样式

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

osSpecifics详解[一]

# 1. 引言与问题概述 🎯

# 1.1 背景介绍

在前面的章节,我们已经细致讲解了 metainfo 文件的结构与关键要素,包括服务部署、组件描述、配置关系等内容。而本节要聚焦的是其中至关重要的 osSpecific 部分。

举个典型例子:

  • hadoop01 运行 CentOS,hadoop02 运行 Ubuntu
  • 部署 Kafka 服务时,osSpecific 能让 Ambari 自动分配 kafka_${stack_version}.rpm (CentOS)或 kafka-${stack_version}.deb(Ubuntu)
  • 保证无论操作系统如何组合,部署始终精准无误

# 1.2 目标

本节主要围绕三个方向展开,让你掌握 osSpecific 的全流程能力:

目标 重点解析
动态包选择机制 Ambari 如何自动感知主机 OS 并分配正确的软件包?
代码推导与实现解析 如何通过源码追踪,锁定 osSpecific 的入口与调度逻辑?
应用场景分析 多 OS 集群实际部署/升级/配置场景下,osSpecific 的动态适配如何落地?

提示

同时,还会结合实际代码推导方法,总结一套通用的“源码定位-实现追踪”技巧,不仅适用于 osSpecific,也适用于你后续深挖其它功能点。

# 2. 核心概念解析 🧠

在详细讲解前,建议先回顾《Ambari实战-044-架构剖析-java 请求过程解读》和《045-架构剖析-java 请求过程泛化及补充》这两章内容。

这能帮助你更好地理解请求框架和 Provider 机制强烈推荐 。

核心知识回顾:

  • Provider 的作用 Provider 是 Ambari 的业务逻辑层,负责资源的 CRUD 操作,几乎所有服务管理请求都要经过这里。

  • 资源与方法的绑定 如何通过 Resource.Type 定位到对应的 REST 方法?osSpecific 与资源类型的关系如何影响包选择?

  • 请求与资源映射 为什么 REST 请求通过 Resource.Type 能自动找到目标服务?这种设计在 Ambari 架构下有多重要?

# 3. 实操与代码解析 🔧

# 3.1 具体操作步骤

# 3.1.1 操作思路

我们通常先从 metainfo 里的 osSpecific 配置切入,倒查源码的关键入口。之前分析过 Ambari 各模块继承体系,尤其是 BaseModule 作为基础父类,几乎所有核心模块都继承自它:

继承关系 作用
ComponentModule 组件相关配置管理
ConfigurationModule 配置模块管理
ExtensionModule 扩展模块管理
QuickLinksConfigurationModule 快捷链接配置管理
ServiceModule 服务相关配置管理
StackModule 栈版本管理
ThemeModule 主题配置管理

BaseModule 类继承体系

提示

定位技巧:遇到 metainfo 相关的功能实现,优先搜索 BaseModule 或其子类。

代码片段:BaseModule 类定义

/
 * 泛型说明:T 代表模块本身,I 代表模块相关的 Info
 */
public class AModule extends BaseModule<AModule, AInfo> implements Validable {
}
1
2
3
4
5

# 3.1.2 核心点剖析

  • Info 类的作用 用于承载 metainfo.xml 结构化信息。比如 ServiceInfo 存储服务的元数据。

ServiceInfo示意

  • getOsSpecifics() 方法剖析 BaseModule 里,getOsSpecifics() 返回与操作系统相关的包描述 map。
核心方法

方法定义如下:

public Map<String, ServiceOsSpecific> getOsSpecifics() {
    // 返回与系统相关的具体配置信息
}
1
2
3

# 3.1.3 方法追踪

搜索 getOsSpecifics(),你会发现它主要在以下场景被调用:

场景 类/模块
权限管理 Provider
服务管理 服务相关模块

getOsSpecifics 方法追踪


# 3.2 上下文分析与请求逻辑

# 3.2.1 上下文作用关系

你可以把 Provider 理解为 Java 三层架构里的 Service 层,是连接前端请求与底层模块的中枢。各 Module 则类似 DTO 数据对象,主要负责信息存储和方法暴露。

提示

这种三层职责分明的设计,使得 metainfo 解析和包筛选逻辑非常清晰,后续维护也更容易。


# 3.2.2 ClientConfigResourceProvider 方法定位

# 3.2.2.1 定位 Resources 类型

以 ClientConfigResourceProvider 为例,搜索 getOsSpecifics(),关键代码如下:

   @Override
  public Set<Resource> getResourcesAuthorized(Request request, Predicate predicate)
          throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
      	
        // 此处定位到了 getOsSpecifics() 方法
        // Write down os specific info for the service
        ServiceOsSpecific anyOs = null;
        if (serviceInfo.getOsSpecifics().containsKey(AmbariMetaInfo.ANY_OS)) {
          anyOs = serviceInfo.getOsSpecifics().get(AmbariMetaInfo.ANY_OS);
        }
        ServiceOsSpecific hostOs = populateServicePackagesInfo(serviceInfo, osFamily);
        // Build package list that is relevant for host  
    return resources;
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 3.2.2.2 定位 Resource.Type

Provider 作为业务逻辑层,与 Resource.Type 紧密结合,支撑 RESTful 资源的操作映射。

Provider 角色与资源关系

资源类型 映射目标
Resource.Type.ClientConfig 映射到 ClientConfig 资源
#Ambari#metainfo.xml#osSpecifics#多操作系统适配#源码解析#包选择机制
requiredServices详解[二]
osSpecifics详解[二]

← requiredServices详解[二] osSpecifics详解[二]→

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