一、运维项目背景
企业离线统计任务均基于 MapReduce 开发,运维核心工作:统一团队 IDEA Maven 标准化开发环境、规范 Jar 打包流程、编写集群任务提交自动化脚本、前置清理 HDFS 输出目录、排查版本 / 路径 / 权限类高频集群故障。本文基于 WordCount 基准词频统计案例,形成可直接落地的运维标准化操作手册。
二、集群前置运维校验脚本
#!/bin/bash # MR任务运维前置巡检脚本 echo "=====1.校验Hadoop集群全部进程=====" jps | grep -E "NameNode|DataNode|ResourceManager|NodeManager" echo "=====2.清理历史输出目录,避免任务启动失败=====" hdfs dfs -test -d /wordcount/output if [ $? -eq 0 ];then hdfs dfs -rm -r /wordcount/output echo "旧输出目录清理完成" fi echo "=====3.创建统一HDFS输入目录=====" hdfs dfs -mkdir -p /wordcount/input三、Windows 运维机标准化 Maven 环境配置
统一团队 pom 依赖版本,杜绝 Jar 包冲突、类加载异常,打包插件内置主类无需集群传参。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hadoop</groupId> <artifactId>WordCountDemo</artifactId> <version>1.0</version> <properties> <hadoop.version>3.3.4</hadoop.version> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-jobclient</artifactId> <version>${hadoop.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <mainClass>com.hadoop.WordCountDriver</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>四、MapReduce 三核心运维通用代码
1. Mapper 类:内置空行脏数据过滤,减少 Shuffle 传输
2. Reducer 聚合类:标准分组求和模
package com.hadoop; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } }3. Driver 驱动类:可动态传入 HDFS 输入输出路径
package com.hadoop; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCountDriver { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "wordcount-offline-task"); job.setJarByClass(WordCountDriver.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); boolean result = job.waitForCompletion(true); System.exit(result ? 0 : 1); } }五、运维标准化 Jar 打包流程
1、IDEA 右侧 Maven 面板,先执行 clean 清理旧产物,再执行 package 打包;
2、target 目录自动生成可执行 Jar,内置主类,集群直接运行无需指定全类名。
六、集群全流程运维操作命令
1. 本地测试文本创建
vim /opt/word.txt # 文本内容 hello hadoop hello mapreduce hadoop mapreduce java hello java hadoop2. 集群启动与数据上传
# 启动Hadoop集群 start-all.sh3. HDFS创建输入目录
hdfs dfs -mkdir -p /wordcount/input4.上传本地测试文件到HDFS
hdfs dfs -put /opt/word.txt /wordcount/input5.MR 任务提交执行
hadoop jar /opt/WordCountDemo-1.0.jar /wordcount/input /wordcount/output6. 结果校验(运维报表核对标准操作)
hdfs dfs -cat /wordcount/output/part-r-00000 # 预期输出 hadoop 3 hello 3 java 2 mapreduce 2七、运维高频故障解决方案
- JDK 版本不匹配,类版本异常 根因:本地 IDEA JDK 与集群 JDK 版本不一致;运维方案:全环境统一 JDK8。
- 输出目录已存在任务直接失败 运维标准动作:前置 Shell 脚本自动递归删除旧输出路径。
- MRAppMaster 无法找到 根因 mapred-site 缺少运行配置;运维修复:补充 YARN、MR 配套配置文件。
- HDFS 安全模式禁止写入 修复:执行
hdfs dfsadmin -safemode leave手动退出安全模式。 - 权限拒绝 规范:所有 Hadoop 操作统一使用 hadoop 业务用户执行。
八、运维落地小结
整套 MapReduce 开发运维流程分为四层标准化管控:
- 开发层:统一 Maven pom 配置,规避 Jar、版本冲突;
- 打包层:固定 clean+package 打包流程,内置程序入口;
- 集群层:前置巡检 + 清理脚本自动化,减少人工失误;
- 故障层:汇总版本、路径、安全模式等线上高频问题,快速恢复离线统计任务。 整套流程可做成团队运维操作规范,新人直接复刻,大幅降低开发侧集群故障工单。