CDH5集群的部署逻辑和单机Hadoop完全不同,它依赖Cloudera Manager作为控制面,Agent负责把配置和软件包推送到每台节点。部署前如果不把主机名、时间同步、JDK版本和数据库权限处理好,后面即使CM界面显示安装完成,HDFS和YARN也很容易反复异常。本文从环境准备开始,一步步说明CDH5集群的配置流程,并重点汇总实际操作中容易出现的报错。

一、环境准备与节点规划
CDH5集群通常在至少3台物理机或虚拟机上部署,角色可以按管理节点、主节点、数据节点划分。管理节点部署Cloudera Manager Server和数据库,主节点运行NameNode、ResourceManager等,数据节点运行DataNode和NodeManager。主机内存建议每台不低于16GB,系统盘和数据盘分开,/opt和/var/lib/hadoop目录留足剩余空间。所有节点必须使用同一套主机名解析规则,建议在/etc/hosts中配置短主机名与IP映射,避免DNS缓存导致Agent识别失败。
系统层面需要提前关闭防火墙和SELinux,并确保ntpd或chronyd正在同步时间。CDH5对时间差非常敏感,Kerberos认证和HDFS SAFE_MODE判断都会使用时间戳,超过5分钟偏移就可能报错。JDK建议使用Oracle JDK 8,虽然部分CDH5版本支持JDK 7,但JDK 8在GC和内存管理上更稳定。安装JDK后统一配置JAVA_HOME,不要在每台节点使用不同的Java路径。
# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭SELinux setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 配置NTP同步 yum install -y ntp systemctl enable ntpd systemctl start ntpd ntpq -p # 检查JDK版本 java -version
上面的命令在执行后需要逐台验证:systemctl status ntpd应显示运行中,getenforce应返回Disabled,hostname -f返回的完整主机名要和CM添加主机时使用的一致。SSH免密虽然CM可以利用root密码或密钥部署Agent,但提前配置好免密可以减少界面上反复输入密码的麻烦。
二、Cloudera Manager安装与数据库配置
Cloudera Manager Server建议独立部署在管理节点上,Agent则安装到所有数据节点。安装方式可以选择在线yum源,也可以提前下载rpm包到本地。需要先添加Cloudera仓库,再执行yum install cloudera-manager-daemons cloudera-manager-server。CM默认使用内嵌数据库,但生产环境必须切换到MySQL或PostgreSQL,否则元数据规模增大后会出现锁表和数据丢失风险。
数据库侧先创建数据库和用户,并授权管理节点可以远程连接。CDH5的CM Server连接MySQL需要对应版本的JDBC驱动,通常将mysql-connector-java.jar放到/usr/share/java目录下。如果驱动缺失,CM启动初始化时会报找不到驱动类。完成后执行初始化脚本,并注意脚本输出中是否出现成功字样,不要只看到命令执行结束就以为配置完成。
CREATE DATABASE scm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; GRANT ALL ON scm.* TO 'scm'@'%' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES;
# 安装CM Server yum install -y cloudera-manager-daemons cloudera-manager-server # 复制JDBC驱动 cp mysql-connector-java-5.1.49-bin.jar /usr/share/java/mysql-connector-java.jar # 初始化CM数据库 /usr/share/cmf/schema/scm_prepare_database.sh mysql scm scm your_password
数据库初始化完成后启动Cloudera Manager Server,并在防火墙放通7180端口。浏览器打开管理节点IP的7180端口,如果能出现登录页面,说明Server基本正常。若无法打开,优先检查Server日志/var/log/cloudera-scm-server/cloudera-scm-server.log,重点看数据库连接和JDBC驱动相关异常。
三、集群添加与CDH服务部署
登录CM界面后,选择免费版或试用版即可继续。使用CM的添加主机向导,输入所有节点的主机名或IP,并选择通过root账号或密钥安装Agent。Agent安装完成后,CM会自动检测各节点的资源情况。接着进入Parcel配置页面,选择对应的CDH5版本,例如CDH 5.16.2,下载并分发到所有节点。分发过程中可以在CM界面查看每个节点的下载进度,如果某个节点一直停留在0%,说明网络到parcel仓库不可达,需要检查管理节点上的/opt/cloudera/parcel-repo目录和节点间的HTTP端口。
Parcel分发完成后,先不要急着激活,建议检查所有节点的磁盘挂载和目录权限。DataNode的数据目录通常配置为/data/dfs/dn,NameNode元数据目录为/data/dfs/nn,这些目录需要提前创建并设置为hdfs用户可写。激活Parcel后进入集群服务安装向导,选择HDFS、YARN、ZooKeeper、Hive、HBase等服务,并按实际内存调整角色分配。对于小规模测试集群,HDFS副本数可以调整为2,YARN的NodeManager可用内存建议保留系统至少4GB,避免Linux OOM Killer误杀DataNode。
服务首次启动时需要关注各个角色的健康检查。HDFS在首次格式化NameNode时如果发现目录非空,会直接报错,需要手动清理后才能继续。ZooKeeper如果仅配置单节点,CM会显示健康警告,但不影响实验环境使用。NameNode和ResourceManager的Web UI默认端口是50070和8088,可以通过CM中的角色日志快速定位启动失败原因。
四、常见错误与注意事项
CDH5部署中最典型的问题集中在时间不同步、主机名不一致、数据库权限不足和内存分配不当。时间不同步会导致HDFS的NameNode与DataNode之间握手失败,报错类似Connection timed out或Clock skew too great。解决办法是在所有节点执行ntpdate -u管理节点IP,然后重启相关服务。主机名不一致则会让Agent向Server注册时出现Hostname mismatch,需要保证所有节点的hostname -f输出与CM添加时完全一致。
另一个高频错误是MySQL驱动缺失或版本不匹配。CM Server初始化时如果找不到JDBC驱动,日志会明确提示No suitable driver found for jdbc:mysql。此时需要重新下载mysql-connector-java.jar并放到/usr/share/java目录,注意文件名必须是mysql-connector-java.jar,如果使用新版驱动例如8.x,需要调整连接参数,建议仍使用5.1系列驱动。除了JDBC驱动,数据库用户授权要从管理节点IP和主机名两个维度检查,只授权localhost会导致远程连接失败。
内存方面,CDH5会自动根据节点内存生成角色配置,但默认JVM堆内存可能过大,与节点实际可用内存不匹配时会导致服务反复退出。可以在CM中找到每个角色的Java Heap Size配置项,把DataNode堆内存控制在4GB以内,NodeManager堆内存控制在2GB以内,同时为操作系统和Page Cache预留足够空间。磁盘方面,数据目录要避免使用LVM动态扩容,建议直接使用独立挂载点,并禁止在DataNode数据目录里混放临时文件。
此外,Parcel分发失败多与网络代理、DNS或/opt空间不足有关。可以检查管理节点的/var/log/cloudera-scm-server/parcel日志,以及目标节点上的/var/log/cloudera-scm-agent/目录。端口冲突需要提前使用ss -tlnp检查7180、7182、9000、50070、8088、60010等端口是否被占用。所有调整完成后,建议在CM中对集群执行一次全量健康检查,逐项消除红色和黄色告警,再投入任务运行。

