本文提供了5个高频使用的Shell脚本,适用于Ubuntu/WSL环境下的大数据开发(Hadoop/Spark生态)。
包括:
- Hadoop集群健康检查脚本;
- HDFS过期数据清理脚本;
- Spark任务提交脚本;
- Hadoop日志错误分析脚本;
- 多节点批量执行命令脚本。
每个脚本都包含用途说明、代码实现和关键点解释,可直接在WSL环境中运行测试。
此外,还特别定制了一个WSL学习环境健康检查脚本,可全面检测系统资源、目录结构、进程状态等,帮助开发者快速掌握环境状况。
这些脚本可组合成"大数据工具箱",提升日常开发效率。
5 个高频率使用的功能性 Shell 脚本
围绕大数据开发(尤其是 Hadoop/Spark 生态)在 Ubuntu 环境下的实际场景,给出 5 个高频率使用的功能性 Shell 脚本 ,每个都带 用途 + 代码 + 关键点解释。
适合你当前的(WSL Ubuntu)环境边学边改。
脚本 1:HDFS / Hadoop 集群健康检查(最常用)
用途
一键检查 Hadoop 关键进程是否存活、HDFS 空间、是否进入安全模式。
bash
bash
#!/bin/bash
# check_hadoop.sh - Hadoop 集群健康检查
echo "========== Hadoop 进程状态 =========="
for service in NameNode DataNode ResourceManager NodeManager
do
if ps -ef | grep -v grep | grep -q "$service"; then
echo "✅ $service is running"
else
echo "❌ $service is NOT running"
fi
done
echo ""
echo "========== HDFS 整体空间 =========="
hdfs dfsadmin -report | grep -E "Configured Capacity|DFS Used|DFS Remaining|DFS Used%"
echo ""
echo "========== 安全模式状态 =========="
hdfs dfsadmin -safemode get
使用方式
bash
bash
chmod +x check_hadoop.sh
./check_hadoop.sh
脚本 2:批量清理 HDFS 过期数据(运维必用)
用途
删除 HDFS 中超过 N 天的特定目录数据,避免小文件堆积。
bash
bash
#!/bin/bash
# clean_old_hdfs_data.sh
DAYS_AGO=7
HDFS_PATH="/user/hadoop/temp_logs"
echo "删除 ${HDFS_PATH} 中修改时间超过 ${DAYS_AGO} 天的数据..."
hdfs dfs -ls -R ${HDFS_PATH} | \
awk '{print $6 " " $8}' | \
while read mtime path
do
# 将 HDFS 时间戳转成秒(需 date -d 支持,WSL 需注意)
file_sec=$(date -d "$mtime" +%s 2>/dev/null)
now_sec=$(date +%s)
diff_days=$(( (now_sec - file_sec) / 86400 ))
if [ $diff_days -gt $DAYS_AGO ]; then
echo "删除 $path(已有 ${diff_days} 天)"
hdfs dfs -rm -r -skipTrash "$path"
fi
done
⚠️ WSL 中
date -d可能兼容性不如纯 Linux,建议先在测试目录验证。
脚本 3:Spark 任务一键提交(带环境变量)
用途
封装 spark-submit,自动加载环境变量、JAR 路径、资源参数。
bash
bash
#!/bin/bash
# run_spark_job.sh
export HADOOP_CONF_DIR=/etc/hadoop/conf
export SPARK_HOME=/opt/spark
export PATH=$SPARK_HOME/bin:$PATH
APP_JAR="/home/mumu/bigdata/spark_jobs/etl_demo.jar"
MAIN_CLASS="com.bigdata.ETLRunner"
INPUT_PATH="/user/hadoop/input/data.parquet"
OUTPUT_PATH="/user/hadoop/output/result_$(date +%Y%m%d_%H%M%S)"
spark-submit \
--master yarn \
--deploy-mode client \
--driver-memory 2g \
--executor-memory 4g \
--num-executors 4 \
--class ${MAIN_CLASS} \
${APP_JAR} \
--input ${INPUT_PATH} \
--output ${OUTPUT_PATH}
if [ $? -eq 0 ]; then
echo "✅ Spark 任务成功,结果目录:${OUTPUT_PATH}"
else
echo "❌ Spark 任务失败,请检查日志"
exit 1
fi
脚本 4:分析 Hadoop 日志中 ERROR 频率(awk 实战)
用途
统计 YARN / HDFS 日志中各种 ERROR 的出现次数,快速定位异常类型。
bash
bash
#!/bin/bash
# analyze_logs.sh
LOG_DIR="/var/log/hadoop/hdfs"
echo "统计最近 7 天修改的 .log 文件中的错误类型"
find ${LOG_DIR} -name "*.log" -mtime -7 -exec cat {} \; | \
grep -E "ERROR|FATAL" | \
awk -F ':' '{print $2}' | \
sort | uniq -c | sort -rn | head -20
脚本 5:多节点批量执行命令(跳板机常用)
用途
在多个大数据节点上批量执行同一命令(无密码 SSH 为前提)。
bash
bash
#!/bin/bash
# batch_cmd.sh
NODES=("node01" "node02" "node03")
CMD=$1
if [ -z "$CMD" ]; then
echo "用法: $0 '命令'"
exit 1
fi
for node in "${NODES[@]}"; do
echo "================== ${node} =================="
ssh hadoop@${node} "$CMD"
echo ""
done
使用示例
bash
bash
./batch_cmd.sh "df -h"
./batch_cmd.sh "jps"
如何把以上脚本串成一个"大数据工具箱"
bash
bash
mkdir -p ~/bigdata/scripts
# 把上面每个脚本存成对应文件
chmod +x ~/bigdata/scripts/*.sh
# 可选:加入 PATH
echo 'export PATH=$PATH:$HOME/bigdata/scripts' >> ~/.bashrc
source ~/.bashrc
重点总结(面试/考试易考)
| 场景 | 关键命令或技术点 |
|---|---|
| Hadoop 进程检查 | `ps -ef |
| HDFS 空间 | hdfs dfsadmin -report |
| Spark 提交 | spark-submit --master yarn ... |
| 按时间过滤文件 | find -mtime -7 |
| 日志高频错误统计 | `grep ERROR |
| SSH 批量执行 | ssh user@host "cmd" |
| 日期变量 | $(date +%Y%m%d) |
如果你愿意,下一步我可以帮你:
-
把这些脚本改成 CentOS(node100)也能通用 的版本
-
或针对你 WSL 实际目录结构 定制一个"学习版健康检查脚本"
针对我的 WSL 实际目录结构 定制一个"学习版健康检查脚本"
下面给你定制一个专门用于你当前 WSL Ubuntu 环境的健康检查脚本。
脚本:check_wsl_env.sh
bash
#!/bin/bash
# check_wsl_env.sh - WSL Ubuntu 学习环境健康检查脚本
# 适用环境:mumu@MuJinqiu (WSL Ubuntu)
# ========== 颜色定义 ==========
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# ========== 头部信息 ==========
echo "=========================================="
echo "🔍 WSL Ubuntu 学习环境健康检查"
echo "=========================================="
echo "用户名: $(whoami)"
echo "主机名: $(hostname)"
echo "当前目录: $(pwd)"
echo "检查时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
# ========== 1. 系统信息 ==========
echo ""
echo -e "${BLUE}📋 1. 系统信息${NC}"
echo "----------------------------------------"
if [ -f /etc/os-release ]; then
source /etc/os-release
echo "发行版: $NAME $VERSION"
else
echo "发行版: 无法获取"
fi
echo "内核版本: $(uname -r)"
echo "架构: $(uname -m)"
# ========== 2. 内存使用 ==========
echo ""
echo -e "${BLUE}💾 2. 内存使用情况${NC}"
echo "----------------------------------------"
free -h
# ========== 3. 磁盘使用 ==========
echo ""
echo -e "${BLUE}💿 3. 磁盘使用情况${NC}"
echo "----------------------------------------"
df -h ~ | grep -v "Filesystem"
# ========== 4. 当前目录大小 ==========
echo ""
echo -e "${BLUE}📁 4. 当前目录占用${NC}"
echo "----------------------------------------"
du -sh . 2>/dev/null || echo "无法统计(权限不足)"
# ========== 5. 重点目录检查 ==========
echo ""
echo -e "${BLUE}📂 5. 学习目录检查${NC}"
echo "----------------------------------------"
# 检查 bigdata 目录
if [ -d ~/bigdata ]; then
echo -e "${GREEN}✅${NC} ~/bigdata 目录存在"
BIGDATA_SIZE=$(du -sh ~/bigdata 2>/dev/null | cut -f1)
echo " 大小: $BIGDATA_SIZE"
else
echo -e "${RED}❌${NC} ~/bigdata 目录不存在(建议创建)"
fi
# 检查 test 目录
if [ -d ~/bigdata/2026/test ]; then
echo -e "${GREEN}✅${NC} ~/bigdata/2026/test 目录存在"
FILE_COUNT=$(find ~/bigdata/2026/test -type f 2>/dev/null | wc -l)
echo " 文件数量: $FILE_COUNT"
else
echo -e "${YELLOW}⚠️${NC} ~/bigdata/2026/test 目录不存在"
fi
# 检查 scripts 目录
if [ -d ~/bigdata/scripts ]; then
echo -e "${GREEN}✅${NC} ~/bigdata/scripts 目录存在"
SCRIPT_COUNT=$(find ~/bigdata/scripts -name "*.sh" 2>/dev/null | wc -l)
echo " 脚本数量: $SCRIPT_COUNT"
else
echo -e "${YELLOW}⚠️${NC} ~/bigdata/scripts 目录不存在(可存放自定义脚本)"
fi
# ========== 6. 进程检查 ==========
echo ""
echo -e "${BLUE}⚙️ 6. 后台进程检查${NC}"
echo "----------------------------------------"
# 检查是否有 Cursor 进程
CURSOR_COUNT=$(ps -ef 2>/dev/null | grep -c "cursor-server" | grep -v grep)
if [ "$CURSOR_COUNT" -gt 0 ]; then
echo -e "${YELLOW}⚠️${NC} Cursor 远程服务进程数: $CURSOR_COUNT"
else
echo -e "${GREEN}✅${NC} 无 Cursor 后台进程"
fi
# 检查是否有 node 进程(排除 cursor)
NODE_COUNT=$(ps -ef 2>/dev/null | grep "node" | grep -v "cursor" | grep -v "grep" | wc -l)
if [ "$NODE_COUNT" -gt 0 ]; then
echo -e "${YELLOW}⚠️${NC} 其他 Node.js 进程数: $NODE_COUNT"
echo " (可能是你自己启动的项目)"
else
echo -e "${GREEN}✅${NC} 无其他 Node.js 进程"
fi
# ========== 7. 环境变量 ==========
echo ""
echo -e "${BLUE}🔧 7. 关键环境变量${NC}"
echo "----------------------------------------"
echo "PATH 前3项:"
echo "$PATH" | tr ':' '\n' | head -3 | sed 's/^/ /'
echo ""
echo "JAVA_HOME: ${JAVA_HOME:-未设置}"
echo "HADOOP_HOME: ${HADOOP_HOME:-未设置}"
echo "SPARK_HOME: ${SPARK_HOME:-未设置}"
# ========== 8. 网络端口检查 ==========
echo ""
echo -e "${BLUE}🌐 8. 常用端口监听状态${NC}"
echo "----------------------------------------"
check_port() {
local port=$1
local name=$2
if ss -tln 2>/dev/null | grep -q ":$port "; then
echo -e "${GREEN}✅${NC} $name ($port) 正在监听"
else
echo -e "${RED}❌${NC} $name ($port) 未监听"
fi
}
check_port 22 "SSH"
check_port 3306 "MySQL"
check_port 8080 "Tomcat/Proxy"
check_port 3000 "Node.js 开发服务器"
# ========== 9. 可用命令检查 ==========
echo ""
echo -e "${BLUE}📦 9. 常用命令可用性${NC}"
echo "----------------------------------------"
check_cmd() {
local cmd=$1
if command -v $cmd &> /dev/null; then
echo -e "${GREEN}✅${NC} $cmd"
else
echo -e "${RED}❌${NC} $cmd"
fi
}
check_cmd "java"
check_cmd "python3"
check_cmd "node"
check_cmd "npm"
check_cmd "git"
check_cmd "curl"
check_cmd "wget"
check_cmd "mysql"
check_cmd "hadoop"
# ========== 10. 学习进度 ==========
echo ""
echo -e "${BLUE}📈 10. 学习进度(建议自填)${NC}"
echo "----------------------------------------"
if [ -f ~/.learning_tracker ]; then
cat ~/.learning_tracker
else
echo "未设置学习追踪文件"
echo "可创建 ~/.learning_tracker 记录学习进度"
fi
# ========== 结尾 ==========
echo ""
echo "=========================================="
echo -e "${GREEN}✅ 检查完成!${NC}"
echo "=========================================="
使用方法
1. 创建脚本
bash
bash
# 进入你的工作目录
cd ~/bigdata/2026/test
# 创建脚本文件
nano check_wsl_env.sh
# 或
vim check_wsl_env.sh
# 把上面完整脚本内容粘贴进去
# 保存并退出(nano: Ctrl+X, Y, Enter)
2. 添加执行权限
bash
bash
chmod +x check_wsl_env.sh
3. 运行脚本
bash
bash
./check_wsl_env.sh
预期输出示例
bash
==========================================
🔍 WSL Ubuntu 学习环境健康检查
==========================================
用户名: mumu
主机名: MuJinqiu
当前目录: /home/mumu/bigdata/2026/test
检查时间: 2026-05-15 14:30:00
==========================================
📋 1. 系统信息
----------------------------------------
发行版: Ubuntu 22.04.5 LTS
内核版本: 5.10.16.3-microsoft-standard-WSL2
架构: x86_64
💾 2. 内存使用情况
----------------------------------------
total used free shared buff/cache available
Mem: 15G 2.5G 10G 200M 2.5G 12G
Swap: 2.0G 0B 2.0G
💿 3. 磁盘使用情况
----------------------------------------
/dev/sda 250G 45G 205G 18% /home
📁 4. 当前目录占用
----------------------------------------
128K .
📂 5. 学习目录检查
----------------------------------------
✅ ~/bigdata 目录存在
大小: 450M
✅ ~/bigdata/2026/test 目录存在
文件数量: 12
⚠️ ~/bigdata/scripts 目录不存在(可存放自定义脚本)
⚙️ 6. 后台进程检查
----------------------------------------
⚠️ Cursor 远程服务进程数: 2
⚠️ 其他 Node.js 进程数: 0
(可能是你自己启动的项目)
🔧 7. 关键环境变量
----------------------------------------
PATH 前3项:
/home/mumu/.local/bin
/usr/local/sbin
/usr/local/bin
JAVA_HOME: 未设置
HADOOP_HOME: 未设置
SPARK_HOME: 未设置
🌐 8. 常用端口监听状态
----------------------------------------
✅ SSH (22) 正在监听
❌ MySQL (3306) 未监听
❌ Tomcat/Proxy (8080) 未监听
❌ Node.js 开发服务器 (3000) 未监听
📦 9. 常用命令可用性
----------------------------------------
❌ java
✅ python3
✅ node
✅ npm
✅ git
✅ curl
✅ wget
❌ mysql
❌ hadoop
📈 10. 学习进度(建议自填)
----------------------------------------
未设置学习追踪文件
可创建 ~/.learning_tracker 记录学习进度
==========================================
✅ 检查完成!
==========================================
可选:添加学习进度追踪
bash
bash
# 创建学习进度文件
cat > ~/.learning_tracker << 'EOF'
📚 大数据学习进度
==================
✅ Linux 基础命令
✅ Shell 脚本基础
⏳ Hadoop 入门
⏳ HDFS 操作
❌ MapReduce
❌ Hive
❌ Spark
==================
最后更新: 2026-05-15
EOF
再次运行 ./check_wsl_env.sh,第10部分就会显示你的学习进度。
bash
./check_wsl_env.sh
脚本扩展建议
| 你想添加的功能 | 可加入的检查项 |
|---|---|
| 检查磁盘空间是否超过80% | `df -h |
| 检查系统负载 | `uptime |
| 检查可更新的软件包数量 | `apt list --upgradable 2>/dev/null |
| 检查某个服务是否运行 | systemctl is-active --quiet ssh && echo "运行中" |
总结:这个脚本会帮你全面了解当前 WSL 环境的状态,包括系统资源、目录结构、进程、命令可用性。每次学习前跑一遍,能快速发现环境问题。