☰
CDH5.14.0集群环境准备:从主机规划到系统调优完整指南
2026/10/16 10:57:35 网站建设 项目流程

1. 环境准备到底在准备什么

CDH5.14.0这套集群,搭起来本身不算难,难的是很多人小看了最前面的环境准备。我自己接触过好几套CDH5.x的集群,也帮人排查过不少“装到一半卡住”的问题,最后发现根子全出在环境上:hostname带着下划线、SELinux没关干净、时间偏了半小时、句柄数太小、JDK路径不对。这些问题在部署阶段不会立刻报错,等你把NameNode、ResourceManager这些角色都拉起来之后才连环炸,那种半夜翻车的滋味谁碰谁知道。

所以这个系列第一篇,我先把所有和环境相关的准备工作一次讲透,给你一条能照着走完的路径。CDH5.14.0的部署流程,本质上是先把底层管理服务装好,再通过管理界面向所有节点下发安装包、启动角色。管理端本身不复杂,但你要让它顺利驱动一整批机器,前提就是这些机器身上的系统配置全部达标。环境准备不到位,后面的图形界面操作就是无休止的填坑。

这篇内容适合两类人:一是打算从零搭一套CDH5.x学习或测试环境的人,二是要新维护一套存量CDH5集群、需要重新整理环境基线的人。下面所有操作以CentOS 7.x为主,RHEL系列同样适用。我会把主机规划、网络配置、系统参数、JDK、SSH、NTP、limits这些内容一次性捋清楚,每一项都会解释为什么要这么配置,而不是只丢给你一串命令。

1.1 环境准备阶段需要确定的三件事

很多人误以为环境准备就是装个系统、装个JDK,其实这个阶段要确定的事情有三层。

第一层是硬件和拓扑规划。你得知道这个集群有多大,用几台机器,哪台跑什么角色,磁盘怎么分配。CDH的角色可以混布,但Master角色的负载和Worker角色完全不同,如果一开始不规划清楚,后期扩容或者调整角色会非常痛苦。

第二层是操作系统层面的参数基线。CDH对内核参数、文件句柄、透明大页、swap、时间同步都有明确要求。这些参数分散在多个配置文件里,每一个都可能成为压垮集群的最后一根稻草。别觉得“默认值也能跑”,默认值能让单机跑起来,但撑不住分布式环境下的并发和协调需求。

第三层是部署账号和通道准备。CDH的管理端需要通过SSH免密登录到所有节点,分发安装包和执行安装脚本。你用什么账号部署、密钥怎么分发、是不是所有节点都能免密登录,这些不属于业务配置,但直接决定自动化安装能不能顺利往下走。

这三件事都确认之后,才真正进入“下载安装包、启动服务”的阶段。你会发现,环境准备做得越扎实,后面越顺。

1.2 环境准备检查清单概览

先给一张总览表,方便你对照理解整个环境准备涉及的范围。后面每个章节会展开讲具体操作。

准备项核心要求不做的后果
主机规划Master / Worker / Edge角色分离角色互相争抢资源,性能和稳定性差
磁盘规划数据目录独立挂载,预留足够空间根分区被数据打满,集群宕机
操作系统CentOS/RHEL 7.x 64位,最小化安装第三方软件包干扰、兼容性问题
防火墙/SELinux关闭或调整为宽松模式Agent挂载失败、端口不通、权限诡异
THP关闭透明大页HBase性能骤降、Kudu写入卡顿
swapswappiness设为1左右内存抖动、性能不稳定
JDKOracle JDK 1.8,配置JAVA_HOME管理端或组件启动直接失败
SSH免密root或部署账号免密到所有节点无法添加主机,自动化安装卡住
NTP全集群时间同步角色心跳异常、HDFS block报告错乱
limits文件句柄和进程数放大高并发场景下进程默默挂掉

这张表你可以在动手配置的时候贴在旁边,每做完一项就打个勾。下面开始一项一项过。

2. 主机规划:别到装完才发现机器不够用

主机规划是整个环境准备里最容易被糊弄过去的一步。很多人手里能用的机器就三台,直接全部塞角色,先跑起来再说。这么做不是不行,但你要清楚每种角色的资源消耗和故障影响范围,然后决定哪些角色可以混布、哪些必须分离。

2.1 节点角色划分

CDH5.14.0里最核心的角色是集群管理服务(后面统称CM)和底层的分布式角色。大致可以分成下面几类:

  • Master节点:跑NameNode、ResourceManager、Hive Metastore、Zookeeper等核心控制角色。
  • Worker节点:跑DataNode、NodeManager,负责存储数据和执行计算任务。
  • Edge节点:跑客户端工具、Gateway角色,不参与核心存储,收集用户提交的任务。

最精简的测试环境,三台机器就够了,一台Master加两台Worker。如果条件允许,我建议把管理服务单独放一台机器,和业务Master分开,这样管理端的负载不会压到NameNode和ResourceManager上。生产环境里管理端和业务Master混布虽然省机器,但一旦CM要做健康检查、指标采集,CPU和内存都会被吃掉一块,关键时刻会跟核心进程抢资源。

给一张我常用的节点规划表参考:

节点建议配置典型角色
management8C16G,系统盘200GCM Server、CM Agent、MariaDB
master-18C16G,系统盘200GNameNode、ResourceManager、Hive Metastore、Zookeeper
master-28C16G,系统盘200GSecondaryNameNode、Zookeeper
># /etc/hosts 示例 192.168.1.11 management 192.168.1.12 master-1 192.168.1.13 master-2 192.168.1.21 >systemctl stop firewalld systemctl disable firewalld systemctl stop iptables systemctl disable iptables

SELinux一定要设为disabled。很多部署失败的诡异权限问题,比如Agent没权限写临时文件、组件进程起不来,最终定位都是SELinux在捣乱。修改/etc/selinux/config,把SELINUX=enforcing改成SELINUX=disabled,然后重启系统生效。如果你暂时不想重启,至少执行setenforce 0临时关掉,但一定要记得把配置文件改掉,否则重启后又回到 enforcing。

3.4 THP、swap与内核参数

透明大页(THP)是Linux内核的一个特性,初衷是提高内存管理效率,但大数据组件尤其是HBase、Kudu对THP非常敏感。THP开启会导致内存分配时的大页延迟,造成明显性能下降甚至进程卡顿。CDH官方和社区经验都是一致建议关闭。

用下面命令检查当前状态:

cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag

如果输出里有[always]或者[never]的位置不对,需要改成never。改法有两条路,一条是直接echo写入sysfs文件,但重启后失效;一条是写到/etc/rc.local里让系统启动时自动执行。我建议两条都做:临时生效用echo,永久生效写rc.local。

echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local chmod +x /etc/rc.d/rc.local

接下来是swap。很多大数据集群内存大,不爱用swap,但完全不配swap在某些极端情况下反而容易触发OOM。CDH官方更推荐的做法是把swappiness调低,而不是彻底关掉swap。过高的swappiness会让系统频繁把内存页换到swap,引发明显的性能抖动。建议把/etc/sysctl.conf里的vm.swappiness改成1,这样系统只在非常紧张的情况下才会使用swap。

如果你用的是CentOS 7,还有一个tuned服务要注意。tuned会定期应用性能模板,可能把手工调整的内核参数覆盖掉。建议直接关掉它,或者设置成throughput-performance模式再调参:

systemctl stop tuned systemctl disable tuned tuned-adm off

这步做完,顺手把系统服务组件一起确认:比如NetworkManager如果不是可控环境,尽量用network服务,不要默认网络配置反复跳变。

4. JDK和基础依赖:装得不对后面CM起不来

CDH5.14.0整体是跑在Java生态上的,JDK的环境配置直接决定了管理端和各个组件能否启动。我在实战里见过太多JDK相关报错,所以这一节值得单独拉出来讲。

4.1 JDK版本选择

CDH5.14.0要求Java 1.8,也就是我们常说的JDK 8。这个版本虽然老,但在CDH5.x时代是官方认证的标准。有两种选择:Oracle JDK和OpenJDK。官方文档主要针对Oracle JDK做验证,但我实际使用中发现OpenJDK在多数场景下也能正常跑,只是个别组件的SSL或者安全模块会有细微差异。生产环境求稳的话,优先选择Oracle JDK 1.8。

版本号方面,最低也要8u162以上,太老的JDK 8会有不少已发现的问题,特别是JVM参数支持和加密算法上。如果你用的是更新的JDK 11或者JDK 17,这里要明确告诉你,不要在这套环境里尝试。CDH5.14.0发布时的Java版本就是JDK8,硬上高版本只会得到一堆莫名其妙的异常。

4.2 安装JDK并设置JAVA_HOME

每台节点都要装JDK,不只Master。别只给CM Server装一个就完事。操作步骤并不复杂,但我建议使用rpm包安装,这样会统一把java命令放到/usr/bin下面,JDK本身安装到/usr/java目录。

安装前,先确认系统里有没有自带的OpenJDK,如果有就先卸载,避免环境变量和java命令冲突。

yum remove -y java-1.7.0-openjdk java-1.8.0-openjdk rpm -ivh jdk-8u162-linux-x64.rpm

安装完成后,配置环境变量。CDH的一些脚本默认会去/usr/java目录找JDK,所以这里有一个潜规则:尽量保持默认安装路径,不要自作主张把JDK放到/opt或者别的目录,否则后续组件启动时经常出现找不到JAVA_HOME的问题。

cat >> /etc/profile <<'EOF' export JAVA_HOME=/usr/java/jdk1.8.0_162 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar EOF source /etc/profile java -version

确认java -version输出的是jdk1.8.0_162,而不是系统自带的旧版本。这里有个小坑:如果你只是配置了/etc/profile,但没有让ssh会话重新登录,当前终端可能还是旧的PATH。做环境准备时建议每台节点都重新ssh登录一次,再验证java命令。

4.3 基础工具与系统依赖补齐

CDH的安装过程会用到不少系统命令,比如unzip、tar、wget、ntpdate、lsof、psmisc这些。如果系统是最小化安装,缺的东西可能比较多。建议在配置环境阶段一次性装齐:

yum install -y ntp wget vim unzip tar sysstat lsof psmisc bind-utils openssh-clients

如果你所在的机房是离线环境,没有外网yum源,那这些基础包需要提前下载好,制作成本地yum仓库。别等到CM安装到一半才想到缺依赖,那时候再去配本地源会非常被动。

另外,还要确认Python环境。CDH5.x的管理流程对Python有依赖,CentOS 7自带的Python 2.7可以直接满足,但千万别手闲把系统Python升级到3.x,很多依赖Python 2的老脚本会直接挂掉。我见过有人为了跑某个工具把系统默认python改成软链,结果CM安装时崩溃得一塌糊涂。

5. SSH免密登录:一张密钥解决全集群分发

CDH的自动化部署依赖管理端能免密登录到各个节点,这也是环境准备阶段一个容易被忽略但极其重要的环节。

5.1 为什么需要免密登录

CM Server在添加主机时,需要向目标节点上传agent安装包、parcel文件,并执行远程脚本。这些操作全部要通过SSH完成。如果你没有配置免密,每一次操作都会卡在密码输入上,自动化流程直接中断。所以,必须在CM Server所在节点配置对集群内其他所有节点的免密登录。

Elaborate here:在实际场景中,我一般直接用root账号做免密。虽然从安全角度来说root免密不太好看,但CDH部署阶段涉及大量的服务启停、目录创建和文件复制,用普通账号要频繁sudo,反而会把部署过程搞得极其繁琐。如果你有安全审计要求,可以在部署完成后改成更严格的权限控制。

5.2 密钥生成与分发步骤

生成密钥在CM Server节点执行。生成时建议指定rsa类型,4096位:

ssh-keygen -t rsa -b 4096 -N ""

-N ""表示不设置passphrase。如果你设置了passphrase,会在使用时要求输入,自动化部署就卡住了。

密钥生成后,公钥在/root/.ssh/id_rsa.pub,私钥在/root/.ssh/id_rsa。接下来把公钥分发到每个节点。可以用ssh-copy-id,也可以手动追加。ssh-copy-id更简单:

ssh-copy-id -i /root/.ssh/id_rsa.pub management ssh-copy-id -i /root/.ssh/id_rsa.pub master-1 ssh-copy-id -i /root/.ssh/id_rsa.pub master-2 ssh-copy-id -i /root/.ssh/id_rsa.pub>echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config

第四,分发完成后,逐台手动ssh一下,确认不需要密码。不要只抽查一台,也别直接开始装集群,我发现有些节点因为网络问题或key顺序问题会安静地失败。

6. NTP时间同步:集群稳定运行的生命线

时间同步在大数据集群里属于“看着不重要,出事就要命”的配置。很多人装完CDH后,发现DataNode心跳断断续续,Zookeeper连接老断开,查了半天才发现节点时间差了十几秒。

6.1 时间不同步的后果

HDFS的NameNode会把DataNode的block报告和心跳信息打上时间戳,如果DataNode时间和NameNode时间偏差过大,NameNode会判断该DataNode已经失联,开始进入副本复制流程,造成大量不必要的网络IO。Zookeeper严格依赖时间顺序来维持事务ID的递增,时间乱跳会导致会话失效、Leader选举异常。如果集群还接了Kerberos认证,时间偏移超过5分钟直接拿不到票据。

最要命的是,时间同步问题通常不是突然爆发的,而是慢慢积累到一定程度才触发阈值。到那时候你已经很难回头定位是哪一天开始漂移的。所以,NTP必须在所有节点上从一开始就配置好。

6.2 配置NTP的具体步骤

先安装NTP服务:

yum install -y ntp

然后确定时间源。有两种常见方案:一是全部节点连接外网NTP服务器,适合能访问外网的环境;二是在内网没有NTP服务的情况下,选一台Master节点做时间服务器,其他节点指向它。

如果是外网NTP,编辑/etc/ntp.conf,把server行指向公共NTP或公司内网的时间源。如果是内网独立集群,Master节点的ntp.conf可以保持指向外网或配置为一台权威源,而其他节点配置为指向Master节点:

# Master节点的 /etc/ntp.conf server ntp1.aliyun.com iburst server ntp2.aliyun.com iburst # Worker和其他节点的 /etc/ntp.conf server master-1 iburst

配置完后,先做一次立即同步,避免一直等ntpd慢慢收敛。如果你的节点时间差了好几个小时,直接启动ntpd可能会因拒绝步进而不愿意同步,所以先用ntpdate手动校准一次:

systemctl stop ntpd ntpdate -u master-1 systemctl start ntpd systemctl enable ntpd

再顺手把硬件时钟也设成UTC对齐,防止下次重启后系统时间又被硬件时钟带偏:

hwclock --systohc

6.3 时间校准后的验证

配置完成不等于工作完成,NTP这种服务要持续观察。用ntpq -p查看同步状态:

ntpq -p

重点看remote列是否有时间源的地址,以及offset列的值。offset越小越好,超过50ms就要警惕了。稳定运行一段时间后,如果offset持续增长,说明NTP服务可能没有正常工作,或者网络有严重延迟。

另外,Cloudera Manager本身也有时间检查项。如果部署时CM页面报“时钟偏移过大”类似的警告,基本可以断定NTP配置有问题。我建议你把ntp配置放到环境准备检查清单里,部署前统一跑一遍,而不是等CM检查弹警告。

7. 文件句柄与内核参数:顺手设置的隐藏关卡

如果说前面几节是明面上的坑,那这一节设置的参数就属于“默认值也能跑但迟早出问题”的类型。CDH部署完以后,系统里会同时运行很多Java进程,每个进程都要占用文件句柄和线程资源。默认的1024或4096限制根本扛不住。

7.1 limits.conf 合理值

/etc/security/limits.conf是用来配置用户资源限制的地方。CDH官方建议把文件句柄和进程数同时调大。这里不要只设置root或者hdfs用户,建议用*通配,让所有用户都继承这个限制。

cat >> /etc/security/limits.conf <<'EOF' * soft nofile 32768 * hard nofile 32768 * soft nproc 65536 * hard nproc 65536 EOF

nofile是文件句柄数,nproc是进程数上限。这两个值设置后,默认情况下当前终端不会立刻生效,需要重新登录或重启。检查是否生效:

ulimit -n ulimit -u

如果你设置完发现ulimit -n还是1024,说明可能被/etc/security/limits.d/*.conf里的配置覆盖了。CentOS系统里通常会有一份90-nproc.conf或者其他文件,注意把冲突项一起改掉。

还有一个容易踩的坑:在Linux下,limits.conf对通过systemd启动的服务不生效。CDH的agent进程如果是通过systemd管理的,可能需要额外配置。不过我实际部署中,CDH的agent是通过SysV风格脚本启动的,所以limits.conf能正常接管。如果你发现调了limits但agent进程仍显示老限制,可以用systemctl edit给对应服务单独加LimitNOFILE。

7.2 sysctl.conf 关键项

内核参数调优是另一块。CDH集群中比较关键的几个参数如下:

cat >> /etc/sysctl.conf <<'EOF' vm.swappiness = 1 vm.max_map_count = 262144 net.core.somaxconn = 2048 EOF sysctl -p

vm.swappiness刚才讲过,控制在1左右即可。vm.max_map_count主要影响Java进程能创建的内存映射区域数量,默认值65530在某些场景下不够用,容易出现“Too many open files”或mmap失败。我把它调到262144是一个比较常见且稳妥的值。

net.core.somaxconn影响TCP连接队列长度,高并发环境下适当调高一些,能缓解组件之间连接堆积的问题。

另外还有一些参数比如vm.overcommit_memory,有些人喜欢设为1来保证HBase的大内存分配不失败,但我建议保持默认值,因为overcommit模式并不适合所有业务。不同组件会向内核申请内存,overcommit反响很难说。除非你遇到了明显的内存分配问题再针对调。

7.3 让参数永久生效

永久生效靠两个地方:sysctl.conf和rc.local。sysctl.conf由sysctl -p加载,重启后系统自动加载,没问题。rc.local则需要确认有执行权限。CentOS 7默认/ect/rc.d/rc.local可能没有可执行权限,记得:

chmod +x /etc/rc.d/rc.local

这样里面写的THP关闭命令才会在开机时执行。

在生产环境里,我建议把这些参数收敛到一个初始化配置脚本里,在所有节点统一跑一遍。比手动一台台敲命令可靠得多,也不容易漏配置。后面我会给大家留一个自检脚本,可以直接复制用。

8. 一套顺手的环境自检脚本与常见坑排查

环境准备做得怎么样,不能靠“我觉得没问题”,必须有一份可以机械执行的检查清单。这里我分享一个自检脚本和一张排查表。

8.1 环境自检脚本

这个脚本设计成在每台节点上单独执行,把前面讲过的检查项全部扫一遍,输出关键状态。因为是自检用,不追求复杂,关键是直观。

#!/bin/bash echo "===== 1. 主机名 =====" hostname echo "===== 2. hosts解析 =====" ping -c1 -W1 "$(hostname)" >/dev/null 2>&1 && echo "hostname解析OK" || echo "hostname解析失败" echo "===== 3. SELinux状态 =====" getenforce echo "===== 4. 防火墙状态 =====" systemctl is-active firewalld 2>/dev/null || echo "firewalld未运行" systemctl is-active iptables 2>/dev/null || echo "iptables未运行" echo "===== 5. 透明大页THP =====" cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag echo "===== 6. swappiness =====" sysctl vm.swappiness echo "===== 7. 文件句柄与进程数限制 =====" ulimit -n ulimit -u echo "===== 8. JDK版本 =====" java -version 2>&1 | head -1 echo "JAVA_HOME=$JAVA_HOME" echo "===== 9. NTP同步状态 =====" ntpq -p 2>/dev/null | head -10 || echo "ntpq不可用" echo "===== 10. 磁盘挂载 =====" df -h | grep -E "^/dev|Filesystem"

检查时重点关注几个输出:SELinux显示Disabled,THP的enabled和defrag都显示[never],swappiness是1,ulimit -n不小于32768,NTP有输出并且offset不大。

如果你自己有批量操作工具,可以把脚本分发到所有节点循环执行,把输出统一收集起来看,效率高很多。

8.2 常见报错和排查对照表

下面的表格是我在实际部署和帮人排查时遇到最多的几类问题,直接对照排查可以省掉很多时间。

症状根因解决办法
CM添加主机时提示“Unable to determine hostname”hosts解析异常或主机名格式不规范检查/etc/hosts和hostname,去掉下划线、大写字符
Agent安装后启动失败,提示权限不足SELinux未关闭或残留设置确认SELINUX=disabled,重启系统
CM页面显示主机时钟偏移过大NTP未配置或时钟步进异常校准NTP,保证ntpd运行,重启验证
部署过程中找不到JDK版本JAVA_HOME未配置或路径不对检查java -version和JAVA_HOME,确认每台节点一致
角色反复重启,日志里有“Too many open files”nofile限制太小调大limits.conf后重新登录验证
YARN NodeManager无法启动,报fork失败nproc进程限制过小调大nproc,确认root和业务用户一致
HBase集群整体性能差、卡顿THP开启导致关闭透明大页并持久化配置
parcel分发很慢或中途失败磁盘空间不足确认/opt/cloudera/parcels所在目录剩余空间充足

8.3 下一步之前必须完成的最后确认

环境检查做完后,我还有一个习惯:把所有节点的IP、主机名、角色、数据盘挂载点、JDK路径全部整理成一张表,放在安装文档首页。看似多花十分钟,但等真正操作CM界面的时候,你会发现不用来回翻各种记录。

这套环境准备做完,下一步就可以开始下载安装包、初始化数据库、启动管理端服务了。我个人在实际操作中的体会是:环境准备这步,做得越细,后面CM界面里的操作就越轻松。真正安装CDH5.14.0的图形化过程反而没什么好讲的,最多就是下一屏、选版本、选服务、点继续。真正区分一次部署流程是顺利还是灾难的,就是今天这篇里讲的这些前置工作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询