大数据开发(Hadoop/Spark 生态)在 Ubuntu 环境下:5 个高频率使用的功能性 Shell 脚本

本文提供了5个高频使用的Shell脚本,适用于Ubuntu/WSL环境下的大数据开发(Hadoop/Spark生态)。


包括:

  1. Hadoop集群健康检查脚本;
  2. HDFS过期数据清理脚本;
  3. Spark任务提交脚本;
  4. Hadoop日志错误分析脚本;
  5. 多节点批量执行命令脚本。

每个脚本都包含用途说明、代码实现和关键点解释,可直接在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 环境的状态,包括系统资源、目录结构、进程、命令可用性。每次学习前跑一遍,能快速发现环境问题。

相关推荐
吴声子夜歌16 小时前
Shell编程实例——内务及管理任务(一)
linux·运维·shell
吴声子夜歌17 小时前
Shell编程实例——高级脚本编程(一)
linux·运维·网络·shell
吴声子夜歌1 天前
Shell编程实例——bash的配置与自定义(二)
linux·运维·shell
吴声子夜歌2 天前
Shell编程实例——与解析相关的任务(二)
linux·运维·shell
吴声子夜歌2 天前
Shell编程实例——脚本编程的附加特性
linux·运维·shell
云计算练习生2 天前
什么是内核?操作系统内核到底管哪些事
linux·windows·操作系统·内核·shell
吴声子夜歌5 天前
Shell编程实例——bash入门
linux·运维·shell
Swizard5 天前
Linux 日志神器 journalctl 完全指南:彻底替代传统日志查看方式
shell
吴声子夜歌6 天前
Shell编程——数组
linux·运维·shell
吴声子夜歌6 天前
Shell编程——开发规范
linux·运维·shell