[Step2]ambari.properties修改
# 一、说明
上一篇已经把本机 Debug 运行时最容易缺失的基础文件补齐了,包括数据库授权、version 文件、运行目录、数据库密码文件以及
keystore。
这一篇继续往下走,核心目标只有一个:把 ambari.properties 改造成适合本地源码启动的配置。
在默认安装场景下,Ambari Server 大量路径都指向系统安装目录,例如 /usr/lib/ambari-server、/var/lib/ambari-server、
/etc/ambari-server/conf。
但本机 Debug 并不是基于 RPM 安装后的目录运行,而是直接基于源码工程运行,因此这些路径如果不改,启动过程很容易出现下面几类问题:
- 找不到
resources目录 - 找不到
stacks、common-services、extensions - 运行时目录不可写
- 数据库密码读取失败
- 初始化阶段路径正确但实际读取了系统安装目录中的旧文件
这一章的重点
这一篇不是简单“贴一个配置文件”就结束,而是把每一类配置为什么要改、改了以后解决什么问题、哪些可以保留默认值,全部拆开讲清楚。

# 二、修改思路
本地 Debug 下的 ambari.properties 可以按照下面四类来理解:
| 配置类别 | 处理方式 | 目的 |
|---|---|---|
| 本地源码资源路径 | 改为源码工程的绝对路径 | 让程序直接读取当前源码 |
| 本地运行时目录 | 改到 local-runtime 下 | 避免污染系统目录,便于反复重建 |
| 数据库连接参数 | 指向远程测试库 | 保证本机启动时可以接入已有 Ambari 库 |
| 其余默认参数 | 尽量保持原样 | 降低改动面,避免引入额外变量 |
注意
文中的所有路径示例都用了“/请更换成你项目路径,必须绝对路径/...”这种写法。
实际使用时必须替换为你本机的绝对路径,不能直接复制原文不改。
# 三、完整配置示例
下面这份配置可直接作为本地 Debug 版本的 ambari.properties 参考模板:
active.instance=true
server.os_type=kylin10
server.os_family=kylin10
gpl.license.accepted=true
ambari.python.wrap=ambari-python-wrap
# ---- Paths: pointing to local source tree ----
security.server.keys_dir=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/conf/unix/local-runtime/keys
resources.dir=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/src/main/resources
shared.resources.dir=/请更换成你项目路径,必须绝对路径/ambari/ambari-common/src/main/python/ambari_commons/resources
custom.action.definitions=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/src/main/resources/custom_action_definitions
metadata.path=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/src/main/resources/stacks
common.services.path=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/src/main/resources/common-services
extensions.path=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/src/main/resources/extensions
server.version.file=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/src/main/resources/version
stackadvisor.script=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/src/main/resources/scripts/stack_advisor.py
mpacks.staging.path=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/src/main/resources/mpacks-v2
mpacks-v2.staging.path=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/src/main/resources/mpacks-v2
# ---- Runtime dirs: under local-runtime (gitignored, survives restarts) ----
pid.dir=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/conf/unix/local-runtime
server.tmp.dir=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/conf/unix/local-runtime/data
recommendations.dir=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/conf/unix/local-runtime/data
bootstrap.dir=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/conf/unix/local-runtime/data
kerberos.keytab.cache.dir=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/conf/unix/local-runtime/data
webapp.dir=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/conf/unix/local-runtime/data
# Not applicable locally (keep referencing system paths is fine, not used in debug)
bootstrap.script=/usr/lib/ambari-server/lib/ambari_server/bootstrap.py
bootstrap.setup_agent.script=/usr/lib/ambari-server/lib/ambari_server/setupAgent.py
# ---- Database: MySQL remote (dev1.test.com) ----
server.persistence.type=remote
server.jdbc.database=mysql
server.jdbc.database_name=ambari
server.jdbc.hostname=dev1.test.com
server.jdbc.port=3306
server.jdbc.driver=com.mysql.cj.jdbc.Driver
server.jdbc.url=jdbc:mysql://dev1.test.com:3306/ambari?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
server.jdbc.user.name=root
# Note: value is a FILE PATH to the password file, not the password itself
server.jdbc.user.passwd=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/conf/unix/local-runtime/db-password.txt
server.jdbc.connection-pool=c3p0
server.jdbc.connection-pool.acquisition-size=5
server.jdbc.connection-pool.idle-test-interval=7200
server.jdbc.connection-pool.max-age=0
server.jdbc.connection-pool.max-idle-time=14400
server.jdbc.connection-pool.max-idle-time-excess=0
# RCA (same DB)
server.jdbc.rca.driver=com.mysql.cj.jdbc.Driver
server.jdbc.rca.url=jdbc:mysql://dev1.test.com:3306/ambari?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
server.jdbc.rca.user.name=root
server.jdbc.rca.user.passwd=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/conf/unix/local-runtime/db-password.txt
# ---- The rest below is identical to production conf/unix/ambari.properties ----
java.releases=jdk1.8
java.releases.ppc64le=
jdk1.8.desc=Oracle JDK 1.8 + Java Cryptography Extension (JCE) Policy Files 8
jdk1.8.url=http://public-repo-1.hortonworks.com/ARTIFACTS/jdk-8u112-linux-x64.tar.gz
jdk1.8.dest-file=jdk-8u112-linux-x64.tar.gz
jdk1.8.jcpol-url=http://public-repo-1.hortonworks.com/ARTIFACTS/jce_policy-8.zip
jdk1.8.jcpol-file=jce_policy-8.zip
jdk1.8.home=$ROOT/usr/jdk64/
jdk1.8.re=(jdk.*)/jre
jdk.download.supported=true
jce.download.supported=true
# removes artifacts from recommendations.dir which are older than specified (h,d,w,m,y) during the next recommendation call.
recommendations.artifacts.lifetime=1w
server.connection.max.idle.millis=900000
server.fqdn.service.url=http://169.254.169.254/latest/meta-data/public-hostname
server.stages.parallel=true
# Views settings
views.request.connect.timeout.millis=5000
views.request.read.timeout.millis=10000
views.ambari.request.connect.timeout.millis=30000
views.ambari.request.read.timeout.millis=45000
views.skip.home-directory-check.file-system.list=wasb,adls,adl
# Scheduler settings
server.execution.scheduler.isClustered=false
server.execution.scheduler.maxThreads=5
server.execution.scheduler.maxDbConnections=5
server.execution.scheduler.misfire.toleration.minutes=480
# Kerberos settings
kerberos.operation.verify.kdc.trust=true
# Default timeout in seconds before task is killed
agent.task.timeout=900
# Default timeout in seconds before package installation task is killed
agent.package.install.task.timeout=1800
# Enables package installation retry on repository unavailability error
agent.stack.retry.on_repo_unavailability=false
# Default count of tries
agent.stack.retry.tries=5
# Default timeout in seconds before a server-side task is killed
server.task.timeout=1200
# thread pool maximums
client.threadpool.size.max=25
agent.threadpool.size.max=25
# linux open-file limit
ulimit.open.files=65536
# Server HTTP settings
server.http.session.inactive_timeout=1800
# user inactivity timeout setting
user.inactivity.timeout.default=0
user.inactivity.timeout.role.readonly.default=0
# to skip service checks during deploy
skip.service.checks=false
rolling.upgrade.skip.packages.prefixes=
# HTTP Header settings for Ambari Server UI
http.strict-transport-security=max-age=31536000
http.x-xss-protection=1; mode=block
http.x-frame-options=DENY
http.x-content-type-options=nosniff
http.cache-control=no-store
http.pragma=no-cache
http.charset=utf-8
# HTTP Header settings for Ambari Views
views.http.strict-transport-security=max-age=31536000
views.http.x-xss-protection=1; mode=block
views.http.x-frame-options=SAMEORIGIN
views.http.x-content-type-options=nosniff
views.http.cache-control=no-store
views.http.pragma=no-cache
views.http.charset=utf-8
# exclude some ciphers that are not supported by old versions of ssl (this fix was added for SLES12)
security.server.disabled.ciphers=.*DES.*|TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384|TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384|TLS_RSA_WITH_AES_256_CBC_SHA256|TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384|TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384|TLS_DHE_RSA_WITH_AES_256_CBC_SHA256|TLS_DHE_DSS_WITH_AES_256_CBC_SHA256|TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA|TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA|TLS_RSA_WITH_AES_256_CBC_SHA|TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA|TLS_ECDH_RSA_WITH_AES_256_CBC_SHA|TLS_DHE_RSA_WITH_AES_256_CBC_SHA|TLS_DHE_DSS_WITH_AES_256_CBC_SHA|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256|TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256|TLS_RSA_WITH_AES_128_CBC_SHA256|TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256|TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256|TLS_DHE_RSA_WITH_AES_128_CBC_SHA256|TLS_DHE_DSS_WITH_AES_128_CBC_SHA256|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA|TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA|TLS_RSA_WITH_AES_128_CBC_SHA|TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA|TLS_ECDH_RSA_WITH_AES_128_CBC_SHA|TLS_DHE_RSA_WITH_AES_128_CBC_SHA|TLS_DHE_DSS_WITH_AES_128_CBC_SHA|TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA|TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA|TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA|TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA|SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA|SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA|TLS_EMPTY_RENEGOTIATION_INFO_SCSV|TLS_DH_anon_WITH_AES_256_CBC_SHA256|TLS_ECDH_anon_WITH_AES_256_CBC_SHA|TLS_DH_anon_WITH_AES_256_CBC_SHA|TLS_DH_anon_WITH_AES_128_CBC_SHA256|TLS_ECDH_anon_WITH_AES_128_CBC_SHA|TLS_DH_anon_WITH_AES_128_CBC_SHA|TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA|SSL_DH_anon_WITH_3DES_EDE_CBC_SHA|SSL_RSA_WITH_DES_CBC_SHA|SSL_DHE_RSA_WITH_DES_CBC_SHA|SSL_DHE_DSS_WITH_DES_CBC_SHA|SSL_DH_anon_WITH_DES_CBC_SHA|SSL_RSA_EXPORT_WITH_DES40_CBC_SHA|SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA|SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA|SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA|TLS_RSA_WITH_NULL_SHA256|TLS_ECDHE_ECDSA_WITH_NULL_SHA|TLS_ECDHE_RSA_WITH_NULL_SHA|SSL_RSA_WITH_NULL_SHA|TLS_ECDH_ECDSA_WITH_NULL_SHA|TLS_ECDH_RSA_WITH_NULL_SHA|TLS_ECDH_anon_WITH_NULL_SHA|SSL_RSA_WITH_NULL_MD5|TLS_KRB5_WITH_3DES_EDE_CBC_SHA|TLS_KRB5_WITH_3DES_EDE_CBC_MD5|TLS_KRB5_WITH_DES_CBC_SHA|TLS_KRB5_WITH_DES_CBC_MD5|TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA|TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5
server.python.log.name=ambari-server-command.log
# server.pyton.log.level=(INFO/DEBUG)
server.python.log.level=INFO
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
# 四、必须修改的几类配置
# 1、本地源码资源路径
这一组配置最关键,决定了 Ambari Server 启动后究竟读取哪一套资源。
例如下面这些:
resources.dirshared.resources.dircustom.action.definitionsmetadata.pathcommon.services.pathextensions.pathserver.version.filestackadvisor.scriptmpacks.staging.pathmpacks-v2.staging.path
这些路径全部要改成当前源码工程的绝对路径。
为什么一定要用绝对路径
本地 Debug 启动时,工作目录不一定总是你以为的那个目录。
尤其是通过 IDE、脚本、远程附加等方式启动时,相对路径很容易漂移。
一旦漂移,最先出问题的通常就是 resources、stacks 和 version 文件读取。
# 1.1 resources.dir
这个目录是 Ambari Server 加载主资源的入口之一。 如果这里指到了系统安装目录,调试时看到的逻辑可能是当前源码,但读取到的资源却是系统里旧版本的资源文件,问题会非常隐蔽。
# 1.2 metadata.path 与 common.services.path
这两个目录分别对应栈定义和公共服务定义。 本地二开最常改的内容之一就是 stack 和 service 元数据,如果这两个路径没有指到源码目录,修改完经常会出现“代码生效了但界面配置没变化”的错觉。
# 1.3 server.version.file
上一篇已经补过 version 文件,这里还要确保 ambari.properties 中明确指向它。
否则即使文件存在,程序也不一定会读到正确位置。
常见误区
很多人以为只要 version 文件建好了就行,实际上还要看 server.version.file 配置最终指向哪里。
文件存在不代表程序一定读的是这份文件。
# 五、运行时目录改到 local-runtime
本地 Debug 时,不建议继续写系统目录。
更稳妥的做法,是把所有运行时目录统一落到工程内的 local-runtime。
对应配置如下:
pid.dirserver.tmp.dirrecommendations.dirbootstrap.dirkerberos.keytab.cache.dirwebapp.dir
# 1、这样改的好处
| 做法 | 好处 |
|---|---|
统一放到 local-runtime | 目录清晰,便于集中清理 |
| 不写系统目录 | 避免本机环境和已安装 Ambari 相互干扰 |
| 保持在工程内 | IDE、脚本、日志排查都更直观 |
# 2、为什么推荐保留 local-runtime
本地 Debug 有一个很典型的特点:会反复启动、反复删缓存、反复重建。 如果运行时目录散落在系统路径下,每次清理都会很麻烦;一旦和系统 Ambari 共用目录,还可能互相覆盖。
推荐做法
把 local-runtime 加入 gitignore,所有运行态文件都放进去。
这样既不会污染仓库,也方便你在环境出问题时一把清掉重建。
# 六、数据库连接配置
# 1、远程数据库模式
本机 Debug 并不要求数据库也跑在本机。 在很多场景下,直接连接远程测试库更方便,因此这里配置为:
server.persistence.type=remote
server.jdbc.database=mysql
server.jdbc.database_name=ambari
server.jdbc.hostname=dev1.test.com
server.jdbc.port=3306
2
3
4
5
这表示当前 Ambari Server 启动后,将直接连接 dev1.test.com 上的 MariaDB/MySQL。
# 2、JDBC URL 说明
server.jdbc.url=jdbc:mysql://dev1.test.com:3306/ambari?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
这个 URL 中几个参数都比较常见:
| 参数 | 作用 |
|---|---|
useSSL=false | 调试环境下先关闭 JDBC SSL,避免额外证书问题 |
allowPublicKeyRetrieval=true | 适配部分 MySQL 8 认证场景 |
serverTimezone=UTC | 避免驱动层时区告警或连接异常 |
说明
如果你本地用的是 MariaDB,但驱动选择了 com.mysql.cj.jdbc.Driver,只要依赖和协议兼容,一般也可以正常工作。
关键不是数据库品牌名称,而是驱动、协议和服务端版本是否匹配。
# 3、密码不是明文,而是文件路径
这里最容易踩坑的是:
server.jdbc.user.passwd=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/conf/unix/local-runtime/db-password.txt
这不是数据库密码本身,而是密码文件路径。 程序会去读取这个文件的内容,把文件里的文本当成密码使用。
RCA 配置也是同样逻辑:
server.jdbc.rca.user.passwd=/请更换成你项目路径,必须绝对路径/ambari/ambari-server/conf/unix/local-runtime/db-password.txt
这里非常关键
如果你把 server.jdbc.user.passwd=root 直接写成明文,程序会把 root 当成文件路径去找。
最终报错看起来可能是数据库认证失败,但根因其实是密码文件读取方式用错了。
# 七、为什么有些路径不需要改
配置中这两项保留了系统路径:
bootstrap.script=/usr/lib/ambari-server/lib/ambari_server/bootstrap.py
bootstrap.setup_agent.script=/usr/lib/ambari-server/lib/ambari_server/setupAgent.py
2
原文里已经标注了:
Not applicable locally (keep referencing system paths is fine, not used in debug)
也就是说,在当前本地 Debug 方案里,这两个脚本并不是关键执行路径,因此可以先不改。
# 1、处理原则
本地调试配置不要追求“全部改成本地路径”,而要追求“真正会走到的路径改掉,不会走到的路径尽量少动”。
这样做有两个好处:
- 减少不必要改动
- 缩小排错范围
配置改动原则
能不动的先不动。 只改本地启动一定会用到的配置,效果往往更稳。