跳到主要内容

常见问题

HiDataPlus HDP 3.3.2 常见问题 FAQ

写死环境(所有脚本默认基于以下常量,复制粘贴即跑,不要改)

  • 4 台节点:master1(176) / master2(177) / node1(178) / node2(179)
  • Ambari 2.7.8.0-213 / HDP 3.3.2.0-013
  • MySQL on master1:root=123456;ambari=ambari/ambari;hive=hive/hive;atlas=atlas/Atlas123456;rangeradmin=rangeradmin/rangeradmin;rangerkms=rangerkms/rangerkms;oozie=oozie/oozie
  • 数据目录:/hadoop/hdfs/*/hadoop/yarn/*/hadoop/zookeeper/*
  • HiDataPlus 本地源(ambari/HDP/HDP-GPL/HDP-UTILS):master1 Nginx 分发

目录索引

分类问题
A. 部署前置 & YUM/RPMQ1:yum 安装 Ambari/HDP 报 No package xxx available
Q2:yum install ambari-agent 报缺 python2-devel / python2-setuptools / mysql 缺 /usr/bin/perl(「已存在的 RPM 数据库问题」)
Q3:Ambari Agent 注册失败 / Heartbeat lost
B. HDFS 启动Q4:NameNode 启不来,Ambari 一直重试 safemode get / Connection refused to master1:8020
Q5:NN 绿了但 DataNode 全挂(All specified directories have failed to load / clusterID mismatch)
C. YARN 启动Q6:NodeManager 启动卡死 / 页面 stderr/stdout 空
Q7:YARN 卡在 Timeline Service V2.0 Reader waiting master start 120s
D. 元数据 & HiveQ8:Ambari Server 启动失败,报数据库连接错误
Q9:Hive Metastore 启动失败 / 初始化数据库失败
E. 硬重置 & 重装Q10:部署一半卡死,一键推翻重来(软重置:不删 RPM,只清数据+清库)
Q11:RPM 二进制损坏 / 503,彻底 yum 重装(保留 repo/MySQL/Nginx,其他全删)
F. 运维治理Q12:HiDataPlus 安装包版本怎么选?
Q13:日志占满磁盘撑爆系统盘怎么办?(13.2 全组件写死大小/保留策略 + 13.4 crontab 一键安装)
G. 排错兜底排错通用流程

A. 部署前置 & YUM/RPM

Q1:yum 安装 Ambari/HDP 报 No package xxx available

三步必查

# 1. repo 文件齐了没?4 个 ambari/HDP-GPL/HDP-UTILS + 1 个系统 Base Repo(Q2 的那个 CentOS-Base/CentOS7-LocalBase)
ls /etc/yum.repos.d/*.repo
# 【预期】至少有 ambari.repo / HDP.repo / HDP-GPL.repo / HDP-UTILS.repo + CentOS-Base.repo(或 CentOS7-LocalBase.repo)

# 2. 每个 repo 里的 baseurl 能通吗?(拿 master1 的 Nginx 本地源举例)
curl -sI http://master1/ambari/repodata/repomd.xml | head -3
curl -sI http://master1/HDP/centos7/3.x/updates/3.3.2.0-013/repodata/repomd.xml | head -3
# 【预期】HTTP/1.1 200 OK,404/连不上就回去查 Nginx 配置和 /etc/hosts

# 3. 清缓存重建
sudo yum clean all
sudo rm -rf /var/cache/yum/* /var/cache/yum
sudo yum makecache
yum search ambari-server # 必须能搜到

Q2:yum install ambari-agent 报缺 python2-devel / python2-setuptools / mysql 缺 /usr/bin/perl(「已存在的 RPM 数据库问题」)

现象

错误:软件包:ambari-python2-1.0.0-001.x86_64
需要:python2-devel
错误:软件包:ambari-python2-1.0.0-001.x86_64
需要:python2-setuptools
** 发现 3 个已存在的 RPM 数据库问题:
mysql-community-server-5.7.16-1.el7.x86_64 有缺少的需求 /usr/bin/perl
mysql-community-server-5.7.16-1.el7.x86_64 有缺少的需求 perl(Getopt::Long)

根因(二者叠加):

  1. 系统 Base Repo 缺失python2-devel / python2-setuptools / perl系统 RPM不在 Ambari / HDP / HDP-UTILS 本地源里。手上只有 Minimal ISO 的话里面根本没有这些包。
  2. RPM 数据库索引脏/var/lib/rpm/__db.* 损坏,即使后来装了 perl 也显示缺。

方案 A(99% 场景,能连外网就用):CentOS Vault 阿里云镜像

CentOS 7 已于 2024-06-30 EOL,官方 mirror 下线,阿里云 vault 是最稳定的国内源(7.9.2009 包最全,7.x 全系通用)。

# ========== A1. 写 CentOS-Base.repo(4 台全执行)==========
sudo tee /etc/yum.repos.d/CentOS-Base.repo <<'REPO'
[base]
name=CentOS-7 - Base - Aliyun Vault
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/
gpgcheck=0
enabled=1
priority=1

[updates]
name=CentOS-7 - Updates - Aliyun Vault
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/updates/x86_64/
gpgcheck=0
enabled=1
priority=1

[extras]
name=CentOS-7 - Extras - Aliyun Vault
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/extras/x86_64/
gpgcheck=0
enabled=1
priority=1
REPO

# ========== A2. 修 RPM 索引 + 重建缓存 ==========
sudo rm -f /var/lib/rpm/__db.*
sudo rpm --rebuilddb
sudo yum clean all
sudo rm -rf /var/cache/yum/* /var/cache/yum
sudo yum makecache

# ========== A3. 验证搜包(必须有输出!)==========
sudo yum list available python2-devel python2-setuptools perl

# ========== A4. 装前置依赖 + 强制验证 ==========
sudo yum install -y python2 python2-devel python2-setuptools python-rpm-macros python-rpm-generators
sudo yum install -y perl perl-libs perl-JSON perl-Data-Dumper perl-Getopt-Long perl-Carp perl-Exporter
sudo yum install -y mysql-community-libs-compat 2>/dev/null || true # master1 有 MySQL 的兜个底
for PKG in python2-devel python2-setuptools perl; do
rpm -q "$PKG" >/dev/null 2>&1 && echo "[OK] $PKG" || echo "[MISSING] $PKG"
done

3 个全 OK 后再执行:

sudo yum install -y ambari-agent
# master1 额外:
sudo yum install -y ambari-server

方案 B(完全无外网):CentOS7 Everything/DVD ISO 挂本地 Base Repo

⚠️ Minimal ISO 不行! 必须是 CentOS-7-x86_64-Everything-2009.iso(~10GB)或 CentOS-7-x86_64-DVD-2009.iso(~4.4GB)。

Step1:只在 master1 执行(挂到 Nginx 下 4 台共享)

sudo mkdir -p /mnt/cdrom
sudo mount -o loop /home/bigdata/software/CentOS-7-x86_64-Everything-2009.iso /mnt/cdrom
sudo mkdir -p /opt/apps/nginx/html/centos7-base
sudo cp -r /mnt/cdrom/* /opt/apps/nginx/html/centos7-base/
ls /opt/apps/nginx/html/centos7-base/repodata/ | head # 必须有输出

Step2:4 台全执行

sudo tee /etc/yum.repos.d/CentOS7-LocalBase.repo <<'REPO'
[centos7-local-base]
name=CentOS-7 Local Base (master1 nginx)
baseurl=http://master1/centos7-base/
gpgcheck=0
enabled=1
priority=1
REPO

# 后续 A2~A4 跟方案 A 完全相同:修索引 → 清缓存 → makecache → 装依赖 → 验证
sudo rm -f /var/lib/rpm/__db.*
sudo rpm --rebuilddb
sudo yum clean all
sudo rm -rf /var/cache/yum/* /var/cache/yum
sudo yum makecache
sudo yum list available python2-devel python2-setuptools perl
sudo yum install -y python2 python2-devel python2-setuptools python-rpm-macros python-rpm-generators
sudo yum install -y perl perl-libs perl-JSON perl-Data-Dumper perl-Getopt-Long perl-Carp perl-Exporter
for PKG in python2-devel python2-setuptools perl; do
rpm -q "$PKG" >/dev/null 2>&1 && echo "[OK] $PKG" || echo "[MISSING] $PKG"
done

Q3:Ambari Agent 注册失败 / Heartbeat lost

按顺序查,99% 在前 3 条:

# 1. 主机名 & /etc/hosts:4 台互 ping 主机名必须通(不能解析到 127.0.0.1)
ping -c 1 master1 && ping -c 1 master2 && ping -c 1 node1 && ping -c 1 node2
getent hosts master1 # 必须返回内网 IP,不能是 127.0.0.1

# 2. ambari-agent.ini 里 hostname 是不是 master1(写主机名别写 IP)
sudo grep "^hostname" /etc/ambari-agent/conf/ambari-agent.ini

# 3. 防火墙 / SELinux
sudo systemctl status firewalld | head -3
sudo getenforce
# 关闭:sudo systemctl stop firewalld && sudo systemctl disable firewalld && sudo setenforce 0

# 4. 时间同步(4 台时间差 > 30s Kerberos/Ambari 都会出问题)
date
# 建议 4 台都配 chrony 指向 master1

# 5. 查 Agent 日志(最后 100 行有 ERROR 就是答案)
sudo tail -100 /var/log/ambari-agent/ambari-agent.log

B. HDFS 启动

Q4:NameNode 启不来,Ambari 一直重试 safemode get / Connection refused to master1:8020

Ambari 里那条 safemode get 重试只是「等 NameNode 就绪」,真正的问题是 NameNode 进程本身没启起来。先看日志再动:

sudo tail -200 /var/log/hadoop/hdfs/hadoop-hdfs-namenode-master1.log
日志关键词根因处理
NameNode is not formatteddfs.namenode.name.dir 空或错下方 4.1 方案 A 格式化
Gap in transactions. Expected to be able to read up until at least txid XEdit Log 事务缺口(启停中断)新部署走 4.1 方案 A;有数据走 4.2 方案 B -recover
Incompatible clusterIDs重复 format NN 后 DN 残留旧 ID清 DN 目录 + 重 format(4.1 + 连做 Q5)
QuorumException + JournalNodeHA 场景 JN 没启先 Ambari 启 3 台 JN 变绿,再起 NN
Permission denied + name/currentdfs.namenode.name.dir 属主不是 hdfs:hadoopsudo chown -R hdfs:hadoop /hadoop/hdfs/namenode
Address already in use 8020旧 NN 进程占端口sudo fuser -k 8020/tcp

4.1 前置必查 + 方案 A:清元数据 + 重格式化(新部署无脑用,最稳)

# ===== 前置必查(动手前先确认)=====
df -h /hadoop # 盘满了直接起不来
ping -c 1 master1 # 主机名解析
sudo systemctl stop firewalld; sudo setenforce 0

# ===== 去 Ambari → HDFS → Stop,全部变红再动 =====
# 1. 每台 NN(master1 + HA master2):
sudo rm -rf /hadoop/hdfs/namenode/*
# 2. 每台 DN(4 台都勾了 DN 就 4 台):
sudo rm -rf /hadoop/hdfs/data/*
# 3. HA 场景跑 JN 的 3 台(master1/master2/node1):
sudo rm -rf /hadoop/hdfs/journal/*

# ===== 只在 master1 一台 format(绝对不要在 master2 再 format)=====
sudo su - hdfs -c "/usr/hdp/current/hadoop-hdfs-namenode/bin/hdfs namenode -format -force -clusterid hdp332"
# 双 NN HA master2 bootstrapStandby:
# sudo su - hdfs -c "/usr/hdp/current/hadoop-hdfs-namenode/bin/hdfs namenode -bootstrapStandby -force"

# ===== Ambari HDFS Start All 变绿后验证 =====
sudo su - hdfs -c "hdfs dfsadmin -safemode get" # Safe mode is OFF
sudo su - hdfs -c "hdfs dfsadmin -report" # 所有 DN 上报

💡 如果 Ambari 向导页一直 Retrying 卡死,刷新没用的话直接 sudo ambari-server restart 重置任务状态。


4.2 方案 B:保留数据 -recover(新部署不推荐)

sudo su - hdfs -c "/usr/hdp/current/hadoop-hdfs-namenode/bin/hdfs namenode -recover"
# 交互提示跳过损坏段 Y

Q5:NN 绿了但 DataNode 全挂(All specified directories have failed to load / clusterID mismatch)

这是 Q4 重新格式化 NN 后的必然后遗症,两种报错修复方法完全相同:

# ===== 第 1 步:4 台杀干净 DN 进程(空输出才算完)=====
sudo pkill -9 -f DataNode
{ command -v jps >/dev/null 2>&1 && jps ; } | grep DataNode
# 兜底:sudo ps -ef | grep DataNode | grep -v grep

# ===== 第 2 步:4 台连父目录一起删 + 重建 + 授权(只删 data/* 会留隐藏文件/属性)=====
sudo rm -rf /hadoop/hdfs/data
sudo mkdir -p /hadoop/hdfs/data
sudo chown -R hdfs:hadoop /hadoop/hdfs/data
sudo chmod 755 /hadoop/hdfs/data

# ===== 第 3 步:Ambari HDFS → Restart All DataNodes 变绿后验证 =====
sudo su - hdfs -c "hdfs dfsadmin -report" # Live datanodes (N) + Capacity/Used 都有数字

💡 做完 Q4 格式化后直接顺手把这步也在 4 台跑一遍,不要等 Starting DataNode 失败了再回来补。


C. YARN 启动

Q6:NodeManager 启动卡死 / 页面 stderr/stdout 空

页面没内容 ≠ 没报错,真实日志在对应机器本地

# 拿 master2 举例,换成你卡住的节点
# A. Ambari Agent 的 errors/output txt(文件名看页面路径)
sudo cat /var/lib/ambari-agent/data/errors-*.txt 2>/dev/null | tail -50
sudo cat /var/lib/ambari-agent/data/output-*.txt 2>/dev/null | tail -50
# B. NM 自己的运行日志(90% 问题在这)
sudo tail -200 /var/log/hadoop/yarn/yarn-yarn-nodemanager-master2.log
sudo grep -E "ERROR|FATAL|Exception" /var/log/hadoop/yarn/yarn-yarn-nodemanager-master2.log | tail -50
报错关键词根因速修
FileNotFound / Permission denied + yarn/local / yarn/logYARN 目录没建或属主不是 yarn:hadoop下方 6.1 修复包
Address already in use 8041/8042/45454旧 NM 进程占端口sudo pkill -9 -f NodeManager
Recovery is disabled but state exists + nmstate / leveldbNM recovery 开关/路径对不上下方 6.1 修复包
OutOfMemoryError + resource.memory-mbNM 内存超卖Ambari → YARN 调小 yarn.nodemanager.resource.memory-mb(4C8G 别超 4~5G)

6.1 通用修复包(新部署 4 台 NM 无脑跑一遍,覆盖前 3 类问题)

# ===== 4 台全执行 =====
# 1. 杀干净
sudo pkill -9 -f NodeManager
sudo pkill -9 -f ResourceManager
{ command -v jps >/dev/null 2>&1 && jps ; } | grep -E "NodeManager|ResourceManager" # 空 = OK

# 2. 建目录 + 属主
sudo mkdir -p /hadoop/yarn/local /hadoop/yarn/log /hadoop/yarn/tmp
sudo chown -R yarn:hadoop /hadoop/yarn
sudo chmod -R 755 /hadoop/yarn

# 3. 清 NM recovery 残留
sudo find /hadoop/yarn/local -maxdepth 2 -name "nmstate*" -prune -exec rm -rf {} \; 2>/dev/null || true
sudo rm -rf /hadoop/yarn/local/nmstate /hadoop/yarn/local/leveldb /hadoop/yarn/local/filecache /hadoop/yarn/local/usercache

Ambari 里 Cancel 卡死任务 → YARN → Restart All Affected,验证:

sudo su - yarn -c "yarn node -list -all"   # 4 台 RUNNING = OK

Q7:YARN 卡在 Timeline Service V2.0 Reader waiting master start (120s) ...

根因:TS V2 自带嵌入式 HBase(不是单独装的 HBase 服务),对 ZK/HDFS 权限/属主要求特别严,新部署 90% 起不来。新部署无脑关 V2 留 V1 就够了


7.1 推荐方案:关 V2 Reader/Writer(5 分钟搞定)

# ===== 第一步:4 台杀残留进程 =====
sudo pkill -9 -f NodeManager
sudo pkill -9 -f ResourceManager
sudo pkill -9 -f TimelineReader
sudo pkill -9 -f "embedded-yarn-ats-hbase"
sudo pkill -9 -f hbase
{ command -v jps >/dev/null 2>&1 && jps ; } | grep -E "NodeManager|ResourceManager|HMaster|HRegion|Timeline"
# ↑ 必须空输出

# ===== 第二步:4 台清 TS V2 本地目录 + 刷属主 =====
sudo rm -rf /hadoop/yarn/timelineservice /var/lib/hadoop-yarn-hbase /var/run/hadoop-yarn-hbase /var/log/hadoop-yarn-hbase 2>/dev/null || true
sudo chown -R yarn:hadoop /hadoop/yarn
sudo chmod -R 755 /hadoop/yarn

第三步:Ambari Web 改配置 → Services → YARN → Configs 搜 3 个开关:

配置项操作
yarn.timeline-service.v2.reader.enabled取消勾选(就是卡 120s 的那个)
yarn.timeline-service.v2.writer.enabled取消勾选
yarn.timeline-service.enabled保留勾选(V1 留着 Ambari UI 看 Job History)

Save → Restart All Affected → 验证:

sudo su - yarn -c "yarn node -list -all"   # 4 RUNNING = OK

7.2 非要用 TS V2?(不推荐,后续还会踩坑)

先在卡死那台(通常 node1)看嵌入式 HBase 日志:

sudo ls -la /var/log/hadoop-yarn-hbase/yarn-ats/
sudo tail -200 /var/log/hadoop-yarn-hbase/yarn-ats/hbase-yarn-ats-master-node1.log
sudo tail -200 /var/log/hadoop-yarn-hbase/yarn-ats/hbase-yarn-ats-regionserver-node1.log
报错根因修法
ZK ConnectionLoss / Cannot open channelZK 没全启Ambari 确认 3 台 ZK 变绿,各台 sudo su - zookeeper -c "zkServer.sh status"
Permission denied + /hadoop/yarn/timelineservice目录属主应该是 yarn-ats 不是 yarnsudo chown -R yarn-ats:hadoop /hadoop/yarn/timelineservice
Permission denied + HDFS /atsv2HDFS 根目录属主错sudo su - hdfs -c "hdfs dfs -mkdir -p /atsv2 && hdfs dfs -chown -R yarn-ats:hadoop /atsv2"
Address already in use 16000/16010/16020/16030旧进程占端口sudo netstat -tlnp \| grep -E "16000\|16010\|16020\|16030"kill -9 <PID>

D. 元数据 & Hive

Q8:Ambari Server 启动失败,报数据库连接错误

# 1. MySQL 允许 ambari 用户从远程(不是只有 localhost)登录
mysql -uroot -p'123456' -e "SELECT host,user FROM mysql.user WHERE user='ambari'; SHOW GRANTS FOR 'ambari'@'%';"
# 没授权的话补:
# GRANT ALL PRIVILEGES ON ambari.* TO 'ambari'@'%' IDENTIFIED BY 'ambari'; FLUSH PRIVILEGES;

# 2. MySQL 5.7 用 mysql_native_password;MySQL 8+ 必须改密码加密方式(否则 ambari 客户端连不上)
mysql -uroot -p'123456' -e "ALTER USER 'ambari'@'%' IDENTIFIED WITH mysql_native_password BY 'ambari'; FLUSH PRIVILEGES;"

# 3. 手动用 ambari 用户试连(直接测 JDBC 那套参数)
mysql -uambari -p'ambari' -hmaster1 -P 3306 ambari -e "SELECT 1;"

Q9:Hive Metastore 启动失败 / 初始化数据库失败

-- 1. 单独建 hive 库 + 授权(不要复用 ambari 库)
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;
FLUSH PRIVILEGES;

Ambari → Hive → Configs → 找到「Existing MySQL Database」:

  • Database Host:写 master1,别写 localhost(localhost 会走 socket 不认授权的 @'%'
  • 填好用户名密码后先点 Test Connection 变绿,再 Deploy

E. 硬重置 & 重装

Q10:部署一半卡死,一键推翻重来(软重置:不删 RPM,只清数据 + 清库)

适用:RPM 本身没问题、想最快重来一次。保留所有 .repo/.jar/MySQL/Nginx,只清 HDFS/YARN/ZK 数据 + 6 个元数据库。

# ===== 第 1 步:4 台全执行(停进程 + 清数据目录 + 重建属主)=====
sudo systemctl stop ambari-agent
sudo pkill -9 -f "NodeManager|ResourceManager|NameNode|DataNode|JournalNode|ZKFailoverController"
sudo pkill -9 -f "HMaster|HRegion|TimelineReader|hbase|hbase-daemon|embedded-yarn-ats-hbase|HQuorumPeer"
sudo pkill -9 -f "RunJar|oozie|HiveMetaStore|HiveServer2|atlas|ranger|infra-solr|kafka"
sleep 2
# 确认空输出
{ command -v jps >/dev/null 2>&1 && jps | grep -v Jps ; } || sudo ps -ef | grep -E "NodeManager|ResourceManager|NameNode|DataNode|JournalNode|ZKFailoverController|HMaster|HRegion|TimelineReader|hbase|oozie|HiveMetaStore|HiveServer2|atlas|ranger|infra-solr|kafka|HQuorumPeer" | grep -v grep

# 清 HDFS/YARN/ZK 数据 + 重建
sudo rm -rf /hadoop/hdfs/namenode/* /hadoop/hdfs/data/* /hadoop/hdfs/journal/* /hadoop/hdfs/tmp/*
sudo rm -rf /hadoop/yarn/local/* /hadoop/yarn/log/* /hadoop/yarn/tmp/* /hadoop/yarn/timelineservice
sudo rm -rf /hadoop/zookeeper/* /hadoop/zookeeper/version-2
sudo rm -rf /var/lib/hadoop-yarn-hbase /var/run/hadoop-yarn-hbase /var/log/hadoop-yarn-hbase 2>/dev/null || true

sudo mkdir -p /hadoop/hdfs/namenode /hadoop/hdfs/data /hadoop/hdfs/journal /hadoop/hdfs/tmp \
/hadoop/yarn/local /hadoop/yarn/log /hadoop/yarn/tmp /hadoop/zookeeper
sudo chown -R hdfs:hadoop /hadoop/hdfs
sudo chown -R yarn:hadoop /hadoop/yarn
sudo chown -R zookeeper:hadoop /hadoop/zookeeper
sudo chmod -R 755 /hadoop

# 清 Ambari Agent 缓存
sudo rm -rf /var/lib/ambari-agent/data/* /var/lib/ambari-agent/cache/* 2>/dev/null || true
# ===== 第 2 步:只在 master1 执行(清 Server + 删 6 个元数据库重建 + 灌 DDL + setup)=====
sudo ambari-server stop 2>/dev/null || true
sudo rm -rf /var/lib/ambari-server/data/* /var/log/ambari-server/* /var/run/ambari-server/* /var/lib/ambari-server/resources/.cache 2>/dev/null || true

mysql -uroot -p'123456' -e "
SET FOREIGN_KEY_CHECKS=0;
DROP DATABASE IF EXISTS ambari; DROP DATABASE IF EXISTS hive; DROP DATABASE IF EXISTS oozie;
DROP DATABASE IF EXISTS atlas; DROP DATABASE IF EXISTS ranger; DROP DATABASE IF EXISTS rangerkms;
SET FOREIGN_KEY_CHECKS=1;
CREATE DATABASE ambari CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE hive CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE oozie CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE atlas CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE ranger CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE rangerkms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 用户
CREATE USER IF NOT EXISTS 'ambari'@'%' IDENTIFIED BY 'ambari';
CREATE USER IF NOT EXISTS 'ambari'@'localhost' IDENTIFIED BY 'ambari';
CREATE USER IF NOT EXISTS 'hive'@'%' IDENTIFIED BY 'hive';
CREATE USER IF NOT EXISTS 'hive'@'localhost' IDENTIFIED BY 'hive';
CREATE USER IF NOT EXISTS 'atlas'@'%' IDENTIFIED BY 'Atlas123456';
CREATE USER IF NOT EXISTS 'atlas'@'localhost' IDENTIFIED BY 'Atlas123456';
CREATE USER IF NOT EXISTS 'rangeradmin'@'%' IDENTIFIED BY 'rangeradmin';
CREATE USER IF NOT EXISTS 'rangeradmin'@'localhost' IDENTIFIED BY 'rangeradmin';
CREATE USER IF NOT EXISTS 'rangerkms'@'%' IDENTIFIED BY 'rangerkms';
CREATE USER IF NOT EXISTS 'oozie'@'%' IDENTIFIED BY 'oozie';
CREATE USER IF NOT EXISTS 'oozie'@'localhost' IDENTIFIED BY 'oozie';
-- 授权
GRANT ALL PRIVILEGES ON ambari.* TO 'ambari'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON ambari.* TO 'ambari'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON atlas.* TO 'atlas'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON atlas.* TO 'atlas'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON ranger.* TO 'rangeradmin'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON ranger.* TO 'rangeradmin'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON rangerkms.* TO 'rangerkms'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON oozie.* TO 'oozie'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON oozie.* TO 'oozie'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;"

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

# ambari-server setup 交互选项写死:
# Customize user account for ambari-server daemon [y/n] (n)? → y
# User account for ambari-server daemon (root): → 回车
# Do you want to change Oracle JDK [y/n] (n)? → n
# Enter advanced database configuration [y/n] (n)? → y
# Enter choice (1): → 3(MySQL)
# Hostname (localhost): → master1
# Port/Database name/Username:全部回车默认
# Enter Database Password:ambari
# Should I run the Ambari Server database DDL? (y)? → n(上面已经灌过了)
# Proceed with configuring remote database connection properties [y/n] (y)? → y
# Should I start ambari-server now? [y/n] (y)? → n
sudo ambari-server setup

# 注册 JDBC + 启动
sudo ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java-5.1.27-bin.jar
sudo ambari-server start
sleep 20
# ===== 第 3 步:4 台启 ambari-agent =====
sudo systemctl start ambari-agent

回 Web 重跑向导必改 2 点(别再踩):

  1. YARN Configs:关 TS V2 + 调 NM 内存
配置项
yarn.timeline-service.v2.reader.enabledfalse / 取消勾选
yarn.timeline-service.v2.writer.enabledfalse / 取消勾选
yarn.timeline-service.enabledtrue / 勾选(留 V1)
yarn.nodemanager.resource.memory-mb4096 ~ 5120(4C8G)
  1. Atlas Advanced application-properties
字段填值
atlas.audit.hbase.zookeeper.quorummaster1:2181,master2:2181,node1:2181
atlas.graph.index.search.solr.zookeeper-urlmaster1:2181,master2:2181,node1:2181/solr
atlas.graph.storage.hostnamemaster1,master2,node1
  1. 所有组件(Hive/Atlas/Ranger/Oozie)的 Database Host 一律写 master1,别写 localhost

Q11:RPM 二进制损坏 / 503,彻底 yum 重装(保留 repo/MySQL/Nginx,其他全删)

适用:Q10 软重置完还 503 / Ambari Server 起不来 / ADMIN_VIEW 初始化失败。保留 /etc/yum.repos.d/*.repo、MySQL、Nginx 本地源,其余 Ambari/HDP/Hadoop/ZK 全删 yum 重装。

# ===== 第 1 步:4 台全执行(停+杀进程,同 Q10 第 1 步)=====
sudo systemctl stop ambari-agent
sudo systemctl stop ambari-server 2>/dev/null || true
sudo /usr/sbin/ambari-server stop 2>/dev/null || true
sudo pkill -9 -f "NodeManager|ResourceManager|NameNode|DataNode|JournalNode|ZKFailoverController"
sudo pkill -9 -f "HMaster|HRegion|TimelineReader|hbase|hbase-daemon|embedded-yarn-ats-hbase|HQuorumPeer"
sudo pkill -9 -f "RunJar|oozie|HiveMetaStore|HiveServer2|atlas|ranger|infra-solr|kafka|Kinit"
sudo pkill -9 -f "AmbariServer|ambari-server|ambari-agent|jetty|postmaster"
sleep 3
{ command -v jps >/dev/null 2>&1 && jps | grep -v Jps ; } || sudo ps -ef | grep -E "NodeManager|ResourceManager|NameNode|DataNode|JournalNode|ZKFailoverController|HMaster|HRegion|TimelineReader|hbase|oozie|HiveMetaStore|HiveServer2|atlas|ranger|infra-solr|kafka|AmbariServer|ambari" | grep -v grep
# ↑ 空 = OK
# ===== 第 2 步:4 台全执行(修 RPM → 补 Base Repo → 装前置依赖 → 卸所有大数据 RPM)=====
# 执行顺序:A→B→C→D,不能跳!跳过任何一步 yum install ambari-agent 必报缺依赖。

# --- A. 修 RPM 数据库索引(修「已存在的 RPM 数据库问题」标准做法)---
sudo rm -f /var/lib/rpm/__db.*
sudo rpm --rebuilddb
# yum check 不要跑!会卡,真有依赖问题在 D 步安装时暴露

# --- B. 检测 + 补系统 Base Repo(python2-devel/perl 不在 HDP 本地源里,必须有 Base Repo)---
BASE_REPO_OK=$(sudo yum repolist enabled 2>/dev/null | awk '{print $1}' | grep -Ei "^(base|updates|centos|rhel|os|c7-media|centos7-local)" | head -1)
echo "检测到系统 base repo: $BASE_REPO_OK"
if [ -z "$BASE_REPO_OK" ]; then
echo "❌ 没 Base Repo!直接跳到本 FAQ 的【Q2:方案 A 或方案 B】执行完再回来继续"
# 不要 exit,让你自行中断去补
fi

# --- C. 装前置依赖 + 验证(缺一个都不能往下走)---
sudo yum install -y python2 python2-devel python2-setuptools python-rpm-macros python-rpm-generators
sudo yum install -y perl perl-libs perl-JSON perl-Data-Dumper perl-Getopt-Long perl-Carp perl-Exporter
for PKG in python2-devel python2-setuptools perl; do
rpm -q "$PKG" >/dev/null 2>&1 && echo "[OK] $PKG" || echo "[MISSING] $PKG,先补 Base Repo"
done

# --- D. 一次性卸载所有 Ambari/HDP/Hadoop/ZK/组件 RPM(正则兜底,包含下划线版本如 flink_3_3_2_0_013)---
# 先卸残留下划线版本
RESIDUE=$(sudo rpm -qa --qf '%{NAME}\n' | grep -E "_[0-9]+_[0-9]+")
echo "残留下划线版本包: $RESIDUE"
if [ -n "$RESIDUE" ]; then sudo rpm -e --nodeps $RESIDUE; fi
# 再卸所有大数据包
PACKAGES=$(sudo rpm -qa --qf '%{NAME}\n' | grep -Ei "(^|[_-])(ambari|hdp|hadoop|hdfs|yarn|mapred|hive|hbase|zookeeper|atlas|ranger|oozie|spark|spark2|spark3|tez|kafka|storm|flume|sqoop|phoenix|druid|superset|smartsense|infra-solr|solr|flink|bigtop|bigtop-utils|mysql-connector-java|hdp-select)([_-]|\$)")
echo "Will remove: $PACKAGES"
[ -n "$PACKAGES" ] && sudo rpm -e --nodeps $PACKAGES 2>&1 | tail -20
# 验证都没了(空输出 = OK)
sudo rpm -qa --qf '%{NAME}\n' | grep -Ei "(^|[_-])(ambari|hdp|hadoop|hive|hbase|zookeeper|atlas|ranger|oozie|spark|spark2|spark3|tez|kafka|infra-solr|solr|flink|bigtop|hdp-select)([_-]|\$)"
# 清缓存
sudo yum clean all
sudo rm -rf /var/cache/yum/* /var/cache/yum
# ===== 第 3 步:4 台全执行(删所有 Ambari/HDP 目录 + 重建 /hadoop 属主)=====
# 不会删的:/etc/yum.repos.d/*repo、/home/bigdata/software/*、/opt/apps/nginx/html/*、MySQL 数据目录
sudo rm -rf /etc/ambari-server /etc/ambari-agent /usr/lib/ambari-server /usr/lib/ambari-agent \
/usr/sbin/ambari-server /usr/sbin/ambari-agent \
/var/lib/ambari-server /var/lib/ambari-agent /var/log/ambari-server /var/log/ambari-agent \
/var/run/ambari-server /var/run/ambari-agent \
/usr/share/ambari-server /usr/share/ambari-agent /usr/share/doc/ambari*
sudo rm -rf /usr/hdp /usr/lib/hadoop* /usr/lib/hive* /usr/lib/hbase* /usr/lib/zookeeper* /usr/lib/oozie* /usr/lib/atlas* /usr/lib/ranger* /usr/lib/spark* /usr/lib/tez* /usr/lib/kafka* /usr/lib/bigtop* /usr/lib/phoenix* /usr/lib/solr* /usr/lib/flink*
sudo rm -rf /etc/hadoop* /etc/hive* /etc/hbase* /etc/zookeeper* /etc/oozie* /etc/atlas* /etc/ranger* /etc/spark* /etc/tez /etc/kafka /etc/solr*
sudo rm -rf /var/lib/hadoop* /var/lib/hive* /var/lib/hbase* /var/lib/zookeeper* /var/lib/oozie* /var/lib/atlas* /var/lib/ranger* /var/lib/spark* /var/lib/kafka* /var/lib/solr* /var/lib/ambari-metrics* /var/lib/flink*
sudo rm -rf /var/log/hadoop* /var/log/hive* /var/log/hbase* /var/log/zookeeper* /var/log/oozie* /var/log/atlas* /var/log/ranger* /var/log/spark* /var/log/kafka* /var/log/solr* /var/log/yarn /var/log/ambari-metrics* /var/log/flink*
sudo rm -rf /var/run/hadoop* /var/run/hive* /var/run/hbase* /var/run/zookeeper* /var/run/oozie* /var/run/atlas* /var/run/ranger* /var/run/spark* /var/run/kafka* /var/run/solr* /var/run/yarn /var/run/flink*
# /hadoop 数据目录(保留父目录,只清子目录)
sudo rm -rf /hadoop/*
sudo mkdir -p /hadoop/hdfs/namenode /hadoop/hdfs/data /hadoop/hdfs/journal /hadoop/hdfs/tmp \
/hadoop/yarn/local /hadoop/yarn/log /hadoop/yarn/tmp /hadoop/zookeeper
sudo chown -R hdfs:hadoop /hadoop/hdfs 2>/dev/null || sudo chown -R root:root /hadoop/hdfs
sudo chown -R yarn:hadoop /hadoop/yarn 2>/dev/null || sudo chown -R root:root /hadoop/yarn
sudo chown -R zookeeper:hadoop /hadoop/zookeeper 2>/dev/null || sudo chown -R root:root /hadoop/zookeeper
sudo chmod -R 755 /hadoop
# 特殊残留:TS V2 嵌入式 HBase + MySQL JDBC 软链
sudo rm -rf /var/lib/hadoop-yarn-hbase /var/run/hadoop-yarn-hbase /var/log/hadoop-yarn-hbase /hadoop/yarn/timelineservice
sudo rm -f /usr/lib/ambari-server/resources/mysql-connector-java.jar /var/lib/ambari-server/resources/mysql-connector-java.jar
# ===== 第 4 步:只在 master1 执行(删 MySQL 6 库 + 重建 + 重授权,同 Q10 第 2 步)=====
mysql -uroot -p'123456' -e "
SET FOREIGN_KEY_CHECKS=0;
DROP DATABASE IF EXISTS ambari; DROP DATABASE IF EXISTS hive; DROP DATABASE IF EXISTS oozie;
DROP DATABASE IF EXISTS atlas; DROP DATABASE IF EXISTS ranger; DROP DATABASE IF EXISTS rangerkms;
SET FOREIGN_KEY_CHECKS=1;
CREATE DATABASE ambari CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE hive CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE oozie CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE atlas CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE ranger CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE rangerkms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'ambari'@'%' IDENTIFIED BY 'ambari';
CREATE USER IF NOT EXISTS 'ambari'@'localhost' IDENTIFIED BY 'ambari';
CREATE USER IF NOT EXISTS 'hive'@'%' IDENTIFIED BY 'hive';
CREATE USER IF NOT EXISTS 'hive'@'localhost' IDENTIFIED BY 'hive';
CREATE USER IF NOT EXISTS 'atlas'@'%' IDENTIFIED BY 'Atlas123456';
CREATE USER IF NOT EXISTS 'atlas'@'localhost' IDENTIFIED BY 'Atlas123456';
CREATE USER IF NOT EXISTS 'rangeradmin'@'%' IDENTIFIED BY 'rangeradmin';
CREATE USER IF NOT EXISTS 'rangeradmin'@'localhost' IDENTIFIED BY 'rangeradmin';
CREATE USER IF NOT EXISTS 'rangerkms'@'%' IDENTIFIED BY 'rangerkms';
CREATE USER IF NOT EXISTS 'oozie'@'%' IDENTIFIED BY 'oozie';
CREATE USER IF NOT EXISTS 'oozie'@'localhost' IDENTIFIED BY 'oozie';
GRANT ALL PRIVILEGES ON ambari.* TO 'ambari'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON ambari.* TO 'ambari'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON atlas.* TO 'atlas'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON atlas.* TO 'atlas'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON ranger.* TO 'rangeradmin'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON ranger.* TO 'rangeradmin'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON rangerkms.* TO 'rangerkms'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON oozie.* TO 'oozie'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON oozie.* TO 'oozie'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;"
mysql -uroot -p'123456' -e "SHOW DATABASES; SELECT host,user FROM mysql.user WHERE user IN ('ambari','hive','atlas','rangeradmin','rangerkms','oozie') ORDER BY user,host;"
# ===== 第 5 步:4 台全执行(重装 Ambari Agent,master1 额外装 Server)=====
sudo yum clean all
sudo rm -rf /var/cache/yum/* /var/cache/yum
sudo yum makecache
# 前置依赖兜个底(第 2 步已经装过,这里再确认一次)
sudo yum install -y python2 python2-devel python2-setuptools python-rpm-macros
sudo yum install -y perl perl-JSON perl-Data-Dumper perl-libs
sudo yum install -y mysql-community-libs-compat 2>/dev/null || true
# 装 Agent(4 台)
sudo yum install -y ambari-agent
# 装 Server(只有 master1,其他 3 台别跑这行!)
sudo yum install -y ambari-server
# 验证
rpm -qa | grep -E "ambari-agent|ambari-server"
# 【预期】4 台都有 ambari-agent-2.7.8.0-213,master1 多 ambari-server-2.7.8.0-213
# ===== 第 6 步:回到安装部署.md 正常往下走 =====
# 严格按顺序:
# 安装部署.md §3 配置 MySQL JDBC 驱动(仅 master1)
# §4 安装 Ambari Server(灌 DDL → setup,交互选项写死同 Q10)
# §5 安装 Ambari Agent(4 台,ambari-agent.ini hostname=master1)
# §6 Ambari Web 向导(YARN 必关 TS V2 reader/writer;Atlas 3 个 ZK/Solr 地址写死;所有 Database Host 写 master1)

F. 运维治理

Q12:HiDataPlus 安装包版本怎么选?

  • 稳定生产部署:HDP 3.3.2.0-013(本文档版本)+ Ambari 2.7.8.0-213,不要用实验/RC 版本
  • Ambari 版本必须和 HDP 发行版严格对应,见网盘目录说明文件

Q13:日志占满磁盘撑爆系统盘怎么办?

按「紧急清理 → 逐个组件写死滚动阈值 → logrotate 兜底 + crontab 清理脚本 → 监控告警」顺序处理。所有参数下面全部写死,复制粘贴即生效,不需要再纠结改多大。


13.1 紧急:立刻释放空间(已经撑爆了先跑这个)

# ===== 1) 先找 Top 20 大文件 / 大目录,确认是日志在涨 =====
df -h
du -sh /* 2>/dev/null | sort -hr | head -20
du -sh /var/log/* 2>/dev/null | sort -hr | head -20
du -sh /hadoop/* 2>/dev/null | sort -hr | head -20

# ===== 2) truncate 清(绝对不要直接 rm,进程句柄没释放空间不会真的还)=====
# Ambari
truncate -s 0 /var/log/ambari-server/ambari-server.log
truncate -s 0 /var/log/ambari-agent/ambari-agent.log
# HDFS
truncate -s 0 /var/log/hadoop/hdfs/hadoop-hdfs-namenode-*.log
truncate -s 0 /var/log/hadoop/hdfs/hadoop-hdfs-datanode-*.log
truncate -s 0 /var/log/hadoop/hdfs/hadoop-hdfs-journalnode-*.log
truncate -s 0 /var/log/hadoop/hdfs/Audit.log 2>/dev/null || true
# YARN
truncate -s 0 /var/log/hadoop/yarn/yarn-yarn-resourcemanager-*.log
truncate -s 0 /var/log/hadoop/yarn/yarn-yarn-nodemanager-*.log
truncate -s 0 /var/log/hadoop/yarn/yarn-yarn-timelineservice-*.log 2>/dev/null || true
# Hive / HBase / ZK / Kafka
truncate -s 0 /var/log/hive/hiveserver2.log /var/log/hive/metastore.log 2>/dev/null || true
truncate -s 0 /var/log/hbase/hbase-hbase-master-*.log /var/log/hbase/hbase-hbase-regionserver-*.log 2>/dev/null || true
truncate -s 0 /var/log/zookeeper/zookeeper-zookeeper-server-*.log 2>/dev/null || true
truncate -s 0 /var/log/kafka/server.log 2>/dev/null || true
# 系统日志
truncate -s 0 /var/log/messages /var/log/secure /var/log/cron

# ===== 3) 如果 df 看空间还没释放,用 lsof 找 "deleted but open" 的进程句柄 =====
lsof +L1 2>/dev/null | head -20
# 对应 PID + FD 号:truncate -s 0 /proc/<pid>/fd/<fd>

13.2 日志大小 + 保留策略总览(下面每一项都写死了,照着配就是最优值)

组件单个日志文件大小阈值(滚动触发)保留份数(滚动后最多留几份)等价保留时长估算
Ambari Server / Agent10 MB10 份~100MB / 组件,3~7 天
HDFS(NN / DN / JN + 审计)20 MB(审计 50MB)10 份(审计 7 份)~200MB + 审计 ~350MB,7~14 天
YARN RM / NM 组件日志20 MB10 份~200MB,7~14 天
YARN Container 本地日志(每个容器一份)1 小时后自动删(开聚合后)聚合到 HDFS 保留 30 天
HiveServer2 / Metastore20 MB10 份~200MB,7~14 天
HBase Master / RS20 MB10 份~200MB,7~14 天
ZooKeeper / Kafka20 MB10 份~200MB,7~14 天
Spark / Flink History 日志7 天自动清理7 天
系统级 logrotate 兜底(上面所有组件都兜一份)单日超 50MB 就提前切7 份 + 压缩实际占用再省 70%,7 天
crontab 终极兜底(删老文件 + 截断巨型日志)单日志超 2GB 强制截断到 100MB超过 7 天.log.* / .gz 全删7 天硬上限

13.3 逐个组件配置(全部写死值,复制粘贴照着填)

⚠️ 大数据组件(HDFS/YARN/Hive/HBase/ZK/Kafka/Spark)一律在 Ambari Web 里改,否则下次 Restart 会被 Ambari 用数据库里存的配置把你手动改的文件覆盖回去。只有 Ambari 自己的 log4j 和系统级 logrotate 手动改本机文件。

A. Ambari Server / Agent(本机改文件)

4 台机器都执行

# ===== Ambari Server(只有 master1 有 Server,其他 3 台忽略 Server 段)=====
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
sudo grep -E "MaxFileSize|MaxBackupIndex" /etc/ambari-server/conf/log4j.properties # 确认

# ===== Ambari Agent(4 台都有)=====
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
sudo grep -E "MaxFileSize|MaxBackupIndex" /etc/ambari-agent/conf/log4j.properties # 确认

# ===== 重启生效(master1 两个都重启,其他只重启 agent)=====
sudo systemctl restart ambari-agent 2>/dev/null || true
sudo systemctl restart ambari-server 2>/dev/null || true # 只有 master1 有 server

B. HDFS(Ambari Web 改)

Ambari → Services → HDFS → Configs → 顶部搜索框逐个搜:

你在 Ambari 搜索框里输入找到的配置项改成(写死)说明
hadoop.log.maxfilesizehadoop.log.maxfilesize20MBNN / DN / JN 等组件的滚动阈值
hadoop.log.maxbackupindexhadoop.log.maxbackupindex10保留 10 份
hdfs.audit.loggerhadoop-metrics2.propertieslog4j 的 Audit Appender 行)INFO 改成 WARN审计日志量极大,WARN 级别只写高危操作,不再记录每一个文件读写;生产如果必须保留审计,去 Advanced hdfs-log4jhdfs.audit.log.maxfilesize=50MBhdfs.audit.log.maxbackupindex=7 单独写
dfs.namenode.audit.log 相关Audit 滚动(如果 Ambari 暴露了字段)50MB × 7 份同上

改完 Save → Restart All Affected


C. YARN 组件日志 + Container 日志(Ambari Web 改,量最大的一类,必改)

Ambari → Services → YARN → Configs → 顶部搜索框逐个搜:

搜索关键词配置项改成(写死)说明
yarn.log.maxfilesizeyarn.log.maxfilesize20MBRM / NM 组件日志滚动阈值
yarn.log.maxbackupindexyarn.log.maxbackupindex10保留 10 份
yarn.nodemanager.log-dirsyarn.nodemanager.log-dirs/hadoop/yarn/log(数据盘路径)绝对不要放系统盘,容器日志随便跑一下就几个 GB
yarn.log-aggregation-enableyarn.log-aggregation-enable✅ 勾选 / true开日志聚合到 HDFS,本地容器日志删了还能在 JobHistory 查
yarn.nodemanager.delete.debug-delay-secyarn.nodemanager.delete.debug-delay-sec3600(1 小时)本地 Container 日志 1 小时后自动删
yarn.log-aggregation.retain-secondsyarn.log-aggregation.retain-seconds2592000(30 天)HDFS 上聚合日志保留 30 天
yarn.log-aggregation.retain-check-interval-secondsyarn.log-aggregation.retain-check-interval-seconds86400(1 天扫一次)每天凌晨清理一次过期聚合日志
yarn.nodemanager.resource.memory-mb顺带调一下4096 ~ 5120(4C8G)顺手一起调了,避免后面 OOM
TS V2 相关三个开关v2.reader.enabled / v2.writer.enabled / timeline-service.enabledV2 两个 false,timeline-service true跟 Q7 对齐,顺手一起改

Save → Restart All Affected


D. Hive(Ambari Web 改)

Ambari → Services → Hive → Configs → 搜:

搜索关键词配置项改成(写死)
hive.log.maxfilesizehive.log.maxfilesize20MB
hive.log.maxbackupindexhive.log.maxbackupindex10
hive.audit.logs / hive.audit.loggerHive 审计滚动级别从 INFO 改 WARN;必须要审计的话写 50MB × 7 份

Save → Restart All Affected。


E. HBase / ZooKeeper / Kafka(Ambari Web 改)

三个组件配置方式完全相同,分别进到对应服务的 Advanced xxx-log4j(或搜 log4j):

  • 写死 MaxFileSize=20MBMaxBackupIndex=10
  • Kafka 的 log.retention.hours(消息保留时长,不是日志,是数据)按业务需求来,跟上面组件日志滚动是两回事,别搞混

Save → Restart All Affected。


组件搜索关键词改成(写死)
Spark2 / Spark3spark.history.fs.cleaner.enabledtrue(勾上)
spark.history.fs.cleaner.maxAge7d(7 天)
spark.history.fs.cleaner.interval1d(每天扫)
Flinkhistoryserver.archive.clean-expired-jobs.enabledtrue
historyserver.web.retention-period7(天)

Save → Restart All Affected。


G. 系统级 logrotate 兜底(最后一道防线,4 台都执行)

Ambari 里改的 log4j 只滚动那些进程在写的 log4j 接管的日志;Ambari 没覆盖的、或进程崩了没切成功的日志,靠系统 logrotate 再兜一层

4 台机器全执行(一条命令写完配置 + 立即测试一次)

# 作用:写 /etc/logrotate.d/hdp-logs(全组件),系统 logrotate 每天 /etc/cron.daily/logrotate 自动扫
sudo tee /etc/logrotate.d/hdp-logs <<'EOF'
/var/log/ambari-server/*.log # 作用:Ambari Server 日志
/var/log/ambari-agent/*.log # 作用:Ambari Agent 日志(4 台)
/var/log/hadoop/*/*.log # 作用:HDFS/YARN/MapReduce 所有组件日志(NameNode/DataNode/ResourceManager 等子目录一层)
/var/log/hadoop/*/*.out # 作用:Hadoop 进程 stdout/stderr(.out 一般不由 log4j 切,必须 logrotate 兜底)
/var/log/hive/*.log # 作用:HiveServer2 / Metastore / WebHCat 日志
/var/log/hive/*.out # 作用:Hive 进程 stdout/stderr
/var/log/zookeeper/*.log # 作用:ZK 事务日志外的滚动日志
/var/log/zookeeper/*.out # 作用:ZK 进程 stdout
/var/log/kafka/*.log # 作用:Kafka broker/server.log controller.log 等
/var/log/kafka/*.out # 作用:Kafka 进程 stdout
/var/log/hbase/*.log # 作用:HMaster / RegionServer 日志
/var/log/hbase/*.out # 作用:HBase 进程 stdout
/var/log/atlas/*.log # 作用:Atlas Metadata Server 日志
/var/log/ranger/*.log # 作用:Ranger Admin / Usersync 日志
/var/log/oozie/*.log # 作用:Oozie Server 日志
/var/log/solr/*.log # 作用:Ambari Infra / Atlas 内嵌 Solr 日志
/var/log/infra-solr/*.log # 作用:Infra Solr(另一个常用路径,一起兜)
/var/log/ambari-metrics/*.log # 作用:AMS(Ambari Metrics)日志
{
daily # 作用:默认每天切一次;配合 size=50M 谁先到谁切
missingok # 作用:某组件没装(对应目录不存在)也不报错,继续处理其他路径
rotate 7 # 作用:只留切完后最近 7 份(dateext 按日期刚好 7 天),第 8 份自动删最老
compress # 作用:切完第二天 gzip 压缩(约省 70% 空间,纯文本日志压缩比极高)
delaycompress # 作用:最近一份 .log.1 保持未压缩,tail 排查方便;.log.2 及以后才 gz
notifempty # 作用:文件是 0 字节的不切,避免产生一堆空文件
copytruncate # 作用:【关键】Java/Hadoop 进程一直握着日志文件句柄,rename 切分会让进程继续往旧句柄写。copytruncate:先复制成 .log.1,再把当前文件截成 0,进程无需重启继续写
size 50M # 作用:单日写满 50MB 就提前切,不等 daily 那道坎;双重触发
dateext # 作用:切完文件名带日期(hadoop-hdfs-namenode-master1.log-20260905.gz),一眼知道哪天的
}
EOF
# 作用:/etc/logrotate.d/* 必须是 644 权限 + root 属主,logrotate 才会执行,太松/太紧某些版本拒绝
sudo chmod 644 /etc/logrotate.d/hdp-logs

# 作用:立即强制触发一次(-f = force),验证配置语法有没有写错、路径是不是带空格/符号报错;不报错 = 以后 daily 跑一定不报错
sudo logrotate -f /etc/logrotate.d/hdp-logs
echo "logrotate 兜底脚本 OK,会被系统 crontab 每天 /etc/cron.daily/logrotate 自动调一次"

13.4 crontab 终极兜底(一键安装:删 7 天前老日志 + 截断 2GB 巨型日志 + 清 journalctl/yum)

前面对付的是「正常进程在写的日志」,最怕两种情况:

  1. 某个组件进程疯了写日志,1 小时涨 50G,logrotate/daily 要等 24 小时才跑一次,中间就撑爆了
  2. .log.1 .log.2026xxxx.gz 这些滚出来的旧文件越堆越多

4 台机器全执行(脚本目录统一放 /home/bigdata/shell,和 Ambari 日志清理脚本放一起归 data 用户管;crontab 里仍然以 root 身份执行,因为要写 /var/log/*、删 /hadoop/yarn/log 下的容器日志、做 journalctl 清理):

# ===== 1) 写清理脚本 /home/bigdata/shell/clean-hdp-logs.sh =====
# 作用:确保脚本目录存在;data 用户自己创建,属主天然是 bigdata:bigdata,避免用 sudo tee 导致属主变成 root 后面手动跑不了
mkdir -p /home/bigdata/shell
# 作用:用 heredoc <<'EOF'(单引号)写脚本,不展开 $变量,让脚本里的 LOG_DIRS / RETENTION_DAYS 等原样保留
cat > /home/bigdata/shell/clean-hdp-logs.sh <<'EOF'
#!/bin/bash
# ============================================================
# HiDataPlus HDP 日志终极兜底清理脚本(每日 + 巡检)
# 位置:/home/bigdata/shell/clean-hdp-logs.sh
# 保留策略(全部写死,不要改):
# .log.* / .out.* / .gz 等滚动旧文件:超过 7 天 → 删
# 当前仍在写的 .log / .out:超过 2GB → 强制截断到 100MB(等下次 logrotate 正常切)
# journalctl 系统日志:超过 7 天 / 超过 500MB → 清
# yum 缓存:每次顺手清
# ============================================================
set -u
# 作用:把所有 HDP 组件会写日志的目录集中列出来,for 循环一次扫完;没装的组件对应目录不存在会自动跳过
LOG_DIRS=(
"/var/log/ambari-server" # 作用:Ambari Server Web(master1)
"/var/log/ambari-agent" # 作用:Ambari Agent(4 台)
"/var/log/hadoop" # 作用:HDFS/YARN 所有子日志目录(namenode/datanode/yarn 等)
"/var/log/hive" # 作用:Hive Metastore / HiveServer2
"/var/log/zookeeper" # 作用:ZooKeeper
"/var/log/kafka" # 作用:Kafka Broker
"/var/log/hbase" # 作用:HBase
"/var/log/atlas" # 作用:Atlas 元数据服务
"/var/log/ranger" # 作用:Ranger 权限
"/var/log/oozie" # 作用:Oozie 调度
"/var/log/solr" # 作用:Atlas 内嵌 Solr
"/var/log/infra-solr" # 作用:Ambari Infra Solr
"/var/log/ambari-metrics" # 作用:AMS 监控
"/var/log/flink" # 作用:Flink 历史服务器 / Job 日志
"/var/log/spark2" # 作用:Spark2 HS
"/var/log/spark3" # 作用:Spark3 HS
"/hadoop/yarn/log" # 作用:YARN NodeManager 本地容器 stdout/stderr(application_xxx 目录,经常爆盘的根源)
)
# 作用:魔法数字集中放顶部,以后想改只改这 3 行
RETENTION_DAYS=7 # 作用:滚动旧文件保留天数(超过就删)
TRUNCATE_SIZE_THRESHOLD_G=2 # 作用:当前日志超过多少 GB 触发紧急截断
TRUNCATE_AFTER_MB=100 # 作用:紧急截断后留多少 MB(别留 0,留点最近的报错排障)

# ---- 1. 删除 7 天前的滚动旧文件(.log.1 .log-2026xxxx .log.gz 等等)----
for d in "${LOG_DIRS[@]}"; do
# 作用:某组件没装对应目录不存在 → 跳过,不报错
[ -d "$d" ] || continue
# 作用:-mtime +7 = 修改时间超过 7 天。匹配所有滚动旧文件后缀:log4j 滚出来的 .log.1/.log.2(单数字用 ? 匹配)、logrotate 带日期的 .log-2026xxxx、压缩包 .gz/.xz/.bz2、以及 .out.* 同规则;-delete 直接删,不进回收站
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,防止 logrotate 还没到 daily 就先炸盘)----
LOG_ROOTS=()
# 作用:先把存在的目录收进数组(不存在不加入),后面 find 一次扫完
for d in "${LOG_DIRS[@]}"; do [ -d "$d" ] && LOG_ROOTS+=("$d"); done
# 作用:额外兜一层 /var/log(总有漏网之鱼,比如 /var/log/messages /var/log/secure 这俩系统级大文件)
[ -d "/var/log" ] && LOG_ROOTS+=("/var/log")
if [ "${#LOG_ROOTS[@]}" -gt 0 ]; then
# 作用:只扫当前正在写的 .log / .out(滚动旧文件不会超 2GB),命中 size +2G 一行行喂给 truncate
find "${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,Hadoop/Hive 进程不用重启继续写
truncate -s ${TRUNCATE_AFTER_MB}M "$f" 2>/dev/null || true
done
fi

# ---- 3. systemd journalctl 系统日志 ----
# 作用:systemd journal(/var/log/journal/)完全独立于上面 log4j/logrotate 两套,自己能涨到数 GB;真空上限:超 500MB 或超 7 天,先触发哪个砍哪个
journalctl --vacuum-size=500M 2>/dev/null || true
journalctl --vacuum-time=${RETENTION_DAYS}d 2>/dev/null || true

# ---- 4. yum 缓存顺手清 ----
# 作用:部署阶段反复 yum clean/makecache 会留几百 MB 索引;每次脚本顺手清
yum clean all >/dev/null 2>&1 || true
rm -rf /var/cache/yum/* /var/cache/yum 2>/dev/null || true

exit 0
EOF
# 作用:755 权限给所有用户执行(后面 bigdata 账户 `bash /home/bigdata/shell/clean-hdp-logs.sh` 手动跑也 OK)
chmod 755 /home/bigdata/shell/clean-hdp-logs.sh
# 作用:确保整个 /home/bigdata/shell 属主是 data 用户(前面 cat 方式一般已经是;这里保险,避免旧目录里有 root 遗留文件导致 data 改不了新脚本)
chown -R bigdata:bigdata /home/bigdata/shell 2>/dev/null || true

# ===== 2) 手动跑一次验证 =====
# 作用:以 root 身份手动跑一次(cron 里也是 root 跑),验证脚本语法 + 权限;echo [OK] 一眼就知道没问题
sudo bash /home/bigdata/shell/clean-hdp-logs.sh && echo "[OK] clean-hdp-logs.sh 手动执行成功(脚本位于 /home/bigdata/shell/)"

# ===== 3) 写 crontab:每天 02:30 全量清 + 每 30 分钟紧急巡检截断 2GB 大文件 =====
# 作用:把计划写进 /etc/cron.d/clean-hdp-logs(文件式 crontab,可脚本化、可复制、不绑某个人的 crontab -e)
sudo tee /etc/cron.d/clean-hdp-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,不设全 command not found
MAILTO="" # 作用:关闭默认失败发 root 邮件(没 postfix 会烂在 /var/spool/mail/root 越堆越大)

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

# 作用:每 30 分钟一次紧急巡检,只做「2GB→100MB 截断」那一步(不扫 7 天旧文件省 IO);中午爆盘 30 分钟内一定救回来
*/30 * * * * root find /var/log /hadoop/yarn/log -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 保险
sudo chmod 644 /etc/cron.d/clean-hdp-logs

# ===== 4) 验证脚本 + crontab 生效 =====
echo "--- 脚本文件验证(必须存在且属主 bigdata:bigdata)---"
# 作用:一眼三件事:文件存在(cat/tee 没静默失败)、权限 755、属主 bigdata:bigdata
ls -l /home/bigdata/shell/clean-hdp-logs.sh
echo "--- crontab 生效验证 ---"
# 作用:确认 /etc/cron.d/clean-hdp-logs 真写进去了,包含 SHELL/PATH + 两条任务;空 = 前面 tee 因为权限失败了,回去重跑
sudo cat /etc/cron.d/clean-hdp-logs
echo "crontab OK:全量清理 02:30 跑;巨型日志紧急截断每 30 分钟巡检一次"

13.5 监控告警(最后一道,不要等爆了才知道)

Ambari 自带告警先调阈值:Ambari Web → 顶部 Alerts → 搜索 Host Disk Usage

  • Warning Threshold:70%(原来是 70% 不用改,如果你之前改低了就拉回来)
  • Critical Threshold:90%(超过立刻告警,给你留 10% 的抢救空间)
  • 通知通道:邮件 / 钉钉 / 企业微信(按你 Ambari 里配的来)

shell crontab 兜底告警(最省事,2 行塞进去就行,不用装 Prometheus 也能兜底):

sudo tee /etc/cron.d/disk-alert <<'CRON'
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""

# 每 10 分钟查 / 盘和 /hadoop 挂载点,超过 85% 就写一条 ERROR 到 syslog + 打 stderr(你可以把下面的 curl 钉钉机器人补上)
*/10 * * * * root /bin/bash -c '\
USAGE_ROOT=$(df -P / | awk "NR==2{gsub(/%/,\"\",\$5); print \$5}"); \
USAGE_HADOOP=$(df -P /hadoop 2>/dev/null | awk "NR==2{gsub(/%/,\"\",\$5); print \$5}"); \
[ -n "$USAGE_ROOT" ] && [ "$USAGE_ROOT" -ge 85 ] && logger -t DISK_ALERT "CRITICAL: / usage=${USAGE_ROOT}% on $(hostname)"; \
[ -n "$USAGE_HADOOP" ] && [ "$USAGE_HADOOP" -ge 85 ] && logger -t DISK_ALERT "CRITICAL: /hadoop usage=${USAGE_HADOOP}% on $(hostname)"; \
true'
CRON
sudo chmod 644 /etc/cron.d/disk-alert

要真的推钉钉告警,把下面这行贴进上面 /etc/cron.d/disk-alert 那条脚本里(替换成你自己机器人的 access_tokensecret):

curl -X POST 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"磁盘告警 $(hostname -s): /=${USAGE_ROOT}% /hadoop=${USAGE_HADOOP:-N/A}%\"}}"

G. 排错通用流程

任何组件启动失败,按以下顺序走,不要上来就重装:

  1. 先看 Ambari Web 失败任务的详细日志(点 Host → 组件 → Logs,或 Background Operations 里点具体任务 → 对应主机 → errors-*.txt / output-*.txt
  2. 再看组件本地运行日志(路径汇总:/var/log/ambari-server//var/log/ambari-agent//var/log/hadoop/hdfs//var/log/hadoop/yarn//var/log/hive//var/log/hbase//var/log/zookeeper/),只看最后 100~200 行的 ERROR/FATAL/Exception
  3. 还搞不定再回看本 FAQ 的对应章节;真的冲突堆成山了直接 Q10 软重置 / Q11 彻底重装,比一个个补丁高效得多

官方文档:http://www.hdp.link/docs/intro