跳到主要内容

安装部署

HiDataPlus HDP 3.3.2 安装部署流程

本地 YUM 源部署在 master1(192.168.10.176),Nginx 监听 5000 端口。4 台机器都通过 master1 的 YUM 源安装 Ambari 和 HDP。

0. 安装包准备(master1 上执行)

0.1 安装包清单

所有 tar.gz 包先上传到 master1 的 /home/bigdata/software/ 目录:

ambari-2.7.8.0-213-redhat7-x86_64.tar.gz        # Ambari 本地源(CentOS 7 / RHEL 7)
ambari-2.7.8.0-213-redhat8-x86_64.tar.gz # Ambari 本地源(RHEL 8)
ambari-2.7.8.0-213-redhat9-x86_64.tar.gz # Ambari 本地源(RHEL 9)
ambari-2.7.8.0-213-redhat9-x86_64-kylinv11.tar.gz
HDP-3.3.2.0-013-redhat789-x86_64.tar.gz # HDP 主包
HDP-GPL-3.3.2.0-013-redhat789-x86_64.tar.gz # HDP GPL 包
HDP-UTILS-1.1.0.22-centos789-x86_64.tar.gz # HDP 工具包
sh-utils-1.0.0-001.x86_64.rpm
md5sum_x86_64_redhat.txt

0.2 MySQL JDBC 驱动

【超级会员V8】通过百度网盘分享的文件:mysql-connector-java-5.1.27-bin.jar
链接:https://pan.baidu.com/s/1naDGgfcHbCSzh9-5LpRaGw?pwd=qxyi
提取码:qxyi
复制这段内容打开「百度网盘APP 即可获取」

上传到 master1 的 /home/bigdata/software/ 目录。


1. 搭建本地 YUM 源(仅 master1 执行)

1.1 安装 Nginx(源码编译安装)

安装编译依赖(同时装一下 wget/curl 避免命令找不到):

sudo yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel wget curl

下载 Nginx 源码(master1 上 bigdata 用户执行):

cd /home/bigdata/software

<!-- 方式一:wget -->
wget http://nginx.org/download/nginx-1.24.0.tar.gz

<!-- 方式二:curl(wget 找不到时用这个) -->
curl -O http://nginx.org/download/nginx-1.24.0.tar.gz

如果 master1 没有外网或 DNS 解析不了 nginx.org(报错 Could not resolve host: nginx.org),请在能上网的机器上下载好 nginx-1.24.0.tar.gz,然后用 scp 传到 master1:

<!-- 在能上网的机器执行,192.168.10.176 替换成 master1 实际 IP -->
scp nginx-1.24.0.tar.gz bigdata@192.168.10.176:/home/bigdata/software/

如果连 wget / curl 命令本身也找不到,请先装依赖时一起装:sudo yum install -y wget curl;如果 yum install 也失败(无外网、系统源不可用),那就一律走上面的离线 scp 传包方式。

解压、编译、安装:

cd /home/bigdata/software
tar -zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0

<!-- 推荐:最精简,无外网也能过,去掉 rewrite + ssl + gzip,只剩静态文件服务所需最小集 -->
sudo ./configure \
--prefix=/usr/local/nginx \
--without-http_rewrite_module \
--without-http_gzip_module

<!-- 如系统有 openssl-devel / pcre-devel,想开 SSL/gzip/rewrite 再用: -->
<!--
sudo ./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-pcre
-->

sudo make -j$(nproc)
sudo make install

创建软链、加 nginx 用户:

sudo ln -sf /usr/local/nginx/sbin/nginx /usr/sbin/nginx
sudo ln -sf /usr/local/nginx/conf /etc/nginx

sudo useradd -s /sbin/nologin -M nginx
nginx -v

创建 Nginx 需要的目录:

sudo mkdir -p /opt/apps/nginx/temp
sudo mkdir -p /opt/apps/nginx/cache
sudo mkdir -p /opt/apps/nginx/html
sudo chown -R nginx:nginx /opt/apps/nginx
sudo chown -R nginx:nginx /usr/local/nginx

配置 systemd 服务(源码安装默认没有 systemd unit,手动写一个。配置文件统一用 /etc/nginx/nginx.conf,和我们前面写的一致,避免和源码默认配置混用):

sudo vi /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

生效 systemd:

sudo systemctl daemon-reload
sudo systemctl enable nginx

1.2 配置 Nginx

源码安装的 Nginx 默认不带 conf.d 目录和 include,配置前先建目录+日志目录(如果之前误把 default.conf 创建成了目录,先 sudo rm -rf /etc/nginx/conf.d/default.conf 删除):

sudo mkdir -p /etc/nginx/conf.d
sudo mkdir -p /var/log/nginx
sudo chown -R nginx:nginx /var/log/nginx /usr/local/nginx

/etc/nginx/nginx.conf

sudo vi /etc/nginx/nginx.conf
user nginx;
worker_processes 4;
error_log /var/log/nginx/error.log notice;
pid /usr/local/nginx/logs/nginx.pid;
events {
worker_connections 1000000;
}
http {
include /usr/local/nginx/conf/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr|$remote_user|$time_local'
'|$request|$status|$body_bytes_sent|$http_referer'
'|$http_user_agent|$http_x_forwarded_for|$upstream_addr'
'|$upstream_status|$upstream_response_time|$request_time';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
proxy_connect_timeout 500;
proxy_read_timeout 600;
proxy_send_timeout 500;
proxy_buffer_size 128k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 128k;
proxy_temp_path /opt/apps/nginx/temp;
proxy_cache_path /opt/apps/nginx/cache levels=1:2 keys_zone=cache_one:2000m inactive=1d max_size=30g;
include /etc/nginx/conf.d/*.conf;
}

说明:源码安装因为我们 --without-http_gzip_module 去掉了 gzip,所以这里删掉了 gzip on / gzip_comp_level 等所有 gzip 相关参数;mime.types 路径用源码实际路径 /usr/local/nginx/conf/mime.typespid 路径和 systemd unit 保持一致用 /usr/local/nginx/logs/nginx.pid

/etc/nginx/conf.d/default.conf

sudo vi /etc/nginx/conf.d/default.conf
server {
listen 5000;
server_name localhost;
location / {
root /opt/apps/nginx/html;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8;
}
}

SELinux 关了的情况下启动 Nginx:

sudo setenforce 0
sudo nginx -t
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

验证:浏览器访问 http://192.168.10.176:5000/,能看到 Nginx 索引页即可。

如果访问不了,先临时关 iptables 再试:sudo systemctl stop firewalld

1.3 解压 Ambari + HDP 包到 Nginx 目录

cd /home/bigdata/software

<!-- Ambari 源(根据自己的 OS 选一个,这里以 RHEL/CentOS 7 为例) -->
sudo mkdir -p /opt/apps/nginx/html/ambari
sudo tar -zxf ambari-2.7.8.0-213-redhat7-x86_64.tar.gz -C /opt/apps/nginx/html/ambari

<!-- HDP 主包 -->
sudo mkdir -p /opt/apps/nginx/html/HDP
sudo tar -zxf HDP-3.3.2.0-013-redhat789-x86_64.tar.gz -C /opt/apps/nginx/html/HDP/

<!-- HDP GPL 包 -->
sudo mkdir -p /opt/apps/nginx/html/HDP-GPL
sudo tar -zxf HDP-GPL-3.3.2.0-013-redhat789-x86_64.tar.gz -C /opt/apps/nginx/html/HDP-GPL/

<!-- HDP-UTILS -->
sudo mkdir -p /opt/apps/nginx/html/HDP-UTILS
sudo tar -zxf HDP-UTILS-1.1.0.22-centos789-x86_64.tar.gz -C /opt/apps/nginx/html/HDP-UTILS/

解压完看一下目录结构,确认有 repodata 那一层:

ls /opt/apps/nginx/html/ambari/
ls /opt/apps/nginx/html/HDP/
ls /opt/apps/nginx/html/HDP-GPL/
ls /opt/apps/nginx/html/HDP-UTILS/

典型的层级:

/opt/apps/nginx/html/ambari/2.7.8.0-213/...
/opt/apps/nginx/html/HDP/3.3.2.0-013/...
/opt/apps/nginx/html/HDP-GPL/gpl-3.3.2.0-013/...
/opt/apps/nginx/html/HDP-UTILS/HDP-UTILS/centos7/1.1.0.22/...

1.4 修复 repodata(如有缺失必须重建)

Ambari 包内的 repodata 经常有问题,建议统一用 createrepo 重新生成。HDP/HDP-GPL/HDP-UTILS 同理,如果后续 yum install 报 No more mirrors to try 或 repomd.xml 校验失败,就直接重建。

先装 createrepo:

sudo yum install -y createrepo

按实际解压路径重建 repodata(下面路径按 ls 出来的实际层级调整):

<!-- Ambari -->
sudo createrepo /opt/apps/nginx/html/ambari/2.7.8.0-213/

<!-- HDP -->
sudo createrepo /opt/apps/nginx/html/HDP/3.3.2.0-013/

<!-- HDP-GPL -->
sudo createrepo /opt/apps/nginx/html/HDP-GPL/gpl-3.3.2.0-013/

<!-- HDP-UTILS -->
sudo createrepo /opt/apps/nginx/html/HDP-UTILS/HDP-UTILS/centos7/1.1.0.22/

全部建好再刷新下 Nginx 的目录权限:

sudo chown -R nginx:nginx /opt/apps/nginx/html/

然后浏览器验证 4 个目录都能打开:

http://192.168.10.176:5000/ambari/2.7.8.0-213/repodata/
http://192.168.10.176:5000/HDP/3.3.2.0-013/repodata/
http://192.168.10.176:5000/HDP-GPL/gpl-3.3.2.0-013/repodata/
http://192.168.10.176:5000/HDP-UTILS/HDP-UTILS/centos7/1.1.0.22/repodata/

2. 配置 YUM 客户端(4 台机器全部执行)

4 台机器:master1、master2、node1、node2,都要执行下面的步骤

2.1 写 4 个 repo 文件

sudo vi /etc/yum.repos.d/ambari.repo
#VERSION_NUMBER=2.7.8.0-213
[ambari-2.7.8.0-213]
name=ambari Version - ambari-2.7.8.0-213
baseurl=http://192.168.10.176:5000/ambari/2.7.8.0-213/
gpgcheck=0
enabled=1
priority=1
sudo vi /etc/yum.repos.d/HDP.repo
#VERSION_NUMBER=3.3.2.0-013
[HDP-3.3.2.0-013]
name=HDP Version - HDP-3.3.2.0-013
baseurl=http://192.168.10.176:5000/HDP/3.3.2.0-013/
gpgcheck=0
enabled=1
priority=1
sudo vi /etc/yum.repos.d/HDP-GPL.repo
#VERSION_NUMBER=3.3.2.0-013
[HDP-GPL-3.3.2.0-013]
name=HDP-GPL Version - HDP-GPL-3.3.2.0-013
baseurl=http://192.168.10.176:5000/HDP-GPL/gpl-3.3.2.0-013/
gpgcheck=0
enabled=1
priority=1
sudo vi /etc/yum.repos.d/HDP-UTILS.repo
#VERSION_NUMBER=1.1.0.22
[HDP-UTILS-1.1.0.22]
name=HDP-UTILS Version - HDP-UTILS-1.1.0.22
baseurl=http://192.168.10.176:5000/HDP-UTILS/HDP-UTILS/centos7/1.1.0.22/
gpgcheck=0
enabled=1
priority=1

2.2 禁用系统默认联网源(内网/无外网机器必做!)

4 台机器都是内网、无法解析 mirrors.aliyun.com 等外网域名时,必须把 CentOS-Base / epel / extras 等联网源全部移除或 disabled,否则 yum makecache 会先去扫这些外网源,直接 Could not resolve host 报错,本地源被连带挂掉。

4 台机器都执行(用 xsync 先改 master1 再分发也行):

cd /etc/yum.repos.d/

<!-- 1. 先把不相关的 .repo 全移到 bak 备份目录(比 sed 改 enabled 更彻底,防止漏改) -->
sudo mkdir -p /etc/yum.repos.d/bak
sudo find /etc/yum.repos.d/ -maxdepth 1 -name '*.repo' \
! -name 'ambari.repo' \
! -name 'HDP.repo' \
! -name 'HDP-GPL.repo' \
! -name 'HDP-UTILS.repo' \
-exec sudo mv -f {} /etc/yum.repos.d/bak/ \;

<!-- 2. 确认当前只剩我们本地 4 个 -->
ls /etc/yum.repos.d/*.repo

<!-- 3. 这 4 个确保 enabled=1(以防刚才 mv 时被不小心改掉) -->
for f in ambari.repo HDP.repo HDP-GPL.repo HDP-UTILS.repo; do
[ -f "/etc/yum.repos.d/$f" ] && sudo sed -i 's/enabled=0/enabled=1/g' "/etc/yum.repos.d/$f"
done

之后如果需要离线装 gcc/pcre-devel/net-tools 等系统依赖,要么在禁用前先装好,要么把 CentOS 安装 ISO mount 成本地 base 源再装。

2.3 清理缓存 + 验证源

4 台机器都执行:

sudo yum clean all
sudo rm -rf /var/cache/yum
sudo yum makecache
sudo yum repolist

正常应该能看到 ambari/HDP/HDP-GPL/HDP-UTILS 4 个源都是 enabled: 1。然后 master1 上试下能不能搜到包:

yum search ambari-server
yum search ambari-agent

能搜到就表示源 OK。

2.3 分发脚本把 repo 文件同步到其他机器

如果 master1 上的 xsync 脚本能用(之前环境准备里配的),可以直接:

sudo chmod 777 -R /etc/yum.repos.d/
/home/bigdata/shell/xsync.sh /etc/yum.repos.d/ambari.repo
/home/bigdata/shell/xsync.sh /etc/yum.repos.d/HDP.repo
/home/bigdata/shell/xsync.sh /etc/yum.repos.d/HDP-GPL.repo
/home/bigdata/shell/xsync.sh /etc/yum.repos.d/HDP-UTILS.repo

再到 master2、node1、node2 上分别 sudo yum clean all && sudo yum makecache


3. 配置 MySQL JDBC 驱动(仅 master1 上执行,其他节点不要跑!)

重要:MySQL JDBC 驱动只需要装在 Ambari Server(master1)上。Ambari Server 在 Web 向导里安装 Hive / Oozie 等组件时,会自动把这个 jar 分发到需要的节点,其他节点不要手动执行本节。

sudo mkdir -p /usr/share/java
sudo cp /home/bigdata/software/mysql-connector-java-5.1.27-bin.jar /usr/share/java/
sudo chmod 644 /usr/share/java/mysql-connector-java-5.1.27-bin.jar
ls -l /usr/share/java/mysql-connector-java-5.1.27-bin.jar

如果在其他节点上不慎执行,会报 No such file or directory(因为 jar 没传到那台的 software 目录),直接忽略即可。


4. 安装 Ambari Server(master1)

4.1 安装

sudo yum install ambari-server -y

4.2 初始化 Ambari 元数据库(在 master1 的 MySQL 里执行)

登录 MySQL:

mysql -u root -p'123456'
CREATE DATABASE ambari DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER 'ambari'@'%' IDENTIFIED BY 'ambari';
GRANT ALL PRIVILEGES ON ambari.* TO 'ambari'@'%';
FLUSH PRIVILEGES;

4.3 配置 Ambari Server

sudo ambari-server setup
Customize user account for ambari-server daemon [y/n] (n)? y
Enter user account for ambari-server daemon (root): root

说明:这里的 ambari-server daemon 用户只是决定 ambari-server 进程在 master1 本机用什么身份运行,和 Web 向导里 SSH 到其他机器安装组件用的账号是两回事。你现在 root 没有配置 SSH 免密完全没关系,这里填 root;到后面「Target Hosts」页面的「SSH User Account」填 bigdata,再把 bigdata@master1:~/.ssh/id_rsa 的私钥粘进去即可。

Adjusting ambari-server permissions and ownership...
Checking JDK...
[1] Oracle JDK 1.8 + Java Cryptography Extension (JCE) Policy Files 8
[2] Custom JDK
==============================================================================
Enter choice (1): 2
Path to JAVA_HOME: /home/bigdata/module/jdk1.8.0_161
Validating JDK on Ambari Server...done.
Completing setup...
Configuring database...
Enter advanced database configuration [y/n] (n)? y
==============================================================================
Choose one of the following options:
[1] - PostgreSQL (Embedded)
[2] - Oracle
[3] - MySQL / MariaDB
[4] - PostgreSQL
[5] - Microsoft SQL Server (Tech Preview)
[6] - SQL Anywhere
[7] - BDB
==============================================================================
Enter choice (1): 3
Hostname (localhost): master1
Port (3306): 3306
Database name (ambari): ambari
Username (ambari): ambari
Enter Database Password (bigdata): ambari
Re-enter password: ambari
Configuring ambari database...
Enter full path to custom jdbc driver: /usr/share/java/mysql-connector-java-5.1.27-bin.jar
Configuring remote database connection properties...
WARNING: Before starting Ambari Server, you must run the following DDL directly from the database shell to create the schema:
/var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql
Proceed with configuring remote database connection properties [y/n] (y)? y
Extracting system views...
Adjusting ambari-server permissions and ownership...
Ambari Server 'setup' completed successfully.

4.4 注册 JDBC 驱动(Hive / Oozie 等组件后面需要)

sudo ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java-5.1.27-bin.jar

4.5 把 Ambari 的建表 SQL 导入 MySQL

mysql -uambari -p'ambari' ambari < /var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql

提示密码输入错了就用:mysql -uambari -p ambari,手动输入密码,再 source /var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql

4.6 启动 Ambari Server

sudo ambari-server start

默认端口 8080,浏览器访问 http://192.168.10.176:8080,默认账号密码 admin / admin

如果起不来,看日志:

sudo tail -100 /var/log/ambari-server/ambari-server.log

5. 安装 Ambari Agent(4 台机器全部执行)

5.1 安装

sudo yum install ambari-agent -y

5.2 修改配置,指向 master1

sudo vi /etc/ambari-agent/conf/ambari-agent.ini
[server]
hostname=master1
url_port=8440
secured_url_port=8441
connect_retry_delay=10
max_reconnect_retry_delay=30

5.3 启动 Agent

sudo ambari-agent start
sudo ambari-agent status

正常应该显示 ambari-agent is running。如果不 heartbeat,先检查 agent 日志:

sudo tail -100 /var/log/ambari-agent/ambari-agent.log

常见问题:(1) hostname ping 不通 → 检查 /etc/hosts;(2) master1 8440 端口没开 → 关 iptables;(3) JAVA_HOME 不对 → 在所有节点确认 /etc/profile.d/my_env.sh 被 source 了。


6. Ambari Web 向导创建 HDP 集群

  1. 登录 http://192.168.10.176:8080 → 账号 admin / admin → 点击 Launch Install WizardDeploy new cluster

  2. Cluster Name:集群名(比如 hdp332

  3. Install Options

    • Target Hosts:填入 4 台主机名
      master1
      master2
      node1
      node2
    • SSH User Account:填 bigdata(必须和免密密钥属于的用户一致,你 root 没配免密就不能填 root)
    • SSH Private Key 文本框:粘贴 master1 上 bigdata 用户私钥的全部内容(包括首尾分隔行)。 在 master1 上执行,然后整段复制回来贴:
      cat ~/.ssh/id_rsa

      注意:必须包含 -----BEGIN RSA PRIVATE KEY----- 开头行和 -----END RSA PRIVATE KEY----- 结尾行,少一行都会失败。 如果 cat ~/.ssh/id_rsa 显示 No such file or directory,说明密钥对还没生成,先回到 master1 执行:

      ssh-keygen -t rsa    # 一路回车不设密码
      ssh-copy-id bigdata@master1
      ssh-copy-id bigdata@master2
      ssh-copy-id bigdata@node1
      ssh-copy-id bigdata@node2
      ssh master1 hostname && ssh master2 hostname && ssh node1 hostname && ssh node2 hostname # 验证 4 台都免密
    • SSH Port:22
  4. Version:选择 HiDataPlus HDP 3.3.2 版本。

    要选 Use Local Repository,把 4 个源地址填进去(跟你 yum 客户端配置里的 baseurl 一致):

    Ambari:    http://192.168.10.176:5000/ambari/2.7.8.0-213/
    HDP: http://192.168.10.176:5000/HDP/3.3.2.0-013/
    HDP-GPL: http://192.168.10.176:5000/HDP-GPL/gpl-3.3.2.0-013/
    HDP-UTILS: http://192.168.10.176:5000/HDP-UTILS/HDP-UTILS/centos7/1.1.0.22/
  5. Stack & Services:勾选要装的组件(HDFS / YARN + MapReduce2 / Tez / Hive / ZooKeeper / Ambari Metrics / Grafana / Spark2 / HBase 等,按需勾选)

  6. Assign Masters:按规划分配主角色,参考:

    组件节点
    NameNodemaster1、master2(HA)
    ResourceManagermaster1、master2(HA)
    Hive Metastoremaster1
    HiveServer2master1 / master2
    ZooKeeper Servermaster1、master2、node1
    HMastermaster1、master2
    Spark2 History Servermaster1
    Grafana / Metrics Collectormaster1
  7. Assign Slaves and Clients

    • DataNode / NodeManager:勾选 node1、node2(master 节点按需要也可以勾)
    • ZooKeeper:按上面规划勾 3 台
    • RegionServer:node1、node2
    • Client:全部勾选(或按需)
  8. Customize Services

    ⚠️ 进入本步骤之前必须先做一件事:到 master1 的 MySQL 里执行下面的建库 + 建用户 SQL。不然填完 Credentials 点 Test Connection 会直接报 Unknown database 'hive'Access denied

    -- 在 master1 上先登录 MySQL
    -- mysql -uroot -p123456

    -- ========== Ambari 元数据库 + 用户(ambari-server setup 时一般已执行过,如果没执行过请补上)==========
    CREATE DATABASE IF NOT EXISTS ambari DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
    CREATE USER IF NOT EXISTS 'ambari'@'%' IDENTIFIED BY 'ambari';
    GRANT ALL PRIVILEGES ON ambari.* TO 'ambari'@'%' WITH GRANT OPTION;
    CREATE USER IF NOT EXISTS 'ambari'@'localhost' IDENTIFIED BY 'ambari';
    GRANT ALL PRIVILEGES ON ambari.* TO 'ambari'@'localhost' WITH GRANT OPTION;

    -- ========== 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 Admin(选装,勾选了 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 USER IF NOT EXISTS 'rangeradmin'@'localhost' IDENTIFIED BY 'rangeradmin';
    GRANT ALL PRIVILEGES ON ranger.* TO 'rangeradmin'@'localhost' WITH GRANT OPTION;

    -- ========== Ranger KMS(选装,勾选 Ranger KMS 才执行)==========
    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(选装,勾选 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;
    CREATE USER IF NOT EXISTS 'oozie'@'localhost' IDENTIFIED BY 'oozie';
    GRANT ALL PRIVILEGES ON oozie.* TO 'oozie'@'localhost' WITH GRANT OPTION;

    FLUSH PRIVILEGES;

    执行完验证一下(确保库和用户都齐了再回 Ambari):

    SHOW DATABASES;
    SELECT host, user FROM mysql.user
    WHERE user IN ('ambari','hive','atlas','rangeradmin','rangerkms','oozie')
    ORDER BY user, host;

    然后再处理下面的子步骤:

    • 先看红色警告项,一个个解决(警告项没清完 Deploy 按钮不会亮)
    • 内存参数按机器实际内存比例调,别超卖(典型比例:DataNode 1~2G、NodeManager 容器堆按剩余内存的 70% 给)
    • Ambari Metrics 嵌入式模式选默认即可
    6.8.1 Credentials:统一填账号密码(Please provide credentials for these services)

    勾选 Hive / Atlas / Ranger / Oozie 等组件后,Ambari 会在 Customize Services 顶部弹出一张汇总表 Please provide credentials for these services,要求给各服务设置 Admin 账号和数据库密码。建议直接用下表这套(和环境准备.md 里的建库 SQL 一一对应),不要改,尤其 Atlas 的密码必须满足强度要求:

    服务名(Ambari 显示名)UsernamePassword / Confirm Password对应环境准备.md 里建的库
    Hive Databasehivehive(两遍)hive
    Atlas Admin UseratlasAtlas123456(两遍)⚠️atlas(⚠️ Atlas admin 密码 Ambari 强制:≥10 位、必须同时含字母+数字,且不能包含 " ' \ 反引号)
    (选装)Ranger Admin Userrangeradminrangeradmin(两遍)ranger
    (选装)Ranger KMSrangerkmsrangerkms(两遍)rangerkms
    (选装)Oozie Databaseoozieoozie(两遍)oozie

    如果 Ambari 在这步之前就已经提示 Critical:atlas.admin.password Password should be minimum 10 characters with minimum one alphabet and one numeric. Unsupported special characters are "'`,直接去 Atlas 组件 Configs 搜 atlas.admin.password 改成 Atlas123456 再回来就绿了。环境准备.md 里还配了 ALTER USER 的 SQL,可以直接在 MySQL 里同步用户密码。

    6.8.2 各组件 Database 连接配置页(按组件逐个点 Test Connection)

    填完上面的 Credentials 汇总表后,还要进入每个组件独立的 Database 配置页(比如 Hive → Configs → Advanced 里的 Database 子页、Atlas → Configs → Database 子页),把数据库主机、端口、JDBC URL 写对。推荐配置:

    组件Database TypeDatabase NameUsernamePasswordDatabase HostPortJDBC URL(Ambari 有些版本要手动填)
    HiveMySQLhivehivehivemaster13306jdbc:mysql://master1:3306/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&useSSL=false
    AtlasMySQLatlasatlasAtlas123456master13306jdbc:mysql://master1:3306/atlas?useUnicode=true&characterEncoding=utf8&useSSL=false
    Ranger AdminMySQLrangerrangeradminrangeradminmaster13306同 Atlas,替换 db 名为 ranger
    OozieMySQLoozieoozieooziemaster13306jdbc:mysql://master1:3306/oozie?useSSL=false
    6.8.3 Test Connection 必做 + 常见报错速查

    每个组件配置完必须点 "Test Connection" 显示绿色对勾,再进入下一步。常见失败原因和解决:

    1. 报错 Communications link failure / Can't connect to MySQL server on 'master1' (111)
      • 原因 A:Database Host 写成了 localhost必须改为主机名 master1。Ambari 会把这个连接下发给所有节点(包括 node1/node2),这些节点上的 Hive Client / HBase 也要连 master1 的 MySQL,localhost 在从机上是指向从机自己的。
      • 原因 B:master1 防火墙没关 → 执行 sudo systemctl stop firewalld && sudo systemctl disable firewalld
      • 原因 C:MySQL 只监听 127.0.0.1 → 在 master1 执行 sudo netstat -tlnp | grep 3306,看 0.0.0.0:3306。如果只看到 127.0.0.1:3306,编辑 /etc/my.cnf 去掉 bind-address=127.0.0.1 这行,然后 sudo systemctl restart mysqld
    2. 报错 Access denied for user 'hive'@'master1' (using password: YES)
      • 原因:环境准备.md 里建的用户只授权了 hive@'%' 但没授权 hive@'localhost',或者 SQL 里密码跟这里填的不一致。回到环境准备.md 末尾那段 CREATE USER SQL 重新执行一遍,确保 hive@'%'hive@'localhost' 都存在且密码是 hive
      • 也可以在 master1 手动验证一次:mysql -uhive -phive -h master1 -P 3306 -e "SHOW DATABASES;",这个命令能出结果就代表账号密码+主机+端口都没问题。
    3. 报错 Unknown database 'hive':环境准备.md 里的建库 SQL 没执行,回去执行 CREATE DATABASE hive ... 那段。
    6.8.4 Hive 其它必改项(避免部署后首次使用就报错)
    • JDBC Driver 路径:在 Ambari → Hive → Configs → 搜 JDBC Driver Class Path/usr/share/java/mysql-connector-java-5.1.27-bin.jar(只需要在 Ambari Server 那台有,Ambari 会分发)。
    • JDBC Driver Class:填 com.mysql.jdbc.Driver
    • Existing MySQL / MariaDB Database 选项选「Existing Database」(因为我们已经在 MySQL 里提前建好了 hive 库,不是让 Ambari 新造一个)。
    • Hive Metastore Database Host:填 master1,端口 3306,数据库名 hive
    • Database Username / Database Passwordhive / hive

    以上 Hive 改完点一下 Hive 页面的 Test Connection,成功通过再继续。HBase / Atlas / Ranger 同理,各自组件 Database 页全绿再进入 Review。

    6.8.5 Atlas 组件 Advanced application-properties 红框必填项(4 个 ZK / HBase / Solr 地址 + 密码强度提醒)

    在进这个配置页之前,如果 Ambari 顶部提示 Critical:atlas.admin.passwordPassword should be minimum 10 characters with minimum one alphabet and one numeric. Unsupported special characters are "'` ...,先在 Atlas Configs 搜索框搜 atlas.admin.password,把值统一改成 Atlas123456(同时在 MySQL 里执行 ALTER USER 'atlas'@'%' IDENTIFIED BY 'Atlas123456'; 同步用户密码)。Ambari 新版 Atlas 对 admin 密码有强制强度校验,5 位的 atlas 过不了。

    Atlas 在 Ambari 配置页的 Advanced application-properties 有 3 个标红的必填 ZK/HBase/Solr 地址字段(另外 2 个灰色默认值一般不用改),直接照下面的 3 条填(完全匹配你集群的 4 台规划:master1/master2 = ZK + HMaster,node1 = ZK + RegionServer,ZK 3 节点默认端口 2181):

    Ambari 字段名你填什么(跟你的 4 台机器规划一致)说明
    atlas.audit.hbase.zookeeper.quorummaster1:2181,master2:2181,node1:2181Atlas 审计日志写 HBase,这里是 HBase 对应的 ZooKeeper quorum。必须带端口 2181,逗号分隔,不要有空格
    atlas.graph.index.search.solr.zookeeper-urlmaster1:2181,master2:2181,node1:2181/solrAtlas 用 Solr 做全文索引(SolrCloud 模式),末尾一定要加 /solr(Solr 在 ZK 里的 chroot),前面 quorum 跟上一行一致
    atlas.graph.storage.hostnamemaster1,master2,node1Atlas 的图存储(JanusGraph)后端用 HBase,这里填 HBase 的 ZK quorum。注意这个字段不要加端口,不要加 /hbase 后缀,就逗号分隔的 3 台主机名
    atlas.graph.storage.hbase.tableatlas_janus(默认值别动)存图的 HBase 表名,保持默认即可
    atlas.audit.hbase.tablenameATLAS_ENTITY_AUDIT_EVENTS(默认别动)审计事件表名,默认即可
    atlas.audit.zookeeper.session.timeout.ms60000(默认别动)ZK 会话超时,60s 足够,不用改

    Atlas 填完后再额外检查 3 项(Deploy 前必做,不然 Atlas 服务会启不来):

    1. 确认勾选了 3 个依赖服务(回到 Step5「Stack & Services」或 Ambari 首页看):
      • ✅ ZooKeeper(至少 3 节点,你现在是 master1/master2/node1)
      • ✅ HBase(Atlas 图存储 + 审计都依赖 HBase;没勾的话先去 Add Service 加)
      • Infra Solr(Ambari 自带的 Solr 服务,Ambari 会自动在 ZK 里建 /solr chroot;没勾的话在 Ambari Actions → Add Service 里补装)
    2. 不要手动去 ZK 里提前建 /hbase/solr 这两个 ZNode:HBase / Infra Solr 服务启动时自己会创建,你手动建反而 ACL 不一致,Atlas 启动会因为没有写权限直接报错。
    3. Infra Solr 的 ZK 连接地址也要对齐:Ambari → Infra Solr → Configs → 搜 Solr Zookeeper Ensemble,确认也是 master1:2181,master2:2181,node1:2181/solr(Ambari 一般会自动填,如果空了就按这个补)。
  9. Review → 确认无误点 Deploy,等待安装完成。失败的组件看失败日志。

  10. 安装完成后进入 Summary 页面,确认所有服务 green。


7. 验证(安装完后)

服务默认 UI 地址账号密码
Ambarihttp://192.168.10.176:8080admin / admin
HDFS NameNodehttp://master1:9870-
YARN ResourceManagerhttp://master1:8088-
YARN JobHistoryhttp://master1:19888-
Spark2 Historyhttp://master1:18081-
HBase Masterhttp://master1:16010-
Grafanahttp://master1:3000admin / admin

常见踩坑速查

  1. ambari-server setup 选 Custom JDK 时 JAVA_HOME 路径填错 → 确认 /home/bigdata/module/jdk1.8.0_161/bin/java 存在,所有机器一致。
  2. ambari-agent 起不来,heartbeat 不上ambari-agent.ini 里 hostname 写成 master1 不能是 IP,ping master1 要通;关 iptables。
  3. createrepo 后 yum 还是报错sudo yum clean all && sudo rm -rf /var/cache/yum/* && sudo yum makecache 清缓存重来。
  4. MySQL JDBC 驱动路径 → 必须先 ambari-server setup --jdbc-db=mysql --jdbc-driver=xxx.jar,不然 Hive/Oozie 配置时会报错找不到驱动。
  5. Ambari 建库脚本导入失败 → 确认 MySQL 里 ambari 用户授权了 ambari.*,且字符集是 utf8 / utf8_bin
  6. Web 向导里源地址填错 → 填完记得点 Verify,红色 X 就是 baseurl 不对,对照浏览器里能打开的地址改。
  7. Grafana 启动失败 → 一般是 grafana.iniadmin_password 有特殊字符,或者 /var/lib/grafana 权限问题。

8. Ambari 日志自动删除配置(Ambari Server + Ambari Agent,4 台都执行)

💡 只针对 Ambari 本身的日志/var/log/ambari-server//var/log/ambari-agent/)。HDFS / YARN / Hive / HBase 等组件的日志滚动 + 自动删除方案见《常见问题.md Q13》,不要在这里改。

保留策略写死(不要改,复制即生效): | 维度 | 值 | |---|---| | 单个日志文件滚动阈值 | 10 MB | | Ambari 原生 log4j 保留份数 | 10 份(≈ 100MB 上限) | | 系统 logrotate 兜底保留 | 7 份 + gz 压缩(再省 70% 空间) | | crontab 硬上限 | 超过 7 天.log.* / .gz 直接删;单文件超 2GB 强制截到 100MB |


8.1 Ambari 原生 log4j 滚动(第一步:让 Ambari 进程自己正常切日志)

4 台机器全执行

# ===== 1) Ambari Server log4j.properties(只有 master1 有 server,其他 3 台 sed 匹配不到文件不报错,忽略)=====
# 作用:用 sed in-place 改 Ambari Server 的 log4j 配置:写满 10MB 切一份(MaxFileSize=10MB),最多留 10 份(MaxBackupIndex=10);2>/dev/null || true 让非 master1 没这个文件时不报错
sudo sed -i \
-e 's/^log4j.appender.file.MaxFileSize=.*/log4j.appender.file.MaxFileSize=10MB/' \
-e 's/^log4j.appender.file.MaxBackupIndex=.*/log4j.appender.file.MaxBackupIndex=10/' \
/etc/ambari-server/conf/log4j.properties 2>/dev/null || true
# 作用:让你肉眼确认 sed 真的改到了(不 grep 一眼你根本不知道 sed 有没有因为默认格式不一样没匹配到)
sudo grep -E "MaxFileSize|MaxBackupIndex" /etc/ambari-server/conf/log4j.properties 2>/dev/null || true

# ===== 2) Ambari Agent log4j.properties(4 台都有 agent,必须全部生效)=====
# 作用:同上,改 Ambari Agent 的 log4j:单日志 10MB 滚动,留 10 份。Agent 4 台都有,不能忽略报错(没 2>/dev/null)
sudo sed -i \
-e 's/^log4j.appender.file.MaxFileSize=.*/log4j.appender.file.MaxFileSize=10MB/' \
-e 's/^log4j.appender.file.MaxBackupIndex=.*/log4j.appender.file.MaxBackupIndex=10/' \
/etc/ambari-agent/conf/log4j.properties
# 作用:4 台必须都输出 MaxFileSize=10MB / MaxBackupIndex=10,说明 sed 生效了;没输出回去检查是不是 log4j.properties 行首有空格(那就把上面正则里的 ^ 去掉或加 [[:space:]]*)
echo "--- Ambari Agent log4j 验证 ---"
sudo grep -E "MaxFileSize|MaxBackupIndex" /etc/ambari-agent/conf/log4j.properties

# ===== 3) 重启生效(master1 两个都重启,其他 3 台只重启 agent)=====
# 作用:log4j 配置只在 Java 进程启动时读一次,不重启 = 改了白改,进程还在用内存里旧的默认配置(250MB 无限滚)
sudo systemctl restart ambari-agent 2>/dev/null || true
# 作用:master1 重启 Ambari Server(Web 8080),非 master1 没这个服务忽略报错
sudo systemctl restart ambari-server 2>/dev/null || true

# 作用:确认进程活着(看 systemctl 前 3 行,Active: active (running) 就是 OK)
sudo systemctl status ambari-agent 2>/dev/null | head -3
sudo systemctl status ambari-server 2>/dev/null | head -3

8.2 系统级 logrotate 兜底(第二步:进程崩了 / log4j 配置被回滚也照样切)

Ambari 升级、重新 setup 可能会把 log4j.properties 重置回默认值(默认 MaxFileSize=250MB + 无份数上限,几天就把系统盘撑爆)。再加一层系统级 logrotate,跟 Ambari 进程完全解耦,进程在不在、log4j 改没改都不影响。

4 台机器全执行

# 作用:写 /etc/logrotate.d/ambari-logs —— 系统 logrotate 会扫 /etc/logrotate.d/ 下所有文件,每天由 /etc/cron.daily/logrotate 自动跑一次
sudo tee /etc/logrotate.d/ambari-logs <<'EOF'
/var/log/ambari-server/*.log # 作用:接管 Server 所有 .log
/var/log/ambari-server/*.out # 作用:接管 Server 的 stdout/stderr(.out 一般是 systemd 重定向,log4j 不负责切)
/var/log/ambari-agent/*.log # 作用:接管 Agent 所有 .log(4 台都有)
/var/log/ambari-agent/*.out # 作用:接管 Agent 的 stdout/stderr
{
daily # 作用:默认每天切一次(配合下面的 size=50M:当天写满 50MB 就提前切,不等第二天)
missingok # 作用:有几个目录不存在也不报错(比如非 master1 没 /var/log/ambari-server 就跳过,不中断)
rotate 7 # 作用:只保留切完后最近 7 份(ambari-agent.log-20260905.gz …),第 8 份自动删最老的
compress # 作用:切完第二天用 gzip 压缩,节省约 70% 磁盘(纯文本日志压缩率极高)
delaycompress # 作用:最近一份(.log.1)不压缩,留未压缩版本给你 tail 排查问题;.log.2 及以前才 gz
notifempty # 作用:文件是空的不切,不产生一堆 0 字节空文件
copytruncate # 作用:【最关键一行】Java 进程会一直握着文件句柄,直接 rename/move 后进程还往旧句柄写等于白切。copytruncate 做法是:先完整复制一份内容成 .log.1,再把当前文件截断成 0 字节。Ambari 不用重启就能继续写。
size 50M # 作用:单日写满 50MB 就提前切,不等 daily 那道坎。双重触发(daily + size 谁先到谁切)
dateext # 作用:切完文件名带日期(ambari-agent.log-20260905.gz),一眼就知道是哪天的日志,按 rotate=7 刚好留 7 天
}
EOF
# 作用:logrotate 要求 /etc/logrotate.d/*.conf 的权限 644,太松(可写)或太紧(非 root 可读)有些版本会拒绝执行
sudo chmod 644 /etc/logrotate.d/ambari-logs

# 作用:立即强制触发一次(-f = force),验证配置语法有没有写错、路径存不存在。不报错 = 配置 OK,明天 daily cron 跑一定也 OK
sudo logrotate -f /etc/logrotate.d/ambari-logs
echo "logrotate OK:会被系统 /etc/cron.daily/logrotate 每天自动调一次"

8.3 crontab 终极兜底(第三步:7 天硬上限 + 巨型日志紧急截断)

logrotate 每天只跑一次,如果 Ambari 进程疯写日志(比如 DEBUG 模式、死循环),1 小时爆 50G 等不到 24 小时。再加 crontab 两道巡检:

  • 每天 02:30:全量清理(删 7 天前的滚动旧文件 + journalctl 500MB/7 天 + yum 缓存 + 2GB 巨型日志截断)
  • 每 30 分钟:只做紧急巡检(单日志超 2GB 直接截到 100MB),防止中午/下午突发炸盘

4 台机器全执行(脚本目录统一放 /home/bigdata/shell,和其他 HDP 运维脚本一起归大 data 用户管;crontab 里仍然以 root 身份执行,因为要写 /var/log/*、做 journalctl 清理、truncate root 属主的 Ambari 日志):

# ===== 1) 写清理脚本 /home/bigdata/shell/clean-ambari-logs.sh =====
# 作用:保证脚本目录存在,不存在就创建。data 用户自己建目录属主自然是 bigdata:bigdata,后面不用反复 chown
mkdir -p /home/bigdata/shell
# 作用:用 heredoc <<'EOF' 写脚本文件(单引号 EOF 表示变量不展开,脚本里的 $RETENTION_DAYS 保留原样)
cat > /home/bigdata/shell/clean-ambari-logs.sh <<'EOF'
#!/bin/bash
# 作用:脚本头部写死路径+策略,你以后 /home/bigdata/shell 里 ls 看到这个文件一眼就知道干嘛用的
# Ambari 日志终极兜底(4 台都用)—— 位置:/home/bigdata/shell/clean-ambari-logs.sh
# 保留策略写死:.log.* / .gz 超 7 天删;当前 .log/.out 超 2GB 截到 100MB
set -u
# 作用:魔法数字集中放顶部,以后想改只改这 3 行,不用翻 find 一堆正则
RETENTION_DAYS=7 # 作用:滚动旧文件超过几天 → 删
TRUNCATE_SIZE_THRESHOLD_G=2 # 作用:当前日志超过多少 GB → 触发紧急截断
TRUNCATE_AFTER_MB=100 # 作用:截断后留多少 MB(别截到 0,留点最近日志排障)

# ---- 1. 删除 7 天前的滚动旧文件(.log.1 .log-20260905 .log.gz 等等)----
for d in /var/log/ambari-server /var/log/ambari-agent; do
# 作用:目录不存在就跳过(非 master1 没 ambari-server 目录就不报错)
[ -d "$d" ] || continue
# 作用:find -mtime +7 = 修改时间超过 7 天的文件。匹配所有后缀:.log.1 .out.2 .log-20260905 .log.gz .xz .bz2 ... 全删,不管是 log4j 滚的还是 logrotate 滚的还是手动打包的,超 7 天统一没
find "$d" -type f \( \
-name "*.log.*" -o -name "*.out.*" -o -name "*.gz" -o -name "*.xz" -o -name "*.bz2" \
-o -name "*.log.?" -o -name "*.out.?" \) \
-mtime +${RETENTION_DAYS} -delete 2>/dev/null || true
done

# ---- 2. 巨型当前日志紧急截断(单文件 > 2GB → 截到 100MB)----
AM_LOG_ROOTS=()
# 作用:先把存在的目录收进数组,后面 find 一次扫完,不关心哪台有 server 哪台没有
[ -d "/var/log/ambari-server" ] && AM_LOG_ROOTS+=("/var/log/ambari-server")
[ -d "/var/log/ambari-agent" ] && AM_LOG_ROOTS+=("/var/log/ambari-agent")
if [ "${#AM_LOG_ROOTS[@]}" -gt 0 ]; then
# 作用:只扫当前正在写的 .log / .out(滚动旧文件不会超过 2G,因为 10MB 就切了),命中 size +2G 就用 while read 一行行喂给 truncate
find "${AM_LOG_ROOTS[@]}" -type f \( -name "*.log" -o -name "*.out" \) \
-size +${TRUNCATE_SIZE_THRESHOLD_G}G 2>/dev/null | \
while read -r f; do
# 作用:truncate 不影响进程文件句柄(跟前面 copytruncate 同理),直接把文件缩到 100MB,Ambari 进程不重启继续写
truncate -s ${TRUNCATE_AFTER_MB}M "$f" 2>/dev/null || true
done
fi

# ---- 3. 系统 journalctl + yum 缓存顺手清 ----
# 作用:systemd journal 日志完全独立于上面 log4j/logrotate,自己会涨到数 GB。两个条件真空上限:超 500MB 或超 7 天,先触发哪个砍哪个
journalctl --vacuum-size=500M 2>/dev/null || true
journalctl --vacuum-time=${RETENTION_DAYS}d 2>/dev/null || true
# 作用:部署阶段反复 yum makecache / yum clean all 会在 /var/cache/yum 留下数百 MB 旧索引,顺手清
yum clean all >/dev/null 2>&1 || true
rm -rf /var/cache/yum/* /var/cache/yum 2>/dev/null || true

exit 0
EOF
# 作用:给所有用户执行权限(你后面以 bigdata 登录手动 `bash clean-ambari-logs.sh` 也能跑)
chmod 755 /home/bigdata/shell/clean-ambari-logs.sh
# 作用:收尾再确保一下属主,data 用户自己建的文件一般已经是 bigdata:bigdata;chown -R 是防止目录里之前有 root 建的旧脚本
chown -R bigdata:bigdata /home/bigdata/shell 2>/dev/null || true

# ===== 2) 手动跑一次验证 =====
# 作用:用 sudo bash 强制以 root 跑一次(因为 cron 里也是 root 跑),验证 find/truncate/journalctl/yum 所有命令没有语法错、没有权限错。最后 echo [OK] 你一眼就知道没出错
sudo bash /home/bigdata/shell/clean-ambari-logs.sh && echo "[OK] clean-ambari-logs.sh 手动执行成功(脚本位于 /home/bigdata/shell/)"

# ===== 3) 写 /etc/cron.d/clean-ambari-logs(crontab 计划,统一以 root 身份执行,因为要写 /var/log/* 和 truncate root 属主文件)=====
# 作用:把计划写进 /etc/cron.d/clean-ambari-logs(比 crontab -e 更适合部署脚本:可复制、可脚本化、不绑定某个人的终端 shell)
sudo tee /etc/cron.d/clean-ambari-logs <<'CRON'
SHELL=/bin/bash # 作用:强制用 bash(有些 cron 默认 sh,数组和 [[ ]] 语法会报错)
PATH=/sbin:/bin:/usr/sbin:/usr/bin # 作用:cron 默认 PATH 极短(只有 /usr/bin:/bin),truncate/journalctl/yum 都在 /sbin /usr/sbin,不设 PATH 全是 command not found
MAILTO="" # 作用:cron 跑失败默认给 root 发邮件(一般没配 postfix 就烂在 /var/spool/mail/root 里越堆越大),关掉避免产生新垃圾邮件

# 作用:每天 02:30(业务低峰)root 身份全量执行一次脚本;stdout/stderr 全部追加到 /var/log/clean-ambari-logs.log,以后排障直接 tail 这个文件看执行记录
30 2 * * * root /home/bigdata/shell/clean-ambari-logs.sh >> /var/log/clean-ambari-logs.log 2>&1

# 作用:每 30 分钟一次紧急巡检,只做「2GB→100MB 截断」那一步(不扫 7 天旧文件省 IO)。中午爆盘 30 分钟内一定抢救回来。直接内联 find 一行不调用脚本,更轻。
*/30 * * * * root find /var/log/ambari-server /var/log/ambari-agent -type f \( -name "*.log" -o -name "*.out" \) -size +2G 2>/dev/null | while read -r f; do truncate -s 100M "$f" 2>/dev/null || true; done
CRON
# 作用:/etc/cron.d/* 的权限必须是 644 且属主 root,cron 才会认;chmod 644 保险
sudo chmod 644 /etc/cron.d/clean-ambari-logs

# ===== 4) 确认脚本 + crontab 都生效 =====
echo "--- 脚本文件验证(必须存在且属主正确)---"
# 作用:ls -l 一眼看三件事:文件存在(不是 tee 静默失败没写进去)、权限 755(-rwxr-xr-x)、属主属组 bigdata:bigdata
ls -l /home/bigdata/shell/clean-ambari-logs.sh
echo "--- crontab 生效验证(下面必须有输出)---"
# 作用:确认 cron 文件真的写进去了,前面 PATH/SHELL/两条 30 2 / */30 的定时任务都得在;空 = tee 因为权限问题失败了,回去重跑
sudo cat /etc/cron.d/clean-ambari-logs

8.4 10 秒验收(改完立刻确认三件事都生效了)

4 台机器各执行一次

echo "========== 1. log4j 原生滚动(Ambari Agent 4 台必过,Ambari Server 只有 master1 过)=========="
# 作用:确认 Agent 那条 sed 生效(4 台必过),必须输出 MaxFileSize=10MB / MaxBackupIndex=10
sudo grep -E "MaxFileSize|MaxBackupIndex" /etc/ambari-agent/conf/log4j.properties
# 作用:确认 Server 那条 sed 生效(只有 master1 过,非 master1 提示不存在正常)
sudo grep -E "MaxFileSize|MaxBackupIndex" /etc/ambari-server/conf/log4j.properties 2>/dev/null || echo "(Ambari Server 不存在,非 master1 正常)"

echo "========== 2. logrotate 兜底脚本 =========="
# 作用:确认 /etc/logrotate.d/ambari-logs 存在且有 daily / rotate=7 那几行;空 = 8.2 没成功
sudo cat /etc/logrotate.d/ambari-logs | head -5
# 空 = 没生效,回去跑 8.2

echo "========== 3. crontab 清理计划 =========="
# 作用:确认 cron.d 文件存在、包含 SHELL/PATH 和两条任务(30 2 + */30);空 = 8.3 没成功
sudo cat /etc/cron.d/clean-ambari-logs | head -8
# 空 = 没生效,回去跑 8.3

echo "========== 4. 当前 Ambari 日志占用 =========="
# 作用:看一下当前占用基线(比如 server 4M、agent 2M);以后突然变 80M、100M 一眼就知道没正常滚动
du -sh /var/log/ambari-server 2>/dev/null
du -sh /var/log/ambari-agent

4 步全有输出 = 配置完成,Ambari 日志以后不会再撑爆系统盘。