Hadoop MapReduce程序运行失败,报错:FAILED due to: NA 求助
Hadoop MapReduce电影分析程序运行失败排查
我尝试运行以下用于电影分析的Hadoop MapReduce程序:
public static class MovieFilterMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private Text movieId = new Text(); private IntWritable one = new IntWritable(1); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] columns = value.toString().split(","); if (columns.length >= 8) { double popularity = Double.parseDouble(columns[5]); double voteAverage = Double.parseDouble(columns[6]); double voteCount = Double.parseDouble(columns[7]); if (popularity > 500.0 && voteAverage > 8.0 && voteCount > 10000.0) { movieId.set(columns[1]); // 假设'id'列存储电影ID context.write(movieId, one); } } } } public static class MovieCountReducer 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 value : values) { sum += value.get(); } context.write(key, new IntWritable(sum)); } } public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "Movie Analysis"); job.setJarByClass(MovieAnalysis.class); job.setMapperClass(MovieFilterMapper.class); job.setReducerClass(MovieCountReducer.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); }
程序运行失败,错误信息为:Hadoop mapreduce code failed with state FAILED due to: NA,报错截图如下:
可能的故障原因及解决方法
1. 输入数据格式问题
- 代码假设输入数据用逗号分隔且至少8列,但实际数据可能存在:
- 部分行列数不足8列,或第5、6、7列是空值/非数字格式,触发
Double.parseDouble异常 - 字段包含逗号(比如带逗号的电影名称),导致
split(",")分割逻辑错误
- 部分行列数不足8列,或第5、6、7列是空值/非数字格式,触发
- 解决方法:
- 校验输入数据格式,确保所有行满足列数要求,且目标列是有效数字
- 改用Apache Commons CSV等专业库解析CSV数据,避免手动分割的局限性
2. 作业配置与打包问题
- 主类
MovieAnalysis未正确打包进Jar,或setJarByClass指定的类路径错误 - Hadoop集群环境变量配置异常,导致作业无法加载依赖类
- 解决方法:
- 打包Jar时确保包含
MovieAnalysis主类及所有内部类 - 运行作业时指定正确的Jar路径,检查
HADOOP_CLASSPATH等环境变量配置
- 打包Jar时确保包含
3. 输出路径已存在
- Hadoop要求输出目录必须不存在,若
args[1]指定的路径已存在,作业会直接失败 - 解决方法:
- 运行前手动删除输出目录,或在代码中添加路径判断逻辑:
Path outputPath = new Path(args[1]); FileSystem fs = FileSystem.get(conf); if (fs.exists(outputPath)) { fs.delete(outputPath, true); } FileOutputFormat.setOutputPath(job, outputPath);
- 运行前手动删除输出目录,或在代码中添加路径判断逻辑:
4. 日志缺失导致错误信息模糊
- 错误提示中的
due to: NA说明未获取到具体异常,需查看Hadoop作业日志定位问题 - 解决方法:
- 执行
yarn logs -applicationId <你的应用ID>查看作业日志 - 检查NodeManager或ResourceManager的本地日志文件,获取完整异常堆栈
- 执行
内容的提问来源于stack exchange,提问作者Veen
相关产品推荐
相关产品推荐

