Ambari自定义服务开发-自定义服务配置文件生成
[toc]
在Ambari WebUI中配置的参数可以通过三种方式生成服务的真实配置文件。
- 创建模板文件
- 配置文件全部内容在Ambari WebUI中展示修改配置
- 通过Ambari WebUI配置Custom XX实现参数新增
# 方法一:创建模板文件
默认读取模板目录为package/templates
我们在templates目录下创建模板文件test-common.conf.j2
模板文件,内容如下
{ {doris_user}} - test - version:{ {version}} - { {doris_pid_dir}}
- { {doris_user}} 获取
params.py
中的doris_user变量doris_user = config['configurations']['doris-env']['doris_user']
- { {version}} 获取
params.py
中的version变量version = default("/commandParams/version", "3.1.5.0-152")
- { {doris_pid_dir}}获取
params.py
中的doris_pid_dir变量doris_pid_dir = config['configurations']['doris-env']['doris_pid_dir'].rstrip("/")
- 这个值通过WebUI中doris-env配置文件配置的
# 生成方法
tip:一般生成配置文件都是在configure()方法中创建,start() 中调用 configure() 方法
File(format("{doris_fe_conf_base_dir}/fe2.conf"),
owner=params.doris_user,
group=params.user_group,
content=Template('fe.conf.j2')
)
2
3
4
5
Template():会把fe.conf.j2
文件中{ {xxx}}
引用的内容转换为params.py
获取到的值
# 方法二:配置文件全部内容在Ambari WebUI中展示修改配置
第一种方法我们可以预设很多配置参数,但是如果遇到我们没有预设,需要新增的情况就不支持,这时我们第二种方法就可以支持(当然第三种也支持,下面会详细介绍)
这里我们用doris的fe的配置文件fe.conf
来举例,fe.conf
配置项比较多不可能全部都提取出来,这时我们将配置文件当成参数放到configuration/fe.xml
中,就可以自定义配置修改参数了。
configuration.xml
配置文件内容为:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>CUR_DATE</name>
<display-name>CUR_DATE</display-name>
<value>`date +%Y%m%d-%H%M%S`</value>
<description></description>
</property>
<property>
<name>LOG_DIR</name>
<display-name>LOG_DIR</display-name>
<value>/var/log/doris</value>
<description></description>
</property>
<property>
<name>JAVA_OPTS</name>
<display-name>JAVA_OPTS</display-name>
<value>"-Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$DORIS_HOME/log/fe.gc.log.$CUR_DATE"</value>
<description></description>
</property>
<property>
<name>JAVA_OPTS_FOR_JDK_9</name>
<display-name>JAVA_OPTS_FOR_JDK_9</display-name>
<value>"-Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:$DORIS_HOME/log/fe.gc.log.$CUR_DATE:time"</value>
<description></description>
</property>
<property>
<name>sys_log_level</name>
<display-name>sys_log_level</display-name>
<value>INFO</value>
<description></description>
</property>
<property>
<name>sys_log_mode</name>
<display-name>sys_log_mode</display-name>
<value>NORMAL</value>
<description></description>
</property>
<property>
<name>meta_dir</name>
<display-name>meta_dir</display-name>
<value>/data/doris-meta</value>
<description></description>
</property>
<property>
<name>http_port</name>
<display-name>http_port</display-name>
<value>8030</value>
<description></description>
</property>
<property>
<name>rpc_port</name>
<display-name>rpc_port</display-name>
<value>9020</value>
<description></description>
</property>
<property>
<name>query_port</name>
<display-name>query_port</display-name>
<value>9030</value>
<description></description>
</property>
<property>
<name>edit_log_port</name>
<display-name>edit_log_port</display-name>
<value>9010</value>
<description></description>
</property>
<property>
<name>content</name>
<display-name>Doris config file template</display-name>
<value-attributes>
<!-- 默认为input输入框,当type为content时,即为文本框 -->
<type>content</type>
<!-- 是否显示配置名称 -->
<show-property-name>false</show-property-name>
</value-attributes>
<description>This is the template for fe.conf file</description>
<value>
# Jast
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#####################################################################
## The uppercase properties are read and exported by bin/start_fe.sh.
## To see all Frontend configurations,
## see fe/src/org/apache/doris/common/Config.java
#####################################################################
CUR_DATE={ {CUR_DATE}}
# the output dir of stderr and stdout
LOG_DIR ={ {LOG_DIR}}
JAVA_OPTS={ {JAVA_OPTS}}
# For jdk 9+, this JAVA_OPTS will be used as default JVM options
JAVA_OPTS_FOR_JDK_9={ {JAVA_OPTS_FOR_JDK_9}}
##
## the lowercase properties are read by main program.
##
# INFO, WARN, ERROR, FATAL
sys_log_level = { {sys_log_level}}
# NORMAL, BRIEF, ASYNC
sys_log_mode = { {sys_log_mode}}
# store metadata, must be created before start FE.
# Default value is ${DORIS_HOME}/doris-meta
meta_dir = { {meta_dir}}
# Default dirs to put jdbc drivers,default value is ${DORIS_HOME}/jdbc_drivers
# jdbc_drivers_dir = ${DORIS_HOME}/jdbc_drivers
http_port = { {http_port}}
rpc_port = { {rpc_port}}
query_port = { {query_port}}
edit_log_port = { {edit_log_port}}
# Choose one if there are more than one ip except loopback address.
# Note that there should at most one ip match this list.
# If no ip match this rule, will choose one randomly.
# use CIDR format, e.g. 10.10.10.0/24 or IP format, e.g. 10.10.10.1
# Default value is empty.
# priority_networks = 10.10.10.0/24;192.168.0.0/16
# Advanced configurations
# log_roll_size_mb = 1024
# sys_log_dir = ${DORIS_HOME}/log
# sys_log_roll_num = 10
# sys_log_verbose_modules = org.apache.doris
# audit_log_dir = ${DORIS_HOME}/log
# audit_log_modules = slow_query, query
# audit_log_roll_num = 10
# meta_delay_toleration_second = 10
# qe_max_connection = 1024
# qe_query_timeout_second = 300
# qe_slow_log_ms = 5000
</value>
</property>
</configuration>
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
在master.py
中configure
方法会读取配置文件进行创建
# 初始化配置文件 , 配置文件中参数取值读取的是params.py里的变量,不是直接读取的fe.xml变量名
doris_fe_conf = InlineTemplate(params.doris_fe_conf)
File(format("{doris_fe_conf_base_dir}/fe.conf"),
owner=params.doris_user,
group=params.user_group,
content=doris_fe_conf)
2
3
4
5
6
params.doris_fe_conf
读取的内容params.py
为doris_fe_conf = config['configurations']['fe']['content']
这个时候我们就可以在Ambari WebUI中的fe.conf文件,进行自定义参数配置了,随便在最后面进行修改。
上面我们添加了ABC=1234
重启服务验证:
验证
# cat /usr/hdp/3.1.5.0-152/apache-doris-2.0.2-bin-x64/fe/conf/fe.conf
....
ABC=1234
2
3
# InlineTemplate 和 Template 区别
上面有用到InlineTemplate
方法,这里对这两个方法进行介绍
这两个方法返回的接口都是将{ {xxx}}
变量进行转换后的文本
InlineTemplate 传入的是文本内容
Template 传入的是文本路径
方法二相对于方法一,支持了自定义修改配置文件参数,可以随意新增我们没有预设的配置。但这种方法我们将整个配置文件都暴露在Ambari WebUI,下面方法三我们通过在Ambari WebUICustom xx
中实现新增配置参数。
# 方法三:通过Ambari WebUI配置Custom XX实现参数新增
上面方法二实现自定义新增配置,但是整个配置文件文件都是暴露在外边,这里我们通过使用Ambari WebUICustom XX
进行新增配置。
在WebUI页面中我们可以看到一个配置文件有两种配置:Advanced fe
和Custom fe
两种
不同类型的配置文件获取Custom fe
写入配置文件方式不同
# 生成xml配置文件
在configure()
方法中添加以下代码生成配置文件
XmlConfig(format("{doris_fe_conf_base_dir}/doris-env.xml"), # 生成的配置文件绝对路径
configurations=params.config['configurations']['doris-env'], # configurations 固定值,doris-env 读取的configuration目录的.xml文件名前缀
configuration_attributes=params.config['configurationAttributes']['doris-env'],# configurationAttributes 固定值,doris-env 读取的configuration目录的.xml文件名前缀
owner=params.doris_user, # 文件所属用户
group=params.user_group # 文件所属用户组
)
# 和上面实现的完全相同
XmlConfig("doris-env2.xml", # 生成的配置文件名称
conf_dir=params.doris_fe_conf_base_dir, # 生成的配置文件目录
configurations=params.config['configurations']['doris-env'], # configurations 固定值,doris-env 读取的configuration目录的.xml文件名前缀
configuration_attributes=params.config['configurationAttributes']['doris-env'],# configurationAttributes 固定值,doris-env 读取的configuration目录的.xml文件名前缀
owner=params.doris_user, # 文件所属用户
group=params.user_group # 文件所属用户组
)
2
3
4
5
6
7
8
9
10
11
12
13
14
执行后会自动生成doris-env.xml
文件。
tip:这里只是用作演示XmlConfig方法,实际Doris FE是不用doirs-env.xml这个配置文件
# 生成properties配置文件
在params.py
中创建doris_properties_map
变量,用来接收所有配置参数
if 'fe' in config['configurations']:
doris_properties_map = config['configurations']['fe']
else:
doris_properties_map = {}
enable_test=True
2
3
4
5
6
创建模板文件templates/fe.conf.j2
来定义配置文件内容结构
# loop output paramaters for doris_properties_map
{% for key, value in doris_properties_map.iteritems() -%}
{ {key}}={ {value}}
{% endfor %}
# if enable_test is true,execute this code,enable_test is defined in params.py.
{% if enable_test -%}
# if fe.test.field is defined in doris_properties_map , output fe.test.field=default value
{% if not "fe.test.field" in doris_properties_map -%}
fe.test.field=default value
{% endif %}
{% endif %}
2
3
4
5
6
7
8
9
10
11
12
tip: 在.j2文件中获取params.py变量,直接使用变量名,比如上面的enable_test
就是直接获取的,不能使用{ {xxx}}
获取
在configure()中添加方法
File(format("{doris_fe_conf_base_dir}/fe.properties"),
content=Template('fe.conf.j2'),
owner=params.doris_user,
group=params.user_group,
mode=0755
)
2
3
4
5
6
启动服务后查看fe.properties
文件
# loop output paramaters for doris_properties_map
LOG_DIR=/var/log/doris
JAVA_OPTS_FOR_JDK_9="-Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:$DORIS_HOME/log/fe.gc.log.$CUR_DATE:time"
rpc_port=9020
meta_dir=/data/doris-meta
# if enable_test is true,execute this code,enable_test is defined in params.py.
# if fe.test.field is defined in doris_properties_map , output fe.test.field=default value
fe.test.field=default value
2
3
4
5
6
7
8
9