以前我手动搭 Hadoop 集群的时候,最头疼的就是各种组件版本对不上、配置改了同步不到所有节点、每台机器都要单独启动服务。后来换到 Ambari 管理之后,部署 HDFS、YARN、Hive 这些组件基本就是在网页上勾选、分配、点安装,整个过程会清晰非常多。
这次要整理的是 CentOS 7 上装 Ambari 2.7.5 + HDP 3.1.5 的完整过程。Ambari 负责集群的安装、配置、监控和告警,HDP 是它管理的 Hadoop 发行版,里面集成了 HDFS、YARN、ZooKeeper、Hive、HBase、Ranger 等一堆组件。这篇内容适合三类人:第一次搭 Hadoop 环境的学习者、需要在离线或内网环境部署集群的运维、以及被各种安装报错折腾过想找排查思路的人。我会把自己踩过的坑和最后采用的稳妥做法都写清楚,照着做基本能一次跑通。
1. 为什么我在 CentOS 7 上锁定了这套版本组合
1.1 Ambari 与 HDP 的版本对应关系不是随便配的
Ambari 和 HDP 有严格的版本兼容关系,不能想当然地拿最新 Ambari 去配旧 HDP,或者反过来。Ambari 2.7.5 + HDP 3.1.5 是 Hortonworks 在后期主推的组合之一,两个版本在 CentOS 7 上有完整的安装包仓库和元数据支持,踩坑少、资料多。
当时我对比过几个组合:Ambari 2.7.4 也能配 HDP 3.1.5,但 2.7.5 修了一些 Agent 注册和数据源配置上的问题,建议优先用 2.7.5。HDP 3.1.5 对应的是 Hadoop 3.x 生态,比 HDP 2.6 那一代在 YARN 调度、HDFS 纠删码等方面变化非常大。如果你还在沿用 HDP 2.x 时代的老经验,很多配置路径和组件名称都已经变了,后面提到的内容都要按 3.1.5 来理解。
1.2 这套组合适合什么规模的集群
官方说 Ambari 可以管理大规模生产集群,但我的实际建议是:如果是学习或者内部测试,集群规模控制在 3 到 10 台机器就够了。这种规模的集群用一套 Ambari Server 加若干 Agent 的模式非常合适。如果你需要管理几十台甚至几百台节点,Ambari 还能用,但需要考虑给 Ambari Server 独立的高可用方案,同时数据库也要用外部 MySQL 或 PostgreSQL,不能再用内嵌数据库。
我这次部署的测试环境是三台 CentOS 7.9:
- master1:Ambari Server + 部分 Master 组件
- worker1、worker2:DataNode、NodeManager 等 Worker 角色
如果你只有一台机器,也可以做单机部署,只是内存要特别注意。
1.3 集群规划时最容易被低估的资源
很多人装到一半发现卡死,绝大多数原因是内存不够。Ambari Server 本身会跑一个 Java 进程,默认堆内存 2G,再加上 Agent 进程、PostgreSQL 数据库,以及后续 HDFS、YARN、Hive 等服务的进程,单机部署的话 8G 内存是比较稳妥的下限。我建议最好给 master 节点 8G 以上,worker 节点 4G 以上。
磁盘方面,HDP 3.1.5 完整部署会下载大量 RPM,仓库文件加上组件安装包,预留 50G 以上空间比较安心。系统盘建议单独放,数据盘可以后续在 Ambari 里配置给 HDFS DataNode 使用。
2. 环境准备:CentOS 7 基础设置里最容易埋雷的几个点
2.1 主机名与 /etc/hosts 的一致性
这是 Ambari 部署失败概率最高的一个点。Ambari Server 和 Agent 通信时,会通过主机名互相识别,而且要求是 FQDN,也就是类似于master1.example.com这种完整域名格式。如果你只写了master1这种短主机名,Agent 注册时经常出现主机名解析不到、Agent 状态一直显示 UNKNOWN 的情况。
三台机器的/etc/hosts我建议统一写成这样:
192.168.100.10 master1.example.com master1 192.168.100.20 worker1.example.com worker1 192.168.100.30 worker2.example.com worker2同时每台机器执行:
hostnamectl set-hostname master1.example.com修改完以后一定重启systemd-hostnamed或者直接重启机器,再用hostname -f验证一下。很多教程把这步一笔带过,但一次集群几十个节点里面有两三台主机名不规范,后面注册就会集体失败。
2.2 SSH 免密登录与 root 限制
Ambari 在创建集群时,会用你在 Web 界面填写的 SSH 登录信息去目标主机上安装 Agent。它支持 root 密码、普通用户密码和私钥三种方式。最省事的是配 root 的 SSH 免密登录,但如果你在严格环境下禁用 root 远程登录,可以创建一个ambari-user,赋予 sudo 权限。
我实际操作时用的是 root 私钥方式。先在 Ambari Server 上生成密钥对:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""然后把公钥分发到所有主机:
ssh-copy-id root@master1.example.com ssh-copy-id root@worker1.example.com ssh-copy-id root@worker2.example.com这一步还要确认/etc/ssh/sshd_config没有关闭公钥认证,否则后面 Web 界面部署 Agent 时会提示 “Authentication failed”。
2.3 防火墙、SELinux、时间同步
这是一组基础项,但每项都有坑。Ambari 的组件之间通信端口非常多,如果开着 firewalld,你会频繁遇到“启动失败”“连接拒绝”这类问题。开发测试环境我直接关掉防火墙:
systemctl stop firewalld systemctl disable firewalld生产环境不能随便关的话,至少要放行下面这些端口:
| 端口 | 用途 |
|---|---|
| 8080 | Ambari Web UI |
| 8440、8441 | Ambari Agent 与 Server 通信 |
| 22 | SSH |
| 3306 | 外部 MySQL(如果使用) |
| 5432 | 外部 PostgreSQL(如果使用) |
| 8020、50010、50020 | HDFS 相关端口 |
| 8088、8042 | YARN 相关端口 |
| 2181 | ZooKeeper |
SELinux 我建议先设为 permissive 或 disabled:
setenforce 0 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config时间同步看起来不起眼,但很关键。Hadoop 组件尤其是 HDFS、Kerberos、ZooKeeper 对时间偏差非常敏感。所有节点统一安装 chrony:
yum install -y chrony systemctl enable --now chronyd然后用chronyc sources -v确认时间源正常。如果节点之间时间差超过几十秒,HDFS 的块汇报和 YARN 的 NodeManager 注册都可能出问题。
3. 先搭本地 Yum 仓库,网络问题少一半
3.1 为什么 Ambari 和 HDP 都必须有仓库
Ambari 安装 HDP 时,本质上是通过 yum 从仓库里拉取 RPM。仓库可能来自公网,也可能来自内网。公网仓库虽然方便,但生产环境里很多机器不能随便访问外网,而且公网地址如果访问不稳定,Web 向导会反复报错。把仓库搬到内网,用 httpd 或者 Nginx 提供访问,是成熟的做法。
这里要理解一个结构:Ambari 和 HDP 是两个独立的仓库。Ambari 仓库提供ambari-server和ambari-agent两个 RPM;HDP 仓库提供 Hadoop 生态组件 RPM,包括 HDFS、YARN、Hive、HBase 等。在 HDP 3.1.5 的 repo 文件里,通常还包含 HDP-UTILS 仓库,里面放的是底层工具库。三个仓库最好都准备齐。
3.2 用 httpd 在 Ambari Server 上搭建内网源
我是在 Ambari Server 这台机器上直接装 httpd 来提供仓库服务的。
yum install -y httpd systemctl enable --now httpd然后创建目录结构:
mkdir -p /var/www/html/ambari mkdir -p /var/www/html/hdp mkdir -p /var/www/html/hdp-utils之后下载对应仓库的 RPM 数据到这些目录。如果你能访问公网的官方仓库,最简单的方式是配置代理仓库后执行yum reposync把 RPM 同步下来。例如:
yum install -y yum-utils createrepo reposync -r Updates-2.7.5.0 -p /var/www/html/ambari/ reposync -r HDP-3.1.5.0 -p /var/www/html/hdp/ reposync -r HDP-UTILS-1.1.0.22 -p /var/www/html/hdp-utils/同步完成后,为了让目录里生成 yum 元数据,需要执行:
createrepo /var/www/html/ambari/Updates-2.7.5.0 createrepo /var/www/html/hdp/HDP-3.1.5.0 createrepo /var/www/html/hdp-utils/HDP-UTILS-1.1.0.22这一步很容易被忽略。如果你只是把 RPM 复制过去,没有生成repodata目录,客户端执行yum install时会提示找不到镜像列表。
3.3 客户端的 repo 文件写法
所有目标主机上,在/etc/yum.repos.d/下创建仓库文件。我习惯分成三个文件,方便排查:
# /etc/yum.repos.d/ambari.repo [Updates-2.7.5.0] name=Ambari-2.7.5.0 baseurl=http://192.168.100.10/ambari/Updates-2.7.5.0/ enabled=1 gpgcheck=0# /etc/yum.repos.d/hdp.repo [HDP-3.1.5.0] name=HDP-3.1.5.0 baseurl=http://192.168.100.10/hdp/HDP-3.1.5.0/ enabled=1 gpgcheck=0 [HDP-UTILS-1.1.0.22] name=HDP-UTILS-1.1.0.22 baseurl=http://192.168.100.10/hdp-utils/HDP-UTILS-1.1.0.22/ enabled=1 gpgcheck=0写完后执行:
yum clean all yum repolist确认能看到三个仓库。如果看不到,先检查 baseurl 里的路径是否能通过浏览器访问,再检查防火墙。一个很常见的坑是 httpd 的默认根目录/var/www/html有权限限制,确保目录是 755 权限,RPM 文件是 644 权限。否则能列出目录却下载不了文件,Ambari 会卡在安装阶段非常久。
4. Ambari Server 的安装与初始配置
4.1 安装 ambari-server 包并确认仓库版本
仓库配置好之后,在 Ambari Server 机器上直接安装:
yum install -y ambari-server安装完成后查看版本:
ambari-server --version正常会输出类似2.7.5.0-17的版本号。我建议出厂前先看一下。如果输出的是命令行帮助信息,说明安装有问题,检查 yum 仓库是否默认启用了多个 Ambari 版本,导致装错了包。
4.2 ambari-server setup 应答流程逐项拆解
安装好后,执行初始化:
ambari-server setup它有几个交互问题,我逐条说一下选择理由。
首先是Customize user account for ambari-server daemon,默认是root。如果你不想让 Ambari Server 用 root 跑,可以另建用户,但要注意这个用户需要对/var/lib/ambari-server、/var/run/ambari-server有写权限。建议新手阶段直接用 root。
接下来是 JDK 选择。Ambari 默认会用 Oracle JDK,但 Oracle 的下载地址经常变,导致自动下载失败。我这里的做法是提前用 yum 装 OpenJDK:
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel然后在 setup 时选择自定义 JDK,填入:
/usr/lib/jvm/java-1.8.0-openjdk这里必须强调的是,Ambari 2.7.5 依然推荐 JDK 8,不要用 JDK 11 或更高版本。HDP 3.1.5 的很多组件在 JDK 11 下会有兼容性问题。
然后是数据库配置。Enter advanced database configuration这里选择n,Ambari 会使用默认的内嵌 PostgreSQL。如果你已经在用外部数据库,选y,再选择数据库类型和连接参数。我的测试环境直接用了内嵌 PostgreSQL,省掉一个外部依赖。
最后会显示Database user、Database password等默认值。密码自己设一个,但要记住,后面ambari-server setup重复执行时会用到。
全部确认后,初始化脚本会创建数据库表并启动服务。
systemctl start ambari-server systemctl status ambari-server启动后立刻看日志:
tail -f /var/log/ambari-server/ambari-server.log日志里出现Server started之类的信息就说明启动成功。访问http://<服务器IP>:8080,默认账号密码是admin/admin。第一次启动如果页面打不开,优先检查 firewalld 是否拦截了 8080 端口。
4.3 数据库选择与 JDBC 驱动隐患
如果你后续在 HDP 集群里要部署 Hive、Ranger 或者 Hue,元数据库通常不能再用 Ambari 内嵌的 PostgreSQL。最常用的是外部 MySQL 5.7。在 Ambari Server 上要把 MySQL JDBC 驱动复制到/usr/share/java/下,并且执行:
ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java-5.1.48.jar这一步很多人忘了。没有 JDBC 驱动的话,后面创建 Hive 表或者 Ranger 初始化时会报找不到驱动,而且报错只会出现在组件启动日志里,表现非常隐蔽。
5. 通过 Web 创建 HDP 集群:从注册 Agent 到服务部署
5.1 登录 Ambari 并注册主机节点
浏览器登录 Ambari Web 后,首页会提示创建集群。流程很清晰,但有几个细节直接影响成败。
点击 “Launch Install Wizard” 后,第一步会让你选择 HDP 版本和仓库地址。这里要填HDP-3.1.5.0以及对应的仓库 baseurl。如果你按前面方法在内网做了仓库,这里直接填http://192.168.100.10/hdp/HDP-3.1.5.0/和 HDP-UTILS 地址。
接下来填写目标主机列表,我用的是:
master1.example.com worker1.example.com worker2.example.com注意:这里必须写 FQDN,不要写 IP。Ambari 通过 SSH 去每台机器上安装 Agent,如果 SSH 端口不是 22,要在这里指定。
然后选择认证方式,我用的是Private Key,选择 Ambari Server 上/root/.ssh/id_rsa对应的密钥内容粘贴进去。这一步实质是让 Ambari 使用 SSH 登录主机,所以密钥和主机列表里每台机器都要匹配。
之后点击Register and Confirm。Ambari 会自动登录每台主机、安装ambari-agent、启动 Agent,并等 Agent 回连 Ambari Server。这个过程有 1 到 3 分钟。
5.2 Agent 注册不上时的排查链路
如果主机状态一直停在Registration in progress,不要干等。去目标主机的 Agent 日志里看:
tail -f /var/log/ambari-agent/ambari-agent.log我遇到最多的情况是ERROR: Cannot connect to Ambari Server或者版本不匹配的报告。这时候先检查 Agent 里配置的服务器地址:
cat /etc/ambari-agent/conf/ambari-agent.ini确认hostname=master1.example.com是 Ambari Server 的 FQDN。另一个容易忽略的问题是 Agent 和 Server 的系统时间不一致,会导致注册请求被当作过期请求拒绝。同步时间后重启 Agent:
systemctl restart ambari-agent如果还不行,在 Ambari Server 上执行:
ambari-agent status看 Agent 是否启动。Agent 没起来时,通常是因为 Java 环境变量没配好,检查目标机器的JAVA_HOME。
注册成功的标志是 Web 界面显示所有主机为Registered,并正常显示主机名、IP、CPU、内存等信息。
5.3 创建集群并选择 HDP 3.1.5
主机注册完成后,进入Choose Services页面。Ambari 会根据默认推荐勾选一些服务。对于最普通的 Hadoop 测试环境,我建议先选这些基础服务:
- HDFS
- YARN + MapReduce2
- ZooKeeper
- Tez
- Hive
- Pig
- Sqoop
Ranger、Knox、Ambari Metrics 这些可以先不选,等基础跑通后再加上。Ambari 会把服务之间的依赖关系标出来,如果你选了 Hive 却没选 Tez,它会提示依赖缺失。
接下来是Assign Masters。Ambari 会根据主机角色自动推荐分配方案,我通常手动确认一下,把 NameNode、ResourceManager、HiveServer2 这些 Master 角色都放在 master1 上,把 DataNode、NodeManager 放在 worker1 和 worker2 上。
再到Assign Slaves and Clients页面,勾选每台主机要运行的角色。DataNode 和 NodeManager 就是这里的 Slave 角色。
然后是Customize Services,这里包含所有服务的配置项。我一般会重点看这几个:
- HDFS 的数据目录是否指向数据盘
- YARN 的内存参数是否符合节点实际内存
- Hive 的元数据库连接是否配置正确
5.4 安装过程的常见报错与处理
点击Deploy后,Ambari 会在所有主机上并行安装组件 RPM、改写配置、启动服务。这个过程最常出现的问题如下。
第一种是Cannot retrieve repository metadata。这说明目标主机访问不到你在前面配置的仓库 baseurl。先在目标主机上用curl测试仓库地址,如果通,再确认仓库文件里是否开启gpgcheck=0。Ambari 生成的仓库配置有时会带 gpg 校验,而仓库里没有上传公钥,就会失败。
第二种是组件启动失败后,Web 界面显示红色状态。这时要看具体组件的日志。比如 HDFS 的 NameNode 起不来,先看:
tail -f /var/log/hadoop/hdfs/hadoop-hdfs-namenode-master1.log最常见的原因是 NameNode 格式化没做,或者 HDFS 的目录没有正确归属到hdfs用户。Ambari 在安装过程中一般会自动完成格式化,但如果失败,就需要到/etc/hadoop/conf/检查配置文件,再用hdfs namenode -format手动格式化。
第三种是 YARN 的 NodeManager 注册不上。ResourceManager 界面里 NodeManager 数量迟迟不到预期值。这个问题的排查链和 Agent 注册类似:时间不同步、节点间无法通过 FQDN 互相解析、防火墙拦截了 8042 端口。逐项检查,基本都能解决。
6. 装完之后我做的几件事
6.1 验证 HDFS 和 YARN 是否真的可用
Ambari 界面上所有组件显示绿色,并不代表真的通了。我会在 master1 上执行几个基础命令验证。
创建测试目录:
hdfs dfs -mkdir /test hdfs dfs -put /etc/hostname /test/hostname hdfs dfs -cat /test/hostname看一下 HDFS 的 Web UIhttp://master1.example.com:50070,确认 Active NameNode 正常,数据块数量和 DataNode 数量一致。
提交一个 YARN 任务验证调度:
yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar pi 2 100这个任务会计算圆周率的近似值,如果 MapReduce 跑通,YARN 的调度和 NodeManager 的心跳就基本正常了。
6.2 修改默认密码和基础告警
Ambari 默认账号admin/admin一定第一时间改掉。在 Ambari Server 上执行:
ambari-admin-password-reset输入新密码即可。否则 Web 界面暴露在网络上等于裸奔。
告警方面,Ambari 自带了一组默认告警,比如 DataNode 存活、NodeManager 存活、HDFS 容量告警等。我会进Alerts菜单,把邮件通知或者 SNMP 通知配置好。Ambari 的告警阈值也可以调,默认的 HDFS 容量阈值是 80%,生产环境建议调低。
6.3 后续运维需要留意的盘子问题
这套组合在 CentOS 7 上我已经跑了一段时间,整体稳定,但有几件事必须养成习惯。
第一,不要随便在系统里手动改 Hadoop 配置文件。Ambari 会把配置集中管理,你手动改了某个组件的core-site.xml,下次 Ambari 做配置下发或者重启服务时,会把你的改动覆盖掉。正确的做法是到 Ambari Web 的服务配置页修改,然后点击重启影响的服务。
第二,Ambari Server 的 PostgreSQL 数据库要定期备份。里面存了集群的配置历史、告警状态、主机信息,一旦损坏,恢复成本非常高。我一般直接 cron 备份:
pg_dump -U ambari -h localhost ambari > /backup/ambari_$(date +%F).sql第三,日志需要常清。HDP 组件默认日志路径在/var/log/hadoop、/var/log/hive、/var/log/yarn等目录,时间长了很占空间。写一个 crontab 做临时文件的清理是很有必要的。
最后再说一个不太常被提到的技巧:Ambari 里很多服务在 Web 界面上点击重启后,进程起不来的原因并不是配置错误,而是因为旧进程没有完全退出。如果遇到端口占用、Pid 文件冲突之类的问题,先去对应主机ps -ef | grep java清掉残留进程,再回 Ambari 里启动,成功率会高很多。安装和运维这类问题,很多时候都是基础环境不干净,而不是组件本身坏了。