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详解[一]
      • 1. Redis 集群 metainfo.xml 示例
      • 2. configFiles 的作用 📂
        • 2.1 配置后的效果 🎯
        • 2.2 配置作用域 🔍
        • 2.3 type 类型的选择 🎛️
        • 支持的类型与场景
        • 2.3.1 xml 适用场景 📄
        • 2.3.2 env 适用场景 🛠️
        • 2.3.3 properties 适用场景 ⚙️
    • configFile详解[二]
    • 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详解[一]

# 1. Redis 集群 metainfo.xml 示例

在 Ambari 自定义服务开发中,metainfo.xml 是组件描述的核心文件。下方给出 Redis 集群服务的完整 metainfo 结构,涵盖主节点、从节点与客户端,并通过 <configFiles> 指定了自动生成的配置文件类型。

<?xml version="1.0"?>
<metainfo>
    <schemaVersion>2.0</schemaVersion>
    <services>
        <service>
            <!-- Redis 集群服务的基本信息 -->
            <name>REDIS</name>
            <displayName>Redis</displayName>
            <comment>
                Component Redis Power By JaneTTR . mail: 3832514048@qq.com ,git: https://gitee.com/tt-bigdata/ambari-env
            </comment>
            <version>7.4.0</version>

            <!-- Redis 集群组件定义 -->
            <components>
                <!-- Redis 主节点组件 -->
                <component>
                    <name>REDIS_MASTER</name>
                    <displayName>Redis Master</displayName>
                    <category>MASTER</category>
                    <cardinality>3+</cardinality> <!-- Redis 集群至少需要 3 个主节点 -->
                    <versionAdvertised>true</versionAdvertised>
                    <commandScript>
                        <script>scripts/redis_master.py</script> <!-- Python 脚本 -->
                        <scriptType>PYTHON</scriptType>
                    </commandScript>
                </component>

                <!-- Redis 从节点组件 -->
                <component>
                    <name>REDIS_SLAVE</name>
                    <displayName>Redis Slave</displayName>
                    <category>SLAVE</category>
                    <cardinality>3+</cardinality> <!-- 从节点可以是 0 或多个 -->
                    <versionAdvertised>true</versionAdvertised>
                    <commandScript>
                        <script>scripts/redis_slave.py</script> <!-- Python 脚本 -->
                        <scriptType>PYTHON</scriptType>
                    </commandScript>
                </component>

                <!-- Redis 客户端组件 -->
                <component>
                    <name>REDIS_CLIENT</name>
                    <displayName>Redis Client</displayName>
                    <category>CLIENT</category>
                    <cardinality>0+</cardinality> <!-- 客户端是可选的,可以部署多个 -->
                    <versionAdvertised>true</versionAdvertised>
                    <commandScript>
                        <script>scripts/redis_client.py</script> <!-- Python 脚本 -->
                        <scriptType>PYTHON</scriptType>
                    </commandScript>
                    <configFiles>
                        <configFile>
                            <type>env</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>
                    </configFiles>
                </component>
            </components>

            <!-- 操作系统相关 -->
            <osSpecifics>
                <osSpecific>
                    <osFamily>any</osFamily> <!-- 支持任何操作系统 -->
                    <packages>
                        <package>
                            <name>redis_${stack_version}</name>
                        </package>
                    </packages>
                </osSpecific>
            </osSpecifics>

            <!-- Redis 服务健康检查 -->
            <commandScript>
                <script>scripts/service_check.py</script> <!-- 健康检查 Python 脚本 -->
                <scriptType>PYTHON</scriptType>
                <timeout>300</timeout>
            </commandScript>

            <!-- Redis 服务不依赖其他服务 -->
            <!-- 如果有其他依赖项,可以在这里定义 -->

            <!-- 配置依赖 -->
            <configuration-dependencies>
                <config-type>redis-site</config-type>
                <config-type>redis-env</config-type>
            </configuration-dependencies>
        </service>
    </services>
</metainfo>

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

重点说明

这里我们通过 <components> 明确划分 Redis 的三种节点类型。每个组件都指向不同的 Python 脚本,支持灵活扩展、独立升级和服务拆分。结构清晰

实际意义:这种结构让 Redis 在大数据平台环境下能够模块化集成,配合 Ambari 的 UI,可以图形化分配角色到各台主机,方便横向扩容或动态重构。

# 2. configFiles 的作用 📂

configFiles 节点,是客户端配置自动渲染的关键。通过它,Ambari 可以将配置数据字典,自动生成多种格式的配置文件,极大减轻人工维护压力。

  1. type 指定最终渲染的文件格式(如 xml、env、properties),确保生成的文件能被组件原生识别。
  2. fileName 指明生成文件的具体名称。文件命名灵活,可以直接复用主流大数据组件的配置文件标准。
  3. dictionaryName 绑定 Ambari 的配置包(config-type),这样通过 Ambari 前台或 API 配置的参数,都能同步到实际配置文件里。

image-20240927135924474

笔记

这种机制极大提高了集群运维的自动化和一致性。只要配好 metainfo,用户一键导出就能拿到当前环境的所有客户端配置,减少人为误操作风险。

# 2.1 配置后的效果 🎯

安装部署后,支持直接通过 API 批量导出客户端配置。 这一能力是 Ambari 面向企业集群的必备基础设施,尤其适用于大规模主机的统一运维。

image-20240927162442819

只需访问:

http://localhost:28080/api/v1/clusters/dev/services/REDIS/components/REDIS_CLIENT?format=client_config_tar
1

实用小贴士

下载包内含所有 configFiles 配置声明的文件,并同步了当前 Ambari 前端配置页面所有参数。

image-20240927163053018

# 2.2 配置作用域 🔍

很多开发者初次接触会疑惑:为何 configFiles 只在客户端生效?

其实,源码逻辑约定了只有 <component name="***_CLIENT"> 的节点会生成 client_config_tar 配置包。

  • 服务端节点(如 MASTER、SLAVE)不会独立生成 client tar,因为它们的配置通常由集群控制节点分发,或者仅由客户端用到。

image-20240927155826422

这种机制让配置的自动下发和客户端一致性得到极大保障。

源码侧结构如下:

@XmlElementWrapper(name = "configFiles")
@XmlElements(@XmlElement(name = "configFile"))
private List<ClientConfigFileDefinition> clientConfigFiles;
1
2
3

笔记

源码的这种定义,让 metainfo 的 <configFiles> 能一对一映射到真实配置文件,方便扩展。

# 2.3 type 类型的选择 🎛️

你配置的每一个 <configFile> 节点,最终都会实例化为 ClientConfigFileDefinition,并根据 type 渲染为对应格式。

image-20240927164227419

核心处理逻辑如下:

for (ClientConfigFileDefinition clientConfigFile : clientConfigFiles) {
  Map<String, String> fileDict = new HashMap<>();
  fileDict.put(clientConfigFile.getFileName(), clientConfigFile.getDictionaryName());
  if (clientConfigFile.getType().equals("xml")) {
    xmlConfigs.add(fileDict);
  } else if (clientConfigFile.getType().equals("env")) {
    envConfigs.add(fileDict);
  } else if (clientConfigFile.getType().equals("properties")) {
    propertiesConfigs.add(fileDict);
  }
}
1
2
3
4
5
6
7
8
9
10
11

# 支持的类型与场景

  • xml 用于标准 Hadoop、HBase 等 XML 配置
  • env 适用于 shell 环境变量、启动脚本
  • properties 典型 Java Properties 格式,常见于 Spark/Hive

image-20240928105657402

# 2.3.1 xml 适用场景 📄

如 Hadoop、HBase、Zookeeper、Redis 等组件的核心配置,Ambari 会将参数以标准 XML 形式渲染出来,完美兼容大多数大数据组件。

def generate_configs_get_xml_file_content(self, filename, dict):
    config = self.get_config()
    return {'configurations': config['configurations'][dict], 'configuration_attributes': config['configurationAttributes'][dict]}
1
2
3

渲染效果示例:

image-20240928145818577

# 2.3.2 env 适用场景 🛠️

适合环境变量、shell 脚本批量注入配置的场景,每个 key=value 单独成行。 常见于自定义启动参数、日志级别、动态端口等设置。

def generate_configs_get_template_file_content(self, filename, dicts):
    config = self.get_config()
    content = ''
    for dict in dicts.split(','):
        if dict.strip() in config['configurations']:
            try:
                content += config['configurations'][dict.strip()]['content']
            except Fail:
                pass
    return content
1
2
3
4
5
6
7
8
9
10

例如 Zookeeper 的 log4j 配置,只有设置了 content 字段才生成对应文件:

image-20240928145510123

# 2.3.3 properties 适用场景 ⚙️

标准的 Java Properties 格式。 适合 Spark、Hadoop、Hive 等自定义属性文件扩展,key=value 每行一条,方便脚本和进程读取。

def generate_configs_get_xml_file_dict(self, filename, dict):
    config = self.get_config()
    return config['configurations'][dict]
1
2
3

Spark 的配置即采用该方式:

image-20240928150028192

总结

通过 <configFiles>,Ambari 可为客户端组件自动渲染多类型配置文件,实现“一处配置,自动分发”,极大提升运维效率。 熟悉此机制,是玩转 Ambari 服务扩展的必备技能!

#Ambari#metainfo#配置解读#大数据运维#源码分析
结构与层级深入解读
configFile详解[二]

← 结构与层级深入解读 configFile详解[二]→

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