跳到主要内容

环境准备

部署前环境准备(HDP 3.3.2)

安装部署计划

主机规划设置主机名角色
192.168.10.176master1Ambari Server、MySQL、NameNode、ResourceManager
192.168.10.177master2NameNode、ResourceManager
192.168.10.178node1DataNode、NodeManager
192.168.10.179node2DataNode、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. 查看当前状态 -->
      getenforce

      getenforce 在重启前会显示 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

修改配置,添加最大的连接数

注意 1validate_password_policyvalidate_password_length 不要在初始化前写进 my.cnf。此时 validate_password 插件尚未加载,直接写会导致 mysqld --initializeunknown variable 'validate_password_policy=0' 启动失败。先只加 max_connections,启动成功后再在 SQL 会话内 SET GLOBAL

注意 2:如果初始化或启动失败,修复后必须 彻底删除 /var/lib/mysql 整个目录再重建,不能只删里面的文件,否则会残留半初始化的 ibdata1 / ib_logfile,导致下一次 --initializedata 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.password10 位且必须同时含字母+数字,且不能包含 " ' \`` 这几个特殊字符。下文直接用推荐密码 **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 Databasehivehivehive✅ 需要
Atlas Admin UseratlasatlasAtlas123456 ⚠️✅ 需要(密码必须≥10位、含字母+数字)
Ranger Admin(如果安装 Ranger)rangerrangeradminrangeradmin✅ 需要
Ranger KMS(如果安装 Ranger KMS)rangerkmsrangerkmsrangerkms✅ 需要
Oozie(如果安装 Oozie)oozieoozieoozie✅ 需要

登录 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 → Usernameatlas对应上面 SQL 的 atlas@% 用户
Atlas Admin User → Password / Confirm PasswordAtlas123456(两遍)⚠️ 必须是 Atlas123456,短了会被 Ambari 拒
Hive Database → Usernamehive对应用户 hive@%
Hive Database → Password / Confirm Passwordhive(两遍)没强度要求
(如果你装了 Ranger)Ranger Admin Userrangeradmin / rangeradmin同上
(如果你装了 Oozie)Oozie Databaseoozie / oozie同上

然后再到 Ambari 向导的 Database 步骤(Hive / Atlas 组件各自的数据库配置页)填数据库连接:

组件Database TypeDatabase NameDatabase UsernameDatabase PasswordDatabase HostDatabase Port
HiveMySQLhivehivehivemaster1(或 MySQL 实际主机名)3306
AtlasMySQLatlasatlasAtlas123456master13306
Ranger AdminMySQLrangerrangeradminrangeradminmaster13306
OozieMySQLoozieoozieooziemaster13306

⚠️ 两个避坑点:

  1. Database Host 一定要填主机名master1),不要填 localhost。Ambari 会把这个连接下发给所有节点,DataNode 上的组件也要能连到 master1:3306
  2. 第一次点 "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.cnfmysqld --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

然后再登录即可。