大数据开发(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 环境的状态,包括系统资源、目录结构、进程、命令可用性。每次学习前跑一遍,能快速发现环境问题。

相关推荐
Irene19912 小时前
(课堂笔记)Shell 基础入门:语言特点、文件结构、变量定义与引用、循环、脚本调用、入参等
shell
Irissgwe3 天前
四、进程控制(进程等待与进程程序替换,shell)
linux·shell·进程·进程等待·进程程序替换
lifewange6 天前
VMware Workstation / VirtualBox / Hyper-V对比
shell
量子炒饭大师6 天前
【Linux系统编程】Cyberpunk在霓虹丛林中构建堡垒 ——【关于shell命令及其运行原理】
linux·运维·服务器·shell
phenhorlin14 天前
我做了个工具,让切换 Homebrew 镜像像切 npm 源一样简单
后端·shell
qq_375013331 个月前
shell
shell
Strugglingler1 个月前
基于whiptail开发shell导航工具
linux·shell·ui设计·whiptail
亚林瓜子1 个月前
AWS Glue Python Shell中获取外网ip
python·tcp/ip·http·shell·aws·vpc·glue