环境准备
部署前环境准备(HDP 3.3.2)
安装部署计划
| 主机 | 规划设置主机名 | 角色 |
|---|---|---|
| 192.168.10.176 | master1 | Ambari Server、MySQL、NameNode、ResourceManager |
| 192.168.10.177 | master2 | NameNode、ResourceManager |
| 192.168.10.178 | node1 | DataNode、NodeManager |
| 192.168.10.179 | node2 | DataNode、NodeManager |
安装包准备
JDK
【超级会员V5】通过百度网盘分享的文件:jdk-8u16…
链接:https://pan.baidu.com/s/1SrpBXR4R0a2-dOZjw5BB2w
提取码:61q4
复制这段内容打开「百度网盘APP 即可获取」
MySQL
【超级会员V5】通过百度网盘分享的文件:mysql
链接:https://pan.baidu.com/s/1VOAylDAn2o9uCkaU-vHS_w
提取码:4dgd
复制这段内容打开「百度网盘APP 即可获取」
Linux 前期准备(所有机器执行)
- 关闭防火墙。
sudo systemctl stop firewalld
sudo systemctl disable firewalld.service
关闭 selinux。
临时关闭(当前立刻生效,重启失效):
sudo setenforce 0永久关闭(必须重启后完全生效,4 台机器都要改):
sudo vi /etc/selinux/config把
SELINUX=enforcing改成:SELINUX=disabled保存退出。确认方式:
<!-- 1. 检查配置文件是否是 disabled(重启后才完全生效) -->
grep ^SELINUX= /etc/selinux/config
<!-- 2. 查看当前状态 -->
getenforcegetenforce在重启前会显示Permissive(因为临时关了 setenforce 0),重启后才显示Disabled,这是正常现象。如果getenforce仍然是Enforcing,要么配置没改对,要么需要重启。
创建大数据对应的用户。
sudo useradd bigdata
sudo passwd bigdata
- 修改用户资源限制。
sudo vi /etc/security/limits.conf
bigdata soft nofile 65536
bigdata hard nofile 65536
bigdata soft nproc 131072
bigdata hard nproc 131072
sudo vi /etc/security/limits.d/20-nproc.conf
bigdata soft nofile 65536
bigdata hard nofile 65536
bigdata soft nproc 131072
bigdata hard nproc 131072
- 配置用户的 sudo 权限。
sudo vim /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
bigdata ALL=(ALL) NOPASSWD:ALL
注意: bigdata 这一行不要直接放到 root 行下面,因为所有用户都属于 wheel 组,你先配置了 bigdata 具有免密功能,但是程序执行到 %wheel 行时,该功能又被覆盖回需要密码。所以 bigdata 要放到 %wheel 这行下面。
- 用户进程最大化使用资源。
sudo sh -c 'echo 1 > /proc/sys/vm/overcommit_memory'
创建对应的目录。
- /home/bigdata/software : 用来放安装包。
- /home/bigdata/module:用来放解压后的安装包。
sudo mkdir /home/bigdata/module
sudo mkdir /home/bigdata/software
sudo mkdir /home/bigdata/shell
sudo chown bigdata:bigdata /home/bigdata/module
sudo chown bigdata:bigdata /home/bigdata/software
sudo chown bigdata:bigdata /home/bigdata/shell
- 卸载 linux 自带的 JDK。
sudo rpm -qa | grep -i java | xargs -n1 sudo rpm -e --nodeps
- 修改主机 hostname。
<!-- 分别修改对应机器的 hostname,注意 hostname 和 /etc/hosts 要一致 -->
sudo vim /etc/hostname
<!-- 对应机器分别执行: -->
sudo hostname master1
sudo hostname master2
sudo hostname node1
sudo hostname node2
- 配置本地 DNS。
把 127.0.0.1 给删除,不然会出现莫名其妙的问题。
sudo vim /etc/hosts
192.168.10.176 master1
192.168.10.177 master2
192.168.10.178 node1
192.168.10.179 node2
- 配置 SSH 免密登录(在 master1 上执行 bigdata 用户)。
su - bigdata
ssh-keygen
ssh-copy-id master1
ssh-copy-id master2
ssh-copy-id node1
ssh-copy-id node2
其他机器也可以按需配置双向免密,确保 Ambari 安装时能无密码通信。
SSH 免密登录常见问题与修复:
- 问题 1:
ssh-copy-id成功后仍然要求输入密码。大概率是 SELinux 没关或 .ssh 权限不对。
<!-- 检查 SELinux,Enforcing 表示开着 -->
getenforce
<!-- 临时关闭(所有机器执行),永久关闭改 /etc/selinux/config 后重启 -->
sudo setenforce 0
- 问题 2:
UNPROTECTED PRIVATE KEY FILE!Permissions 0777 for 'id_rsa' are too open。私钥权限被改成 777 了,SSH 直接拒绝加载。
<!-- master1 bigdata 用户下执行,修复权限 -->
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 700 ~/.ssh
chmod 755 /home/bigdata
<!-- 目标机(master2/node1/node2)上也要保证 authorized_keys 权限正确 -->
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 755 /home/bigdata
<!-- 如遇 SELinux 上下文问题,执行 -->
restorecon -Rv ~/.ssh
- 问题 3:known_hosts 指纹冲突(机器重装后出现)。
<!-- 源机上删除对应主机的旧记录 -->
ssh-keygen -R master2
ssh-keygen -R 192.168.10.177
<!-- 或全部清空 -->
rm -f ~/.ssh/known_hosts
- 定位绝招:
ssh -vvv master2看 verbose 输出,或目标机sudo tail -f /var/log/secure看 sshd 日志。
配置 JDK 环境(所有机器)
- 解压安装包(先在 master1 操作)。
tar -zxvf jdk-8u161-linux-x64.tar.gz -C /home/bigdata/module/
- 配置环境变量。
sudo vim /etc/profile.d/my_env.sh
#JAVA_HOME
export JAVA_HOME=/home/bigdata/module/jdk1.8.0_161
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile.d/my_env.sh
添加集群分发脚本
vi /home/bigdata/shell/xsync.sh
sudo chmod 744 /home/bigdata/shell/xsync.sh
sudo yum install -y rsync
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in master1 master2 node1 node2
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
给予执行权限
sudo chmod 777 /home/bigdata/shell/xsync.sh
安装 linux 集群的同步工具(所有机器执行)
sudo yum install -y rsync
分发 JDK 到其他的机器
/home/bigdata/shell/xsync.sh /home/bigdata/module/jdk1.8.0_161
sudo chmod 777 -R /etc/profile.d/
/home/bigdata/shell/xsync.sh /etc/profile.d/my_env.sh
所有机器都执行
source /etc/profile.d/my_env.sh
验证
java -version
安装 MySQL(仅 master1)
卸载原有的 MySQL
sudo rpm -qa | grep -i mysql
sudo rpm -ev mysql-community-libs-5.7.27-1.el6.x86_64 --nodeps
删除相关文件
sudo find / -name mysql
sudo rm -rf /var/lib/mysql
sudo rm -rf /var/lib/mysql/mysql
sudo rm -rf /etc/logrotate.d/mysql
sudo rm -rf /usr/share/mysql
sudo rm -rf /usr/bin/mysql
sudo rm -rf /usr/lib64/mysql
再次查询
sudo rpm -qa | grep -i mysql
rpm 安装
将 MySQL 的 5 个 rpm 包上传到 master1 的 /home/bigdata/software/mysql/ 目录。
[root@master1 mysql]# ll
total 184536
-rw-r--r-- 1 root root 277604 Oct 28 17:14 01_mysql-community-common-5.7.16-1.el7.x86_64.rpm
-rw-r--r-- 1 root root 2237116 Oct 28 17:14 02_mysql-community-libs-5.7.16-1.el7.x86_64.rpm
-rw-r--r-- 1 root root 2112700 Oct 28 17:14 03_mysql-community-libs-compat-5.7.16-1.el7.x86_64.rpm
-rw-r--r-- 1 root root 25034716 Oct 28 17:14 04_mysql-community-client-5.7.16-1.el7.x86_64.rpm
-rw-r--r-- 1 root root 159295840 Oct 28 17:14 05_mysql-community-server-5.7.16-1.el7.x86_64.rpm
sudo rpm -ivh *.rpm --nodeps --force
查看 mysql 安装的位置
whereis mysql
查看 mysql 的运行状态
sudo systemctl status mysqld
目录授权,这里是存储数据的地方,在 /etc/my.cnf 中配置。如果权限不够,会启动不起来。
重点:ibdata1 必须是
mysql用户可写。仅chmod 777有时仍会报The innodb_system data file 'ibdata1' must be writable,必须先把目录 owner 改为mysql:mysql。推荐用 750 + mysql owner,而不是滥用 777。
sudo chown mysql:mysql -R /var/lib/mysql
sudo chmod 750 -R /var/lib/mysql
修改配置,添加最大的连接数
注意 1:
validate_password_policy和validate_password_length不要在初始化前写进 my.cnf。此时 validate_password 插件尚未加载,直接写会导致mysqld --initialize报unknown variable 'validate_password_policy=0'启动失败。先只加 max_connections,启动成功后再在 SQL 会话内SET GLOBAL。注意 2:如果初始化或启动失败,修复后必须 彻底删除 /var/lib/mysql 整个目录再重建,不能只删里面的文件,否则会残留半初始化的 ibdata1 / ib_logfile,导致下一次
--initialize报data directory has files in it。
sudo vi /etc/my.cnf
[mysqld]
max_connections = 2000
初始化 mysql
sudo yum install libaio
<!-- 0. 关 SELinux(没重启机器的基本还是 Enforcing,直接导致 error 13 Permission denied) -->
sudo setenforce 0
getenforce
<!-- 1. 彻底停进程 + 清 systemd 失败计数 -->
sudo systemctl stop mysqld
sudo systemctl reset-failed mysqld
sudo pkill -9 mysqld
ps -ef | grep mysql
<!-- 2. 彻底重建数据目录 + pid 目录 -->
sudo rm -rf /var/lib/mysql
sudo rm -rf /var/run/mysqld
sudo mkdir -p /var/lib/mysql /var/run/mysqld
<!-- 3. 加权限(owner = mysql:mysql,这是 InnoDB 能否写入 ibdata1 的关键) -->
sudo chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
sudo chmod 750 /var/lib/mysql
sudo chmod 755 /var/run/mysqld
<!-- 4. 恢复 SELinux context(setenforce 0 也执行下,更稳) -->
sudo restorecon -Rv /var/lib/mysql /var/run/mysqld
<!-- 5. 确认权限 -->
sudo ls -ld /var/lib/mysql /var/run/mysqld
<!-- 6. 初始化:必须 --user=mysql 显式指定运行身份 -->
sudo mysqld --initialize --user=mysql --console
查看 Mysql 的密码。运行时出错,也可以查看这个文件。
sudo cat /var/log/mysqld.log | grep 'temporary password'
2023-10-28T09:28:08.553828Z 1 [Note] A temporary password is generated for root@localhost: /fhl:;!3;y_G
启动 mysql
sudo systemctl start mysqld
sudo systemctl enable mysqld
sudo systemctl status mysqld
放开 bigdata 用户通过本地 socket 连接的权限(避免 Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)):
sudo chmod 755 /var/lib/mysql
sudo chmod 777 /var/lib/mysql/mysql.sock
登录 mysql(密码用上面查到的临时密码)
mysql -u root -p'/fhl:;!3;y_G'
修改 root 密码、关闭密码策略并远程授权
注意:如果
IDENTIFIED BY '123456'提示策略错误(Your password does not satisfy the current policy requirements),先改成一个符合策略的强密码(如Abc123!@#),登录成功后再执行SET GLOBAL关掉策略,最后改回123456。
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
SET GLOBAL validate_password_policy=0;
SET GLOBAL validate_password_length=1;
SHOW databases;
USE mysql;
UPDATE user SET host = "%" WHERE user='root';
SELECT host, user, authentication_string, plugin FROM user;
FLUSH privileges;
创建 Ambari / Hive 等需要的用户(按需创建)
⚠️ 注意:Atlas 的密码不能用默认
atlas,Ambari 新版 Atlas 强制要求atlas.admin.password≥ 10 位且必须同时含字母+数字,且不能包含" ' \`` 这几个特殊字符。下文直接用推荐密码 **Atlas123456`**(11 位、字母+数字、无禁用字符)。
CREATE USER 'ambari'@'%' IDENTIFIED BY 'ambari' WITH MAX_USER_CONNECTIONS 1000;
grant all privileges on *.* to 'ambari'@'%' with grant option;
CREATE USER 'hive'@'%' IDENTIFIED BY 'hive' WITH MAX_USER_CONNECTIONS 1000;
grant all privileges on *.* to 'hive'@'%' with grant option;
FLUSH PRIVILEGES;
创建 Hive / Atlas 数据库 + 用户(Ambari 向导「Database / Credentials」页面直接用)
Ambari 在配置 Hive、Atlas 等组件时,会弹出 Please provide credentials for these services 页面,要求填写各服务的数据库账号和密码。推荐直接用下表这一套,和向导填的内容一一对应,不要改密码(尤其 Atlas 要满足强度要求):
| 服务名(Ambari 显示名) | 数据库名 | 用户名 | 推荐密码 | 是否需要提前建库 |
|---|---|---|---|---|
| Hive Database | hive | hive | hive | ✅ 需要 |
| Atlas Admin User | atlas | atlas | Atlas123456 ⚠️ | ✅ 需要(密码必须≥10位、含字母+数字) |
| Ranger Admin(如果安装 Ranger) | ranger | rangeradmin | rangeradmin | ✅ 需要 |
| Ranger KMS(如果安装 Ranger KMS) | rangerkms | rangerkms | rangerkms | ✅ 需要 |
| Oozie(如果安装 Oozie) | oozie | oozie | oozie | ✅ 需要 |
登录 MySQL(mysql -uroot -p123456)后整段执行:
-- ========== Hive ==========
CREATE DATABASE IF NOT EXISTS hive DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'hive'@'%' IDENTIFIED BY 'hive';
GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'%' WITH GRANT OPTION;
CREATE USER IF NOT EXISTS 'hive'@'localhost' IDENTIFIED BY 'hive';
GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'localhost' WITH GRANT OPTION;
-- ========== Atlas(⚠️ 密码必须满足 Ambari 强度:≥10位、字母+数字)==========
CREATE DATABASE IF NOT EXISTS atlas DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'atlas'@'%' IDENTIFIED BY 'Atlas123456';
GRANT ALL PRIVILEGES ON atlas.* TO 'atlas'@'%' WITH GRANT OPTION;
CREATE USER IF NOT EXISTS 'atlas'@'localhost' IDENTIFIED BY 'Atlas123456';
GRANT ALL PRIVILEGES ON atlas.* TO 'atlas'@'localhost' WITH GRANT OPTION;
-- ========== Ranger(可选,仅当你要装 Ranger 组件时执行)==========
CREATE DATABASE IF NOT EXISTS ranger DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'rangeradmin'@'%' IDENTIFIED BY 'rangeradmin';
GRANT ALL PRIVILEGES ON ranger.* TO 'rangeradmin'@'%' WITH GRANT OPTION;
CREATE DATABASE IF NOT EXISTS rangerkms DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'rangerkms'@'%' IDENTIFIED BY 'rangerkms';
GRANT ALL PRIVILEGES ON rangerkms.* TO 'rangerkms'@'%' WITH GRANT OPTION;
-- ========== Oozie(可选)==========
CREATE DATABASE IF NOT EXISTS oozie DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'oozie'@'%' IDENTIFIED BY 'oozie';
GRANT ALL PRIVILEGES ON oozie.* TO 'oozie'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
验证账号和库是否就绪(在 MySQL 里执行):
SHOW DATABASES;
SELECT host, user FROM mysql.user
WHERE user IN ('hive','atlas','rangeradmin','rangerkms','oozie','ambari')
ORDER BY user, host;
如果你已经在 MySQL 里执行过旧的
IDENTIFIED BY 'atlas'的 SQL(5 位短密码),一定要跑下面这段更新,否则 Ambari 向导进入 Atlas 配置页时会直接报 Critical:Password should be minimum 10 characters with minimum one alphabet and one numeric。ALTER USER 'atlas'@'%' IDENTIFIED BY 'Atlas123456';
ALTER USER 'atlas'@'localhost' IDENTIFIED BY 'Atlas123456';
FLUSH PRIVILEGES;
Ambari 向导「Please provide credentials for these services」填写方法
进入到 Ambari 向导的 Credentials 步骤时,按下面 1:1 填写:
| 字段(Ambari 向导里的字段名) | 填什么 | 说明 |
|---|---|---|
| Atlas Admin User → Username | atlas | 对应上面 SQL 的 atlas@% 用户 |
| Atlas Admin User → Password / Confirm Password | Atlas123456(两遍) | ⚠️ 必须是 Atlas123456,短了会被 Ambari 拒 |
| Hive Database → Username | hive | 对应用户 hive@% |
| Hive Database → Password / Confirm Password | hive(两遍) | 没强度要求 |
| (如果你装了 Ranger)Ranger Admin User | rangeradmin / rangeradmin | 同上 |
| (如果你装了 Oozie)Oozie Database | oozie / oozie | 同上 |
然后再到 Ambari 向导的 Database 步骤(Hive / Atlas 组件各自的数据库配置页)填数据库连接:
| 组件 | Database Type | Database Name | Database Username | Database Password | Database Host | Database Port |
|---|---|---|---|---|---|---|
| Hive | MySQL | hive | hive | hive | master1(或 MySQL 实际主机名) | 3306 |
| Atlas | MySQL | atlas | atlas | Atlas123456 | master1 | 3306 |
| Ranger Admin | MySQL | ranger | rangeradmin | rangeradmin | master1 | 3306 |
| Oozie | MySQL | oozie | oozie | oozie | master1 | 3306 |
⚠️ 两个避坑点:
- Database Host 一定要填主机名(
master1),不要填localhost。Ambari 会把这个连接下发给所有节点,DataNode 上的组件也要能连到master1:3306。- 第一次点 "Test Connection" 失败不要慌:先确认你在 MySQL 那台机子上
mysql -uatlas -pAtlas123456 -h master1 -P 3306能不能连上。如果Can't connect to MySQL server:
master1/localhost的映射在/etc/hosts是否写了- 防火墙是否关闭 (
systemctl stop firewalld)- MySQL 3306 是否监听在 0.0.0.0 而不是 127.0.0.1(
netstat -tlnp \| grep 3306看 LISTEN 前面的 IP)
卸载 mysql(出错时使用)
sudo rpm -qa|grep mysql
sudo yum remove $(sudo rpm -qa|grep mysql)
sudo rm -rf /var/lib/mysql
常见报错
1. ibdata1 must be writable / Operating system error number 13(InnoDB 无法写入)
2026-09-04T19:55:08.570212Z 0 [ERROR] InnoDB: Operating system error number 13 in a file operation.
2026-09-04T19:55:08.570249Z 0 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
原因:
- SELinux 仍是 Enforcing,或者
/var/lib/mysql//var/run/mysqld的 owner 不是mysql:mysql,或者- 初始化时没有用
--user=mysql指定运行身份。
解决:走标准重建流程,见上文「初始化 mysql」小节完整步骤。
<!-- 按顺序执行 -->
sudo setenforce 0
sudo systemctl stop mysqld && sudo systemctl reset-failed mysqld && sudo pkill -9 mysqld
sudo rm -rf /var/lib/mysql /var/run/mysqld
sudo mkdir -p /var/lib/mysql /var/run/mysqld
sudo chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
sudo chmod 750 /var/lib/mysql && sudo chmod 755 /var/run/mysqld
sudo restorecon -Rv /var/lib/mysql /var/run/mysqld
sudo mysqld --initialize --user=mysql --console
sudo systemctl start mysqld
2. unknown variable 'validate_password_policy=0'
2026-09-04T19:28:13.469787Z 0 [ERROR] unknown variable 'validate_password_policy=0'
2026-09-04T19:28:13.469836Z 0 [ERROR] Aborting
原因:把 validate_password_policy/length 写进了 my.cnf。mysqld --initialize 阶段 validate_password 插件还没加载,识别不了这些变量。
解决:从 my.cnf 里删除这两行,只保留 max_connections=2000。等 MySQL 启动并登录成功后,再在 SQL 里执行:
SET GLOBAL validate_password_policy=0;
SET GLOBAL validate_password_length=1;
3. data directory has files in it
2026-09-04T19:34:19.285529Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
原因:上一次失败的初始化在 /var/lib/mysql/ 里残留了 ibdata1 / ib_logfile* 等文件。只删了内容没删目录结构。
解决:把整个 /var/lib/mysql 目录删掉再重建,不要只 rm -rf /var/lib/mysql/*。
sudo systemctl stop mysqld
sudo rm -rf /var/lib/mysql
sudo mkdir -p /var/lib/mysql
sudo chown mysql:mysql /var/lib/mysql
sudo chmod 750 /var/lib/mysql
sudo mysqld --initialize --console
4. mysqld.service Failed to start MySQL Server(systemd 层失败)
直接看 mysqld 自己的日志定位(journalctl -xe 只有 systemd 层信息,没实际意义):
sudo tail -100 /var/log/mysqld.log
5. Can't connect to local MySQL server through socket (13)
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)
原因:mysqld 进程是起来了(systemctl status mysqld 显示 active running),但 bigdata 用户没有权限进入 /var/lib/mysql/ 目录读取 socket 文件(error 13 = Permission denied)。之前为了安全把目录权限设成了 750(只有 mysql 用户/组能进),bigdata 既不是 mysql 用户也不在 mysql 组,所以连不上。
解决:放宽目录和 socket 的权限。
sudo chmod 755 /var/lib/mysql
sudo chmod 777 /var/lib/mysql/mysql.sock
然后再登录即可。