CDH5.14.0集群环境准备:从主机规划到系统调优完整指南

发布时间:2026/10/16 10:57:45
CDH5.14.0集群环境准备:从主机规划到系统调优完整指南
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、MariaDBmaster-18C16G系统盘200GNameNode、ResourceManager、Hive Metastore、Zookeepermaster-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 iptablesSELinux一定要设为disabled。很多部署失败的诡异权限问题比如Agent没权限写临时文件、组件进程起不来最终定位都是SELinux在捣乱。修改/etc/selinux/config把SELINUXenforcing改成SELINUXdisabled然后重启系统生效。如果你暂时不想重启至少执行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 --systohc6.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 EOFnofile是文件句柄数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 -pvm.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 21 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 21 | 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显示DisabledTHP的enabled和defrag都显示[never]swappiness是1ulimit -n不小于32768NTP有输出并且offset不大。如果你自己有批量操作工具可以把脚本分发到所有节点循环执行把输出统一收集起来看效率高很多。8.2 常见报错和排查对照表下面的表格是我在实际部署和帮人排查时遇到最多的几类问题直接对照排查可以省掉很多时间。症状根因解决办法CM添加主机时提示“Unable to determine hostname”hosts解析异常或主机名格式不规范检查/etc/hosts和hostname去掉下划线、大写字符Agent安装后启动失败提示权限不足SELinux未关闭或残留设置确认SELINUXdisabled重启系统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的图形化过程反而没什么好讲的最多就是下一屏、选版本、选服务、点继续。真正区分一次部署流程是顺利还是灾难的就是今天这篇里讲的这些前置工作。