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详解[二]
      • 3. 逻辑梳理与总结 🎯
        • 3.1 请求的逻辑分析 💻
        • 3.2 getResourcesAuthorized 方法关键解读 🔍
        • 3.3 Python 命令执行及 commandScriptAbsolute 💾
        • 3.4 Python 脚本生成配置文件的逻辑 📂
        • 3.5 打包与下载 🗂️
        • 3.6 全流程小结 📝
    • cardinality详解[一]
    • cardinality详解[二]
    • cardinality详解[三]
    • category详解[一]
    • category详解[二]
    • category详解[三]
    • theme详解[一]
    • theme详解[二]
    • theme详解[三]
    • commandScript详解[二]
    • commandScript详解[一]
    • commandScript详解[三]
    • customCommand详解[一]
    • customCommand详解[二]
    • customCommand详解[三]
    • requiredServices详解[一]
    • requiredServices详解[二]
    • osSpecifics详解[一]
    • osSpecifics详解[二]
    • osSpecifics详解[三]
    • quicklinks详解[一]
    • quicklinks详解[二]
    • quicklinks详解[三]
    • quicklinks详解[四]
  • 架构剖析

  • UI样式

  • GOD-Ambari
  • 代码生命周期-metainfo
JaneTTR
2025-05-31
目录

configFile详解[二]

# 3. 逻辑梳理与总结 🎯

本节将系统梳理 Ambari 从发起配置导出请求、解析 metainfo 配置、到 Python 脚本生成与打包配置文件,最终返回 .tar.gz 包的全流程,帮助你真正理解 configFiles 到最终包下载的完整链路。

# 3.1 请求的逻辑分析 💻

在实际运维场景中,用户往往需要一键下载 Redis 客户端的全部配置文件,实现自动化环境配置和批量部署。典型请求如下:

GET http://<ambari-server>:8080/api/v1/clusters/<cluster_name>/services/REDIS/components/REDIS_CLIENT?format=client_config_tar
1

Ambari 接收到该请求后,流程进入 ComponentService.java 的 getComponent 方法:

/**
   * Handles GET: /clusters/{clusterID}/services/{serviceID}/components/{componentID}
   * Get a specific component.
   *
   * @param headers       http headers
   * @param ui            uri info
   * @param componentName component id
   * @return a component resource representation
   */
  @GET @ApiIgnore // until documented
  @Path("{componentName}")
  @Produces("text/plain")
  public Response getComponent(String body, @Context HttpHeaders headers, @Context UriInfo ui,
                               @PathParam("componentName") String componentName, @QueryParam("format") String format) {
    if (format != null && format.equals("client_config_tar")) {
      return createClientConfigResource(body, headers, ui, componentName);
    }

    return handleRequest(headers, body, ui, Request.Type.GET,
        createComponentResource(m_clusterName, m_serviceName, componentName));
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

当 format=client_config_tar 时,请求被精准分流到 createClientConfigResource,启动配置文件生成与打包流程。

请求分支与入口

# 3.2 getResourcesAuthorized 方法关键解读 🔍

核心逻辑由 getResourcesAuthorized 方法把控,负责:

  • 校验用户权限,确保下载安全合规;
  • 解析 metainfo.xml 的 <configFiles> 配置,明确本次应生成哪些格式的配置文件。

以 Redis 客户端为例,configFiles 配置如下:


<configFiles>
    <configFile>
        <type>xml</type>
        <fileName>redis-site.xml</fileName>
        <dictionaryName>redis-site</dictionaryName>
    </configFile>
    <configFile>
        <type>env</type>
        <fileName>redis-env.sh</fileName>
        <dictionaryName>redis-env</dictionaryName>
    </configFile>
    <configFile>
        <type>properties</type>
        <fileName>redis.properties</fileName>
        <dictionaryName>redis-properties</dictionaryName>
    </configFile>
</configFiles>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Ambari 会自动识别所有支持的类型,完成配置模板到真实文件的映射,保证多生态、多格式环境都能标准输出。

提示

这种类型映射机制,使得 metainfo 的结构配置与实际配置渲染高度解耦,方便后期定制与扩展。

# 3.3 Python 命令执行及 commandScriptAbsolute 💾

完成 metainfo 解析后,Ambari 会根据 <commandScript> 标签中的路径,调用对应的 Python 脚本完成后续操作:


<commandScript>
    <script>scripts/redis_client.py</script>
    <scriptType>PYTHON</scriptType>
</commandScript>
1
2
3
4
5

此路径会被参数 commandScriptAbsolute 解析成绝对路径并传递给执行引擎,确保组件的自动化流程灵活可控。

脚本与配置完全解耦,后续任何自定义类型、兼容性需求都能灵活支持。可扩展

# 3.4 Python 脚本生成配置文件的逻辑 📂

Ambari 在调度对应 Python 脚本后,核心逻辑集中在 generate_configs 方法。该方法根据传入的三类 configs_list(xml/env/properties),渲染并输出对应格式的配置文件:

脚本生成流程

  • xml_configs_list → 生成 XML 配置文件
  • env_configs_list → 生成 shell 环境变量配置
  • properties_configs_list → 生成 Java Properties 格式配置

所有文件生成后统一打包为 .tar.gz,便于批量分发和环境一致性。

笔记

这种通用方案极大提升了组件的复用性,也为后续定制化模板渲染打下基础。

# 3.5 打包与下载 🗂️

配置文件全部生成后,Ambari 会统一进行打包并响应返回。打包和下载动作由 ComponentService.java 的 createClientConfigResource 实现:

private Response createClientConfigResource(String body, HttpHeaders headers, UriInfo ui, String componentName) {
    String fileName = filePrefixName + "-configs" + Configuration.DEF_ARCHIVE_EXTENSION;
    Response response = handleRequest(headers, body, ui, Request.Type.GET, createResource(Resource.Type.ClientConfig, mapIds));
    if (response.getStatus() != 200) return response;
    Response.ResponseBuilder rb = Response.status(Response.Status.OK);
    String tmpDir = new Configuration().getProperty(Configuration.SERVER_TMP_DIR.getKey());
    File file = new File(tmpDir, fileName);
    InputStream resultInputStream = new FileInputStream(file);
    String contentType = Configuration.DEF_ARCHIVE_CONTENT_TYPE;
    rb.header("Content-Disposition",  "attachment; filename=\"" + fileName + "\"");
    rb.entity(resultInputStream);
    return rb.type(contentType).build();
}
1
2
3
4
5
6
7
8
9
10
11
12
13

打包下载流程

注意

生产实践中,请确保 metainfo 配置、Python 脚本和包目录始终同步,否则可能造成包内容不全或下载失败。

# 3.6 全流程小结 📝

综合梳理,Ambari 的配置文件导出和分发流程完整、严密,支持多场景扩展。其闭环逻辑如下:

  1. 发起 HTTP 请求 —— 用户一键下载客户端配置包,触发全流程。
  2. Java 层分流入口 —— format=client_config_tar 精确匹配,路由到专属处理逻辑。
  3. 权限检查与 metainfo 解析 —— 校验安全、解析 configFiles,决定生成文件类型和名称。
  4. 脚本路径解析与调度 —— 依据 commandScript 路径,定位 Python 脚本并执行。
  5. 配置文件多类型渲染 —— 脚本按 metainfo 配置自动生成 xml/env/properties 等多种格式文件。
  6. 文件打包并响应下载 —— 统一打包为 .tar.gz,HTTP 方式返回,保证环境批量一致性和运维效率。

提示

这一机制让大数据平台的环境批量初始化、配置一致性和跨团队运维标准化变得极为高效,是 Ambari 体系不可或缺的自动化利器。

#Ambari#metainfo#配置自动化#源码解析#运维工具
configFile详解[一]
cardinality详解[一]

← configFile详解[一] cardinality详解[一]→

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