TT Bigdata TT Bigdata
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop-官方组件
    • 专区—Bigtop-扩展组件
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 核心代码

    • 各组件代码
    • 通用代码模板
  • 国产化&其他系统

    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 支持&共建

    • 蓝图愿景
    • 技术支持
    • 合作共建
登陆
GitHub (opens new window)

JaneTTR

数据酿造智慧,每一滴都是沉淀!
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop-官方组件
    • 专区—Bigtop-扩展组件
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 核心代码

    • 各组件代码
    • 通用代码模板
  • 国产化&其他系统

    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 支持&共建

    • 蓝图愿景
    • 技术支持
    • 合作共建
登陆
GitHub (opens new window)
  • Ambari快速部署

    • 适用于2.8.0-el7
    • 适用于2.8.0-el7
    • 适用于3.0.0-el7
    • 适用于3.0.0-el8
    • 适用于3.0.0-el8
      • 支持范围
      • 卸载脚本完整内容
      • hosts.txt 格式说明
      • 使用方法
      • 图示参考
    • 适用于3.0.0-ubuntu22
    • 适用于3.0.0-ubuntu22
  • JDK环境

  • MAVEN环境

  • GRADLE环境

  • CONDA环境

  • R环境

  • 一键部署
  • Ambari快速部署
JaneTTR
2025-05-30
目录

适用于3.0.0-el8一键卸载

场景说明

本指南介绍如何通过一键卸载脚本,安全、批量清理 Ambari 及相关依赖,适合环境重置、集群重装或测试回收等需求。脚本支持多节点并发操作,确保卸载无残留。

# 支持范围

类别 说明
操作系统 Rocky Linux 8.10 / CentOS 8 及兼容环境
卸载内容 Ambari Server/Agent、MariaDB、JDK、MySQL Connector、Nginx、本地 YUM 源、典型大数据组件残留
适用场景 建议结合本站 ONEKEY 安装方案,配合原始 hosts.txt 文件实现批量卸载

# 卸载脚本完整内容 必读

注意

下方为【完整一键卸载脚本】,务必结合 hosts.txt 配置整体复制后执行。如需定制仅需调整注释内容,强烈建议通读脚本说明。

点击展开查看完整脚本(推荐收起/展开)
#!/bin/bash
# 版权所有 (c) JaneTTR 2025
# 项目名称:ambari-env
#
# 本文件属于付费部分代码,仅供个人学习和研究使用。
#
# 禁止行为:
# 1. 未经授权,不得将本文件或其编译后的代码用于任何商业用途;
# 2. 禁止重新分发本文件或其修改版本;
# 3. 禁止通过反编译、反向工程等手段试图绕过授权验证。
#
# 商业授权:
# 如需将本文件或其编译后的代码用于商业用途,必须获得版权所有者的书面授权。
# 联系方式:
# 邮箱:3832514048@qq.com
#
# 责任声明:
# 本文件按“现状”提供,不附带任何形式的担保,包括但不限于适销性、特定用途适用性或无侵权的担保。
#
# 如有任何疑问,请联系版权所有者。

set -e
# set -x  # 如需调试,请取消注释此行

# 日志文件
LOGFILE="script_debug.log"
exec > >(tee -a "$LOGFILE") 2>&1

# 本地日志函数
log_info() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') [Info] $*"
}
log_error() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') [Error] $*" >&2
}

# 主机信息文件(当前目录下),格式:用户名 密码 ip
HOSTS_FILE="./hosts.txt"
if [ ! -f "$HOSTS_FILE" ]; then
  log_error "未找到主机文件 $HOSTS_FILE,请确认文件存在于当前目录。"
  exit 1
fi

############################################
# 检查并安装 sshpass
############################################
check_install_sshpass() {
  if ! command -v sshpass &>/dev/null; then
    log_info "sshpass 未安装,开始安装..."
    if command -v yum &>/dev/null; then
      sudo yum install -y epel-release sshpass || { log_error "安装 sshpass 失败"; exit 1; }
    elif command -v apt &>/dev/null; then
      sudo apt update && sudo apt install -y sshpass || { log_error "安装 sshpass 失败"; exit 1; }
    else
      log_error "未找到支持的包管理器,请手动安装 sshpass."
      exit 1
    fi
  fi
}

############################################
# 测试 SSH 连接是否可用
############################################
check_ssh_connection() {
  local user="$1" ip="$2" password="$3"
  sshpass -p "$password" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=5 "$user@$ip" "exit" &>/dev/null
  if [ $? -ne 0 ]; then
    log_error "连接主机 $ip (user: $user) 失败."
    return 1
  fi
  log_info "成功连接主机 $ip (user: $user)."
  return 0
}

############################################
# 远程停止服务及卸载软件包
############################################
remote_stop_services() {
  local user="$1" ip="$2" password="$3"
  sshpass -p "$password" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$user@$ip" bash -s <<'EOF'
# 远程日志函数
rlog_info() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') [Info] $*"
}
rlog_error() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') [Error] $*" >&2
}

# 检查命令是否存在
command_exists() {
  command -v "$1" >/dev/null 2>&1
}

# 封装停止进程的函数,参数:描述、获取 PID 的命令
stop_processes() {
  local description="$1"
  local cmd="$2"
  rlog_info "$description"
  local pids
  pids=$(eval "$cmd")
  if [ -n "$pids" ]; then
    rlog_info "检测到进程: $pids"
    echo "$pids" | xargs -r kill -9 || rlog_error "部分进程停止失败."
  else
    rlog_info "未检测到相关进程."
  fi
}

# 针对指定关键词停止进程的函数(获取PID=第2列)
stop_process_by_keyword() {
  local keyword="$1"
  rlog_info "停止匹配关键词 [$keyword] 的进程..."
  local pids
  pids=$(ps -ef | grep "$keyword" | grep -v "grep" | awk '{print $2}')
  if [ -n "$pids" ]; then
    rlog_info "检测到进程: $pids"
    echo "$pids" | xargs -r kill -9 || rlog_error "部分进程停止失败."
  else
    rlog_info "未检测到匹配 [$keyword] 的进程."
  fi
}

rlog_info "开始停止服务..."

# 检查jps是否存在,再kill jps列出的Java进程
if command_exists jps; then
  stop_processes "停止 JPS 列出的进程..." "jps | awk '{print \$1}'"
else
  rlog_info "jps命令未找到,跳过基于jps的Java进程检测。"
fi

# 针对关键词停止进程
KEYWORDS=("java" "n9e" "nightingale" "categraf")
for keyword in "${KEYWORDS[@]}"; do
  stop_process_by_keyword "$keyword"
done

# 卸载 BIGTOP 与 Ambari 相关软件包
rlog_info "卸载 BIGTOP 与 Ambari 相关软件包..."
if command_exists yum; then
  packages=$(yum list installed | grep -E '(@BIGTOP|ambari)' | awk '{print $1}')
  for package in $packages; do
    rlog_info "卸载软件包: $package"
    sudo yum remove -y "$package"
  done
elif command_exists dnf; then
  packages=$(dnf list installed | grep -E '(@BIGTOP|ambari)' | awk '{print $1}')
  for package in $packages; do
    rlog_info "卸载软件包: $package"
    sudo dnf remove -y "$package"
  done
else
  rlog_info "未找到yum/dnf命令,跳过软件包卸载。"
fi

rlog_info "服务停止操作完成."
EOF
}

############################################
# 远程执行清理操作
############################################
remote_cleanup() {
  local user="$1" ip="$2" password="$3"
  sshpass -p "$password" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$user@$ip" bash -s <<'EOF'
# 远程日志函数
rlog_info() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') [Info] $*"
}
rlog_error() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') [Error] $*" >&2
}

perform_cleanup() {
  rlog_info "开始执行清理操作..."

  # 定义需要排除的路径数组
  EXCLUDE_PATHS=(
    -not -path "/data/modules/*"
    -not -path "/usr/share/fonts/*"
    -not -path "/usr/lib/locale/*"
  )

  # 定义匹配关键词数组
  KEYWORDS=(ambari-qa ams hbase hcat hdfs hive kafka kms mapred ranger solr sqoop tez yarn dolphin zookeeper doris nightingale categraf spark flink zeppelin phoenix ozone celeborn cloudbeaver)

  rlog_info "清理匹配关键词的文件和目录..."
  for keyword in "${KEYWORDS[@]}"; do
    rlog_info "清理匹配关键词 [$keyword] 的文件..."
    find / -path /etc/yum.repos.d -prune -o -name "*${keyword}*" "${EXCLUDE_PATHS[@]}" -exec rm -rf {} \; 2>/dev/null
  done

  rlog_info "清理特定路径下的 'ambari*' 文件..."
  find /tmp /var /run /sys/fs /etc /usr -path /etc/yum.repos.d -prune -o -name "ambari*" "${EXCLUDE_PATHS[@]}" -exec rm -rf {} \; 2>/dev/null

  rlog_info "清理 BIGTOP 残留文件..."
  find /var /usr -name "bigtop*" "${EXCLUDE_PATHS[@]}" -exec rm -rf {} \; 2>/dev/null
  rm -rf /usr/bigtop

  rlog_info "清理用户及用户组..."
  USERS=(ambari-qa ams hbase hcat hdfs hive kafka kms mapred ranger solr sqoop tez yarn zookeeper zeppelin flink spark hadoop doris nightingale categraf ozone impala celeborn)
  for user in "${USERS[@]}"; do
    userdel -r "$user" 2>/dev/null || true
    groupdel "$user" 2>/dev/null || true
  done

  rlog_info "清理用户家目录..."
  rm -rf /home/{ambari-qa,ams,hbase,hcat,hdfs,hive,kafka,kms,mapred,ranger,roo,solr,sqoop,tez,yarn,zookeeper,ozone,impala,celeborn} 2>/dev/null

  rlog_info "清理 Kafka 元数据及其他目录..."
  rm -rf /kafka-logs/meta.properties 2>/dev/null || true
  rm -rf /hadoop/* 2>/dev/null || true
  rm -rf /data1/* 2>/dev/null || true
  rm -rf /data2/* 2>/dev/null || true
  rm -rf /ozone 2>/dev/null || true
  rm -rf /celeborn 2>/dev/null || true
  rlog_info "清理 /data/kafka-logs 和 /data/hadoop 目录..."
  rm -rf /data/kafka-logs /data/hadoop 2>/dev/null || true

  rlog_info "清理 MySQL 数据..."
  systemctl stop mariadb 2>/dev/null || rlog_error "停止 MariaDB 服务失败."
  timeout 5 rm -rf /var/lib/mysql/* 2>/dev/null || rlog_error "MySQL 数据清理超时或失败."
  timeout 5 mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql 2>/dev/null || rlog_error "MySQL 数据初始化超时或失败."
  timeout 15 systemctl restart mariadb 2>/dev/null || rlog_error "MySQL 重启超时或失败."
  timeout 15 systemctl enable mariadb 2>/dev/null || rlog_error "无法设置 MariaDB 开机自启."

  rlog_info "清理 Hadoop 日志目录..."
  find /var/log -type d -group hadoop -not -path "/data/modules/*" -not -path "/usr/share/fonts/*" -exec rm -rf {} \; 2>/dev/null

  rlog_info "重新配置 locale..."
  localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
  localedef -i en_US -f UTF-8 en_US.UTF-8

  rlog_info "清理操作完成."
}

perform_cleanup
EOF
}

############################################
# 主流程:依次读取主机文件,检测、连接、停止服务并清理残留数据
############################################
main() {
  check_install_sshpass

  # 使用 while IFS= read -r line 逐行读取,确保处理多行输入
  while IFS= read -r line || [ -n "$line" ]; do
    # 忽略空行和以 '#' 开头的注释行
    [[ -z "$line" || "$line" =~ ^# ]] && continue

    # 去除可能的 CR 字符和多余空格
    line=$(echo "$line" | tr -d '\r' | xargs)

    # 文件中每行格式:用户名 密码 ip
    read -r username password ip <<< "$line"

    log_info "处理主机:$ip (user: $username)"
    if check_ssh_connection "$username" "$ip" "$password"; then
      log_info "SSH 连接成功,开始执行远程服务停止及清理操作..."
      remote_stop_services "$username" "$ip" "$password"
      remote_cleanup "$username" "$ip" "$password"
      log_info "主机 $ip 操作完成."
    else
      log_error "跳过主机 $ip (user: $username),记录失败信息."
      echo "$ip" >>failed_hosts.log
    fi
  done < "$HOSTS_FILE"

  log_info "所有操作完成。详细日志请查看: $LOGFILE"
}

main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274

# hosts.txt 格式说明

hosts.txt 文件与安装脚本一致,用于批量指定目标主机。

用户名 密码 IP地址
root xxxxxx 192.168.3.1
root xxxxxx 192.168.3.2
root xxxxxx 192.168.3.3

笔记

请确保各节点网络互通,具备 sudo/root 权限。

# 使用方法

准备 hosts.txt 填写所有需要卸载的主机信息,并放在脚本同目录。

执行卸载脚本

chmod +x uninstall_ambari_cluster.sh
./uninstall_ambari_cluster.sh
1
2

日志自动写入 ambari_uninstall.log,如有失败主机将标记在 failed_hosts.log,方便后续重试。

检查结果 卸载完成后,建议逐台核查如下目录确保无残留:

  • /var/lib/ambari-*
  • /usr/jdk64/
  • /var/lib/mysql/
  • /etc/ambari*

可根据实际情况删减清理范围,避免误删业务数据。

# 图示参考

参数设置图

#ONEKEY#Ambari#Bigtop#自动化部署#集群卸载
适用于3.0.0-el8
适用于3.0.0-ubuntu22

← 适用于3.0.0-el8 适用于3.0.0-ubuntu22→

最近更新
01
bigtop-select 打包缺 compat 报错修复 deb
07-16
02
bigtop-select 打包缺 control 文件报错修复 deb
07-16
03
首次编译-环境初始化 必装
07-16
更多文章>
Theme by Vdoing | Copyright © 2017-2025 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式