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>
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 可以将配置数据字典,自动生成多种格式的配置文件,极大减轻人工维护压力。
type
指定最终渲染的文件格式(如xml
、env
、properties
),确保生成的文件能被组件原生识别。fileName
指明生成文件的具体名称。文件命名灵活,可以直接复用主流大数据组件的配置文件标准。dictionaryName
绑定 Ambari 的配置包(config-type),这样通过 Ambari 前台或 API 配置的参数,都能同步到实际配置文件里。
笔记
这种机制极大提高了集群运维的自动化和一致性。只要配好 metainfo,用户一键导出就能拿到当前环境的所有客户端配置,减少人为误操作风险。
# 2.1 配置后的效果 🎯
安装部署后,支持直接通过 API 批量导出客户端配置。 这一能力是 Ambari 面向企业集群的必备基础设施,尤其适用于大规模主机的统一运维。
只需访问:
http://localhost:28080/api/v1/clusters/dev/services/REDIS/components/REDIS_CLIENT?format=client_config_tar
实用小贴士
下载包内含所有 configFiles 配置声明的文件,并同步了当前 Ambari 前端配置页面所有参数。
# 2.2 配置作用域 🔍
很多开发者初次接触会疑惑:为何 configFiles 只在客户端生效?
其实,源码逻辑约定了只有 <component name="***_CLIENT">
的节点会生成 client_config_tar 配置包。
- 服务端节点(如 MASTER、SLAVE)不会独立生成 client tar,因为它们的配置通常由集群控制节点分发,或者仅由客户端用到。
这种机制让配置的自动下发和客户端一致性得到极大保障。
源码侧结构如下:
@XmlElementWrapper(name = "configFiles")
@XmlElements(@XmlElement(name = "configFile"))
private List<ClientConfigFileDefinition> clientConfigFiles;
2
3
笔记
源码的这种定义,让 metainfo 的 <configFiles>
能一对一映射到真实配置文件,方便扩展。
# 2.3 type
类型的选择 🎛️
你配置的每一个 <configFile>
节点,最终都会实例化为 ClientConfigFileDefinition
,并根据 type
渲染为对应格式。
核心处理逻辑如下:
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);
}
}
2
3
4
5
6
7
8
9
10
11
# 支持的类型与场景
- xml 用于标准 Hadoop、HBase 等 XML 配置
- env 适用于 shell 环境变量、启动脚本
- properties 典型 Java Properties 格式,常见于 Spark/Hive
# 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]}
2
3
渲染效果示例:
# 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
2
3
4
5
6
7
8
9
10
例如 Zookeeper 的 log4j 配置,只有设置了 content
字段才生成对应文件:
# 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]
2
3
Spark 的配置即采用该方式:
总结
通过 <configFiles>
,Ambari 可为客户端组件自动渲染多类型配置文件,实现“一处配置,自动分发”,极大提升运维效率。
熟悉此机制,是玩转 Ambari 服务扩展的必备技能!