Hadoop WordCount作为入门级的大数据计算示例,在实际运行中偶尔会出现提交后长时间无响应、不报错也不输出结果的情况,这类问题需要从多个维度逐步排查定位。

第一步:检查作业提交状态
首先通过YARN的命令查看作业是否已经成功提交到集群,避免因为提交命令错误导致作业未进入调度队列。
# 查看当前YARN集群所有作业状态 yarn application -list -appStates ALL # 如果知道作业ID,可以查看单个作业的详细状态 yarn application -status application_1234567890123_0001
如果作业没有出现在列表中,说明提交环节出现问题,需要检查提交命令的参数是否正确,比如输入输出路径是否存在、HDFS服务是否正常运行。
第二步:排查资源分配问题
作业长时间无响应最常见的原因是资源不足,无法申请到足够的容器运行任务。
- 检查YARN的可用资源:通过YARN的Web UI或者命令查看集群剩余的内存、CPU资源,是否已经被其他作业占满
- 检查作业资源配置:WordCount默认的资源配置可能不适合当前集群,需要确认
mapreduce.map.memory.mb、mapreduce.reduce.memory.mb等参数设置是否合理 - 检查队列配置:如果集群使用了队列管理,确认提交作业的队列是否有足够的资源配额
如果资源不足,可以调整作业的资源参数,或者终止占用资源过多的其他作业。
第三步:查看作业日志定位具体错误
如果作业已经处于RUNNING状态但长时间没有进度,需要查看作业的具体运行日志。
# 查看ApplicationMaster的日志 yarn logs -applicationId application_1234567890123_0001 # 查看某个Map任务的日志,需要先获取任务ID yarn logs -applicationId application_1234567890123_0001 -containerId container_1234567890123_0001_01_000001
日志中常见的错误包括:数据块损坏、节点磁盘空间不足、依赖的jar包缺失、权限不足无法读取HDFS上的输入文件等,根据日志提示针对性解决即可。
第四步:检查输入数据与代码逻辑
如果资源和日志都没有明显异常,需要检查输入数据和WordCount代码本身的问题。
- 输入数据是否为空,或者输入路径下没有可读取的文件
- 输入文件是否过大,导致Map任务初始化时间过长
- 自定义的WordCount逻辑是否存在死循环,比如分词逻辑错误导致处理单个记录时卡住
以下是一个标准的WordCount代码示例,可以对照检查自己的代码是否存在逻辑问题:
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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
import java.util.StringTokenizer;
public class WordCount {
// Map阶段逻辑
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
@Override
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
// Reduce阶段逻辑
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
第五步:检查集群节点健康状态
最后需要排查集群节点本身的问题,比如某个DataNode或者NodeManager节点宕机,导致作业无法获取数据或者分配容器。
# 检查HDFS节点状态 hdfs dfsadmin -report # 检查YARN节点状态 yarn node -list -all
如果发现有节点处于不健康状态,需要登录对应节点查看磁盘、网络、服务运行情况,修复后重启对应服务即可。
总结
Hadoop WordCount作业无响应的问题排查遵循从外到内、从整体到局部的原则,先确认作业提交和资源分配情况,再查看具体日志和代码逻辑,最后排查集群节点状态,大部分问题都可以通过这个流程快速定位解决。