本文档风哥主要介绍Hadoop集群自动化运维,包括自动化部署、自动化监控、自动化维护等内容,风哥教程参考Hadoop官方文档和运维最佳实践,适合大数据运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 自动化运维概述
Hadoop集群自动化运维是提升运维效率的重要手段,通过自动化工具减少人工操作。学习交流加群风哥微信: itpux-com
- 自动化部署:自动安装配置集群
- 自动化监控:自动监控集群状态
- 自动化维护:自动执行维护任务
- 自动化告警:自动发送告警通知
自动化运维是提升运维效率的关键,
通过工具和脚本减少人工操作。
主要目标:
1. 提升效率
– 减少重复劳动
– 加快部署速度
– 提高工作效率
2. 降低风险
– 减少人为错误
– 标准化操作
– 可追溯可审计
3. 保障稳定
– 及时发现问题
– 快速响应处理
– 保障服务稳定
# 自动化运维架构
┌─────────────────────────────────────────┐
│ 配置管理 │
│ Ansible、Puppet、SaltStack │
├─────────────────────────────────────────┤
│ 监控告警 │
│ Prometheus、Grafana、AlertManager │
├─────────────────────────────────────────┤
│ 日志管理 │
│ ELK Stack、Fluentd │
├─────────────────────────────────────────┤
│ 任务调度 │
│ Cron、Airflow │
├─────────────────────────────────────────┤
│ 脚本工具 │
│ Shell、Python │
└─────────────────────────────────────────┘
# 自动化运维场景
1. 部署场景
– 集群安装
– 服务配置
– 参数优化
2. 监控场景
– 服务监控
– 资源监控
– 性能监控
3. 维护场景
– 日志清理
– 数据备份
– 服务重启
4. 故障处理
– 自动恢复
– 告警通知
– 日志收集
# 自动化运维原则
1. 标准化
统一操作标准和流程
2. 可重复
操作可重复执行
3. 可追溯
操作记录可查询
4. 安全性
操作过程安全可控
5. 可维护
脚本和工具易维护
1.2 自动化工具介绍
自动化工具介绍:
1. Ansible
特点:
– 无Agent架构
– YAML配置
– 模块丰富
– 学习曲线平缓
适用场景:
– 集群部署
– 配置管理
– 应用发布
2. Puppet
特点:
– 声明式语言
– 强大的DSL
– 企业级支持
适用场景:
– 大规模环境
– 复杂配置
3. SaltStack
特点:
– 高性能
– Python编写
– 灵活配置
适用场景:
– 大规模环境
– 实时管理
# 监控工具
1. Prometheus
特点:
– 多维数据模型
– PromQL查询
– 告警功能
适用场景:
– 指标监控
– 告警管理
2. Grafana
特点:
– 丰富图表
– 多数据源
– 告警功能
适用场景:
– 数据可视化
– 仪表盘展示
# 日志工具
1. ELK Stack
组件:
– Elasticsearch: 存储
– Logstash: 收集
– Kibana: 展示
适用场景:
– 日志收集
– 日志分析
# 调度工具
1. Cron
特点:
– 系统内置
– 简单易用
适用场景:
– 定时任务
– 周期执行
2. Airflow
特点:
– DAG工作流
– Python定义
– Web界面
适用场景:
– 复杂工作流
– 数据管道
# 工具对比
工具 用途 优点 缺点
Ansible 配置管理 简单易用 大规模性能差
Puppet 配置管理 功能强大 学习曲线陡
Prometheus 监控 功能全面 存储有限
ELK 日志 生态完善 资源消耗大
1.3 自动化场景介绍
自动化场景介绍:
1. 集群安装
任务:
– 操作系统配置
– JDK安装
– Hadoop安装
– 服务配置
– 服务启动
2. 服务扩容
任务:
– 新节点配置
– 服务部署
– 集群加入
– 数据均衡
3. 版本升级
任务:
– 备份数据
– 停止服务
– 升级软件
– 启动服务
– 验证功能
# 监控自动化场景
1. 服务监控
任务:
– 进程监控
– 端口监控
– 接口监控
2. 资源监控
任务:
– CPU监控
– 内存监控
– 磁盘监控
– 网络监控
3. 性能监控
任务:
– 响应时间
– 吞吐量
– 错误率
# 维护自动化场景
1. 日志清理
任务:
– 定期清理
– 日志归档
– 空间释放
2. 数据备份
任务:
– 定期备份
– 备份验证
– 备份清理
3. 服务巡检
任务:
– 健康检查
– 状态报告
– 问题预警
# 故障处理自动化场景
1. 自动恢复
任务:
– 服务重启
– 故障转移
– 资源调整
2. 告警通知
任务:
– 邮件通知
– 钉钉通知
– 短信通知
3. 日志收集
任务:
– 日志打包
– 日志上传
– 日志分析
Part02-生产环境规划与建议
2.1 环境规划建议
环境规划建议:
工具 配置 数量
Ansible控制节点 4C/8G/100G 1
Prometheus 8C/16G/500G 2
Grafana 4C/8G/100G 1
ELK Stack 16C/32G/2T 3
# 目录规划
目录 用途
/bigdata/scripts 运维脚本
/bigdata/ansible Ansible Playbook
/bigdata/configs 配置文件
/bigdata/logs/automation 自动化日志
# 用户规划
用户 权限 用途
ansible sudo 自动化部署
monitor 只读 监控查询
backup 读写 数据备份
# 网络规划
端口 用途
22 SSH (Ansible)
9090 Prometheus
3000 Grafana
9200 Elasticsearch
5601 Kibana
2.2 脚本规划建议
脚本规划建议:
1. 部署脚本
脚本名 功能
install_hadoop.sh 安装Hadoop
config_hadoop.sh 配置Hadoop
start_hadoop.sh 启动Hadoop
2. 监控脚本
脚本名 功能
check_service.sh 检查服务状态
check_resource.sh 检查资源使用
check_health.sh 健康检查
3. 维护脚本
脚本名 功能
clean_logs.sh 清理日志
backup_data.sh 备份数据
balance_data.sh 数据均衡
# 脚本规范
1. 命名规范
格式: [动作]_[对象].sh
示例: start_hadoop.sh
2. 注释规范
#!/bin/bash
# script_name.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 功能描述
3. 日志规范
LOG_FILE=”/bigdata/logs/automation/${SCRIPT_NAME}.log”
log_info() { echo “[$(date)] INFO: $1” | tee -a $LOG_FILE; }
log_error() { echo “[$(date)] ERROR: $1” | tee -a $LOG_FILE; }
4. 错误处理
set -e
trap ‘error_exit “命令执行失败: $LINENO”‘ ERR
# 版本控制
使用Git管理脚本:
$ git init
$ git add scripts/
$ git commit -m “初始化运维脚本”
2.3 调度规划建议
调度规划建议:
任务 频率 时间
日常巡检 每日 09:00
日志清理 每日 03:00
数据备份 每日 02:00
健康检查 每小时 整点
容量分析 每周 周一09:00
# Cron配置示例
# 日常巡检
0 9 * * * /bigdata/scripts/check/daily_check.sh
# 日志清理
0 3 * * * /bigdata/scripts/maintenance/clean_logs.sh
# 数据备份
0 2 * * * /bigdata/scripts/backup/backup_data.sh
# 健康检查
0 * * * * /bigdata/scripts/check/health_check.sh
# 容量分析
0 9 * * 1 /bigdata/scripts/analysis/capacity_analysis.sh
Part03-生产环境项目实施方案
3.1 自动化部署实战
$ yum install -y ansible
# 2. 配置主机清单
$ cat > /etc/ansible/hosts << 'EOF'
[master]
fgedu-node1
fgedu-node2
[worker]
fgedu-node3
fgedu-node4
fgedu-node5
[hadoop:children]
master
worker
EOF
# 3. 配置SSH免密
$ ssh-keygen -t rsa
$ ssh-copy-id fgedu-node1
$ ssh-copy-id fgedu-node2
$ ssh-copy-id fgedu-node3
# 4. 创建部署Playbook
$ cat > /bigdata/ansible/deploy_hadoop.yml << 'EOF'
---
- name: Deploy Hadoop Cluster
hosts: hadoop
become: yes
vars:
hadoop_version: "3.3.6"
hadoop_home: "/bigdata/app/hadoop"
java_home: "/bigdata/app/java"
tasks:
- name: 创建目录
file:
path: "{{ item }}"
state: directory
mode: '0755'
loop:
- /bigdata/app
- /bigdata/fgdata
- /bigdata/logs
- name: 安装JDK
yum:
name: java-1.8.0-openjdk-devel
state: present
- name: 解压Hadoop
unarchive:
src: /tmp/hadoop-{{ hadoop_version }}.tar.gz
dest: /bigdata/app
remote_src: no
- name: 创建软链接
file:
src: /bigdata/app/hadoop-{{ hadoop_version }}
dest: "{{ hadoop_home }}"
state: link
- name: 配置环境变量
lineinfile:
path: /etc/profile
line: "{{ item }}"
loop:
- "export HADOOP_HOME={{ hadoop_home }}"
- "export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin"
- name: 分发配置文件
copy:
src: configs/
dest: "{{ hadoop_home }}/etc/hadoop/"
- name: 启动服务(Master)
shell: |
{{ hadoop_home }}/bin/hdfs namenode -format
{{ hadoop_home }}/sbin/start-dfs.sh
{{ hadoop_home }}/sbin/start-yarn.sh
when: inventory_hostname in groups['master']
run_once: true
handlers:
- name: restart hadoop
shell: |
{{ hadoop_home }}/sbin/stop-all.sh
{{ hadoop_home }}/sbin/start-all.sh
EOF
# 5. 执行部署
$ ansible-playbook -i /etc/ansible/hosts deploy_hadoop.yml
PLAY [Deploy Hadoop Cluster] ****************************************
TASK [Gathering Facts] **********************************************
ok: [fgedu-node1]
ok: [fgedu-node2]
ok: [fgedu-node3]
TASK [创建目录] *****************************************************
changed: [fgedu-node1] => (item=/bigdata/app)
changed: [fgedu-node1] => (item=/bigdata/fgdata)
changed: [fgedu-node1] => (item=/bigdata/logs)
…
PLAY RECAP **********************************************************
fgedu-node1 : ok=10 changed=8 unreachable=0 failed=0
fgedu-node2 : ok=8 changed=6 unreachable=0 failed=0
fgedu-node3 : ok=8 changed=6 unreachable=0 failed=0
# 6. 验证部署
$ ansible hadoop -m shell -a “jps | grep -E ‘NameNode|DataNode|ResourceManager|NodeManager'”
fgedu-node1 | CHANGED | rc=0 >>
12345 NameNode
12346 ResourceManager
fgedu-node2 | CHANGED | rc=0 >>
12345 NameNode
12346 ResourceManager
fgedu-node3 | CHANGED | rc=0 >>
12345 DataNode
12346 NodeManager
3.2 自动化监控实战
$ cat > /bigdata/scripts/monitor/cluster_monitor.sh << 'EOF' #!/bin/bash # cluster_monitor.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn LOG_FILE="/bigdata/logs/automation/cluster_monitor.log" ALERT_EMAIL="admin@fgedu.com" log_info() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1" | tee -a $LOG_FILE; } log_error() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1" | tee -a $LOG_FILE; } send_alert() { echo "$1" | mail -s "Hadoop集群告警" $ALERT_EMAIL } # 检查NameNode check_namenode() { NN_COUNT=$(jps | grep NameNode | wc -l) if [ "$NN_COUNT" -eq 0 ]; then log_error "NameNode未运行" send_alert "NameNode未运行,请立即处理" return 1 fi log_info "NameNode运行正常" } # 检查ResourceManager check_resourcemanager() { RM_COUNT=$(jps | grep ResourceManager | wc -l) if [ "$RM_COUNT" -eq 0 ]; then log_error "ResourceManager未运行" send_alert "ResourceManager未运行,请立即处理" return 1 fi log_info "ResourceManager运行正常" } # 检查DataNode check_datanode() { DEAD_DN=$(hdfs dfsadmin -report | grep "Dead datanodes" | awk -F'[(|)]' '{print $2}') if [ "$DEAD_DN" -gt 0 ]; then log_error "存在死亡DataNode: $DEAD_DN个" send_alert "存在死亡DataNode: $DEAD_DN个" return 1 fi log_info "DataNode全部正常" } # 检查HDFS健康 check_hdfs_health() { MISSING_BLOCKS=$(hdfs fsck / 2>&1 | grep “MISSING” | awk ‘{print $1}’)
if [ “$MISSING_BLOCKS” -gt 0 ]; then
log_error “存在丢失块: $MISSING_BLOCKS个”
send_alert “存在丢失块: $MISSING_BLOCKS个”
return 1
fi
log_info “HDFS健康状态正常”
}
# 检查磁盘空间
check_disk_space() {
USED_PERCENT=$(df -h / | awk ‘NR==2 {print $5}’ | cut -d’%’ -f1)
if [ “$USED_PERCENT” -gt 85 ]; then
log_error “磁盘使用率过高: ${USED_PERCENT}%”
send_alert “磁盘使用率过高: ${USED_PERCENT}%”
return 1
fi
log_info “磁盘使用率正常: ${USED_PERCENT}%”
}
# 主函数
main() {
log_info “========== 开始集群监控 ==========”
check_namenode
check_resourcemanager
check_datanode
check_hdfs_health
check_disk_space
log_info “========== 集群监控完成 ==========”
}
main
EOF
$ chmod +x /bigdata/scripts/monitor/cluster_monitor.sh
# 2. 配置定时任务
$ crontab -e
*/5 * * * * /bigdata/scripts/monitor/cluster_monitor.sh
# 3. 执行监控
$ /bigdata/scripts/monitor/cluster_monitor.sh
[2026-04-08 10:00:00] INFO: ========== 开始集群监控 ==========
[2026-04-08 10:00:01] INFO: NameNode运行正常
[2026-04-08 10:00:02] INFO: ResourceManager运行正常
[2026-04-08 10:00:03] INFO: DataNode全部正常
[2026-04-08 10:00:04] INFO: HDFS健康状态正常
[2026-04-08 10:00:05] INFO: 磁盘使用率正常: 45%
[2026-04-08 10:00:05] INFO: ========== 集群监控完成 ==========
3.3 自动化维护实战
$ cat > /bigdata/scripts/maintenance/clean_logs.sh << 'EOF' #!/bin/bash # clean_logs.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn LOG_DIR="/bigdata/app/hadoop/logs" RETENTION_DAYS=30 LOG_FILE="/bigdata/logs/automation/clean_logs.log" log_info() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1" >> $LOG_FILE; }
log_info “开始清理日志文件…”
# 清理过期日志
find $LOG_DIR -name “*.log.*” -mtime +$RETENTION_DAYS -exec rm -f {} \;
log_info “已清理${RETENTION_DAYS}天前的日志文件”
# 压缩旧日志
find $LOG_DIR -name “*.log” -mtime +7 -exec gzip {} \;
log_info “已压缩7天前的日志文件”
# 统计空间
BEFORE_SIZE=$(du -sh $LOG_DIR | awk ‘{print $1}’)
log_info “清理后日志目录大小: $BEFORE_SIZE”
log_info “日志清理完成”
EOF
$ chmod +x /bigdata/scripts/maintenance/clean_logs.sh
# 2. 数据备份脚本
$ cat > /bigdata/scripts/backup/backup_metadata.sh << 'EOF'
#!/bin/bash
# backup_metadata.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
BACKUP_DIR="/backup/hadoop/metadata"
DATE=$(date +%Y%m%d)
LOG_FILE="/bigdata/logs/automation/backup_metadata.log"
log_info() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1" >> $LOG_FILE; }
log_info “开始备份HDFS元数据…”
# 创建备份目录
mkdir -p $BACKUP_DIR/$DATE
# 备份NameNode元数据
hdfs dfsadmin -fetchImage $BACKUP_DIR/$DATE/fsimage_$(date +%Y%m%d%H%M%S)
log_info “已备份fsimage”
# 备份配置文件
tar -czf $BACKUP_DIR/$DATE/hadoop_configs_$DATE.tar.gz /bigdata/app/hadoop/etc/hadoop
log_info “已备份配置文件”
# 清理旧备份
find $BACKUP_DIR -type d -mtime +30 -exec rm -rf {} \;
log_info “已清理30天前的备份”
log_info “元数据备份完成”
EOF
$ chmod +x /bigdata/scripts/backup/backup_metadata.sh
# 3. 数据均衡脚本
$ cat > /bigdata/scripts/maintenance/balance_data.sh << 'EOF'
#!/bin/bash
# balance_data.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
THRESHOLD=5
LOG_FILE="/bigdata/logs/automation/balance_data.log"
log_info() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1" >> $LOG_FILE; }
log_info “开始数据均衡…”
# 执行均衡
hdfs balancer -threshold $THRESHOLD >> $LOG_FILE 2>&1
log_info “数据均衡完成”
EOF
$ chmod +x /bigdata/scripts/maintenance/balance_data.sh
# 4. 配置定时任务
$ cat >> /etc/crontab << 'EOF'
# Hadoop自动化维护任务
0 3 * * * root /bigdata/scripts/maintenance/clean_logs.sh
0 2 * * * root /bigdata/scripts/backup/backup_metadata.sh
0 4 * * 0 root /bigdata/scripts/maintenance/balance_data.sh
EOF
Part04-生产案例与实战讲解
4.1 批量部署案例
# 1. 准备工作
# 配置主机清单
$ cat > /etc/ansible/hosts << 'EOF'
[new_datanodes]
fgedu-node11
fgedu-node12
fgedu-node13
fgedu-node14
fgedu-node15
fgedu-node16
fgedu-node17
fgedu-node18
fgedu-node19
fgedu-node20
EOF
# 2. 创建部署Playbook
$ cat > /bigdata/ansible/add_datanodes.yml << 'EOF'
---
- name: Add DataNodes
hosts: new_datanodes
become: yes
tasks:
- name: 配置系统参数
sysctl:
name: "{{ item.name }}"
value: "{{ item.value }}"
state: present
loop:
- { name: 'vm.swappiness', value: '10' }
- { name: 'net.core.somaxconn', value: '32768' }
- name: 关闭防火墙
systemd:
name: firewalld
state: stopped
enabled: no
- name: 安装依赖
yum:
name: "{{ item }}"
state: present
loop:
- java-1.8.0-openjdk-devel
- ntp
- name: 创建用户
user:
name: hadoop
system: yes
- name: 分发Hadoop
synchronize:
src: /bigdata/app/hadoop
dest: /bigdata/app/
- name: 创建数据目录
file:
path: /bigdata/fgdata/dn
state: directory
owner: hadoop
group: hadoop
mode: '0755'
- name: 启动DataNode
shell: /bigdata/app/hadoop/bin/hdfs --daemon start datanode
- name: 启动NodeManager
shell: /bigdata/app/hadoop/bin/yarn --daemon start nodemanager
EOF
# 3. 执行部署
$ ansible-playbook add_datanodes.yml
PLAY [Add DataNodes] ************************************************
TASK [Gathering Facts] **********************************************
ok: [fgedu-node11]
ok: [fgedu-node12]
...
PLAY RECAP **********************************************************
fgedu-node11 : ok=8 changed=6 unreachable=0 failed=0
fgedu-node12 : ok=8 changed=6 unreachable=0 failed=0
...
# 4. 验证
$ hdfs dfsadmin -report | grep "Live datanodes"
Live datanodes (20):
# 5. 数据均衡
$ hdfs balancer -threshold 5
4.2 自动监控案例
# 1. 监控脚本
$ cat > /bigdata/scripts/monitor/auto_monitor.sh << 'EOF'
#!/bin/bash
# auto_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
PROMETHEUS_URL="http://localhost:9090"
ALERT_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxx"
# 查询指标
query_metric() {
local query=$1
curl -s "${PROMETHEUS_URL}/api/v1/query?query=${query}" | jq -r '.data.result[0].value[1]'
}
# 发送钉钉告警
send_dingtalk() {
local message=$1
curl -s -X POST $ALERT_WEBHOOK \
-H 'Content-Type: application/json' \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"${message}\"}}"
}
# 检查CPU使用率
check_cpu() {
CPU_USAGE=$(query_metric "100 - (avg by(instance) (irate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)")
if (( $(echo "$CPU_USAGE > 80″ | bc -l) )); then
send_dingtalk “告警: CPU使用率过高 ${CPU_USAGE}%”
fi
}
# 检查内存使用率
check_memory() {
MEM_USAGE=$(query_metric “(1 – (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100”)
if (( $(echo “$MEM_USAGE > 85” | bc -l) )); then
send_dingtalk “告警: 内存使用率过高 ${MEM_USAGE}%”
fi
}
# 检查HDFS使用率
check_hdfs() {
HDFS_USAGE=$(query_metric “Hadoop_NameNode_CapacityUsed / Hadoop_NameNode_CapacityTotal * 100”)
if (( $(echo “$HDFS_USAGE > 80” | bc -l) )); then
send_dingtalk “告警: HDFS使用率过高 ${HDFS_USAGE}%”
fi
}
# 主函数
main() {
check_cpu
check_memory
check_hdfs
}
main
EOF
$ chmod +x /bigdata/scripts/monitor/auto_monitor.sh
# 2. 配置定时任务
$ crontab -e
*/5 * * * * /bigdata/scripts/monitor/auto_monitor.sh
4.3 常见问题处理
4.3.1 Ansible执行失败
# 排查步骤
# 1. 检查连通性
$ ansible all -m ping
# 2. 检查权限
$ ansible all -m shell -a “whoami”
# 3. 查看详细输出
$ ansible-playbook -vvv playbook.yml
# 常见原因
– SSH连接失败
– 权限不足
– 模块不存在
– 语法错误
4.3.2 脚本执行异常
# 排查步骤
# 1. 检查脚本权限
$ ls -la script.sh
# 2. 检查脚本语法
$ bash -n script.sh
# 3. 调试执行
$ bash -x script.sh
# 常见原因
– 权限不足
– 语法错误
– 环境变量问题
– 依赖缺失
Part05-风哥经验总结与分享
5.1 自动化运维最佳实践
自动化运维最佳实践建议:
1. 选择合适的工具
2. 建立标准化流程
3. 使用版本控制
4. 做好测试验证
5. 持续优化改进
5.2 使用建议
使用建议:
- 自动化要循序渐进
- 脚本要规范编写
- 测试要充分验证
- 文档要完善记录
5.3 工具推荐
自动化运维工具推荐:
- Ansible:配置管理
- Shell/Python:脚本开发
- Prometheus:监控告警
- Git:版本控制
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
