0%

Ambari 中 metainfo.xml 文件解析

本文主要解析 Ambari 服务组件的 metainfo.xml 元素信息具体含义,并以 ZooKeeper 的 metainfo.xml 给出具体分析。

简介

Ambari 中服务的 metainfo.xml 信息至关重要,关乎着服务的发现、安装、依赖、配置等信息。Ambari 定义 HDFS、ZooKeeper 等为 服务(service),定义服务中的角色比如 NameNode、DataNode、ZooKeeper Server、ZooKeeper Client等为组件(component)。

metainfo 元素解析

根元素

描述服务的根元素。

元素 描述 样例
name 服务名称。在包含该服务的堆栈定义中包含的所有服务中,名称必须是惟一的。 ZOOKEEPER
displayName 服务的显示名称。“添加服务”时的“服务”列显示信息。 ZooKeeper
version 服务的版本。名称和版本一起唯一地标识服务。“添加服务”时的“版本”列显示信息。 3.4.6
components 该服务的组件列表
osSpecifics 在特定于操作系统中的服务的包信息
commandScript 定义服务级别命令。该命令在客户端的组件实例上执行
comment 描述服务的简短描述。“添加服务”时的“描述”列显示信息。 提供高可靠分布式协调的统一服务。
requiredServices 集群中应该提供的其它服务(依赖组件)
configuration-dependencies 配置文件
restartRequiredAfterRackChange 更改配置后是否重启服务。当设置为true时,更改配置后,会出现黄色重启提示条。
configuration-dir 如果没有“configuration”,则使用此选项指定一个不同的配置目录

service/components

服务包含多个组件。与组件相关联的字段有:

元素 描述 样例
name 组件名称 ZOOKEEPER_SERVER
displayName 组件的显示名称,在“概要”——“组件”中显示的名称。 ZooKeeper Server
category 组件的类型——Master、SLAVE、CLIENT MASTER
commandScript 定义应用程序范围的命令。该命令在客户端的组件实例上执行
cardinality 实例数 MASTER:1-2,Slave:1+
reassignAllowed 件是否可以被重新分配/移动到不同的主机。 true / false
customCommands 除了标准命令外,一组与组件关联的自定义命令。

service/osSpecifics

操作系统特定的软件包名称(rpm或deb软件包)

元素 描述 样例
osFamily 适用该包的操作系统系列 any
packages 部署服务所需的包的列表
package/name 包的名称

service/commandScript

服务命令脚本

元素 描述 样例
script 脚本的相对路径
scriptType 脚本的类型,目前唯一支持的类型是PYTHON
timeout 命令的自定义超时——这将取代Ambari默认值

service/component/dependencies/dependency

元素 描述 样例
name 它所依赖的组件的名称
scope 集群/主机。指定从属组件是否应该出现在同一集群或同一主机中。
auto-deploy 命令的自定义超时——这将取代Ambari默认值
conditions 存在这种依赖关系的条件。例如,存在配置中的属性。

service/component/logs

提供日志搜索集成。

元素 描述 样例
logId 组件的logid <log> <logId>hdfs_namenode</logId> <primary>true</primary> </log>
primary 是否有主日志id。

service/component/customCommand

可以将自定义命令添加到组件中。

元素 描述 样例
name 自定义命令的名称
commandScript 实现自定义命令的脚本的详细信息
commandScript/script 脚本的相对路径
commandScript/scriptType 脚本的类型,目前唯一支持的类型是PYTHON
commandScript/timeout 命令的自定义超时——这将取代Ambari默认值

ZooKeeper metainfo 解析

下面以 ZooKeeper 的 metainfo.xml 为例进行解析

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
<?xml version="1.0"?>

<metainfo>
<schemaVersion>2.0</schemaVersion>
<services>
<service>
<!-- 服务名称。在包含该服务的堆栈定义中包含的所有服务中,名称必须是惟一的。-->
<name>ZOOKEEPER</name>

<!-- 服务的显示名称。“添加服务”时的“服务”列显示信息。-->
<displayName>ZooKeeper</displayName>

<!-- 描述服务的简短描述。“添加服务”时的“描述”列显示信息。-->
<comment>提供高可靠分布式协调的统一服务。</comment>

<!-- 服务的版本。名称和版本一起唯一地标识服务。“添加服务”时的“版本”列显示信息。-->
<version>3.4.6</version>

<!-- 该服务包含的组件列表,在 Ambari 中,定义 ZooKeeper 是服务,ZooKeeper Server 和 ZooKeeper Client 是组件。-->
<components>

<component>
<!-- 组件名称 -->
<name>ZOOKEEPER_SERVER</name>

<!-- 组件的显示名称,在“概要”——“组件”中显示的名称 -->
<displayName>ZooKeeper Server</displayName>

<!-- 组件的类型——Mster、SLAVE、CLIENT-->
<category>MASTER</category>

<!-- 实例数-->
<cardinality>1+</cardinality>

<!-- 依赖的组件 -->
<dependencies>
<dependency>

<!-- ZooKeeper Server 依赖 ZooKeeper 的 ZooKeeper client -->
<name>ZOOKEEPER/ZOOKEEPER_CLIENT</name>

<!-- 同主机依赖,即在 ZooKeeper Server 所在的主机上必须有 ZooKeeper client。-->
<!-- 即使在安装 ZooKeeper 时某个节点只勾选 ZooKeeper server 而不勾选 ZooKeeper client,实际安装时也会在该节点安装 zk client-->
<scope>host</scope>
<auto-deploy>
<enable>true</enable>
</auto-deploy>
</dependency>
</dependencies>

<!-- 在滚动升级时使用其他版本 -->
<versionAdvertised>true</versionAdvertised>

<!-- 支持滚动重启 -->
<rollingRestartSupported>true</rollingRestartSupported>
<commandScript>

<!-- 脚本相对路径-->
<script>scripts/zookeeper_server.py</script>

<!-- 脚本的类型,目前唯一支持的类型是PYTHON -->
<scriptType>PYTHON</scriptType>

<!-- 命令的自定义超时时间——这将取代Ambari默认值-->
<timeout>1200</timeout>
</commandScript>

<logs>
<log>

<!-- 组件的 logid -->
<logId>zookeeper</logId>

<!-- 是否有主日志id。-->
<primary>true</primary>
</log>
</logs>
</component>

<component>
<name>ZOOKEEPER_CLIENT</name>
<displayName>ZooKeeper Client</displayName>
<category>CLIENT</category>
<cardinality>1+</cardinality>
<versionAdvertised>true</versionAdvertised>
<commandScript>
<script>scripts/zookeeper_client.py</script>
<scriptType>PYTHON</scriptType>
</commandScript>
<configFiles>
<configFile>
<!--要生成的文件类型,xml或env sh、yaml等-->
<type>env</type>

<!-- 生成的文件的名称-->
<fileName>zookeeper-env.sh</fileName>

<!-- 包含配置属性的数据字典-->
<dictionaryName>zookeeper-env</dictionaryName>
</configFile>
<configFile>
<type>env</type>
<fileName>log4j.properties</fileName>
<dictionaryName>zookeeper-log4j</dictionaryName>
</configFile>
</configFiles>
</component>
</components>

<!-- 适用的系统版本,如果需要适配其他系统,可在此添加,或直接写成 any -->
<osSpecifics>
<osSpecific>
<osFamily>amazonlinux2,redhat6,redhat7,suse11,suse12</osFamily>
<packages>

<!-- 安装包包名,即 yum search 时要找到的包,yum 安装时会根据这里的信息找安装包,如果安装包固定,可以直接写固定值-->
<package>
<name>zookeeper_${stack_version}</name>
</package>
<package>
<name>zookeeper_${stack_version}-server</name>
</package>
</packages>
</osSpecific>
<osSpecific>
<osFamily>debian7,debian9,ubuntu12,ubuntu14,ubuntu16</osFamily>
<packages>
<package>
<name>zookeeper-${stack_version}</name>
</package>
<package>
<name>zookeeper-${stack_version}-server</name>
</package>
</packages>
</osSpecific>
</osSpecifics>

<!-- 服务校验脚本 -->
<commandScript>
<script>scripts/service_check.py</script>
<scriptType>PYTHON</scriptType>
<timeout>300</timeout>
</commandScript>

<!-- 依赖的配置文件,所有用到的配置文件都要在这里列出,且文件名需保持一致 -->
<configuration-dependencies>
<config-type>zookeeper-log4j</config-type>
<config-type>zookeeper-env</config-type>
<config-type>zoo.cfg</config-type>
</configuration-dependencies>

<!-- 更改配置后是否重启服务。当设置为 true 时,更改配置后,会出现黄色重启服务提示条。-->
<restartRequiredAfterChange>true</restartRequiredAfterChange>

<themes>
<theme>
<fileName>directories.json</fileName>
<default>true</default>
</theme>
</themes>

</service>
</services>
</metainfo>

修改 metainfo

源码中服务的 metainfo 文件类似于
ambari-server\src\main\resources\stacks\HDP\3.0\services\ZOOKEEPER\metainfo.xml 这样的路径中,如果存在继承关系,则会放在类似于 ambari-server\src\main\resources\common-services\ZOOKEEPER\3.4.6\metainfo.xml 这样的路径中。

安装后集群后,metainfo 文件在
/var/lib/ambari-server/resources/stacks/HDP/3.0/services/ZOOKEEPER/metainfo.xml/var/lib/ambari-server/resources/common-services/ZOOKEEPER/3.4.6/metainfo.xml

在安装后的集群中修改 metainfo.xml 后必须重启 ambari server 才能生效,因为只有在 ambari server 启动时才会加载 resources 目录下相关信息。

参考资料