Hadoop Reducer无输出问题:MapReduce任务完成但输出文件为0字节
MapReduce任务输出为空的问题排查与修复
任务显示执行成功,但Map输出记录数为0、HDFS写入字节数为0,输出文件为空,核心问题集中在代码的逻辑错误与类型不匹配上,具体如下:
1. Map函数条件判断逻辑完全错误
原Map函数的判断条件:
if(line.length() == 0 && !line.contains("MAX")) {
此逻辑要求仅空行且不含"MAX"时才执行后续代码,但空行没有足够字符支撑substring操作,且完全违背了“跳过空行和含MAX的行”的实际需求,导致所有有效行被过滤,Map无输出。
修正后的条件:
if(line.length() != 0 && !line.contains("MAX")) {
2. Map输出值类型与Job配置不匹配
Main函数中配置的Map输出值类型为Text.class:
job.setMapOutputValueClass(Text.class);
但Map函数实际输出的是FloatWritable类型:
context.write(new Text("Hot Day" + date), new FloatWritable(temp_Max));
类型不匹配会导致数据无法正确传递,即使修复条件判断也会引发运行时错误。需将配置改为:
job.setMapOutputValueClass(FloatWritable.class);
3. Reducer泛型与方法参数类型不匹配
Reducer类定义的泛型与方法参数完全不匹配:
public static class MaxMinTemperatureReducer extends Reducer<Text, Text, Text, FloatWritable> { public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
需对应Map的输出类型(Text作为key,FloatWritable作为value)修正,同时原代码的求和逻辑不符合“最高/最低温”的业务需求,建议改为求极值:
public static class MaxMinTemperatureReducer extends Reducer<Text, FloatWritable, Text, FloatWritable> { FloatWritable res = new FloatWritable(); public void reduce(Text key, Iterable<FloatWritable> values, Context context) throws IOException, InterruptedException { float extremeTemp = "Hot Day".equals(key.toString().substring(0, 7)) ? Float.MIN_VALUE : Float.MAX_VALUE; for (FloatWritable val : values) { float temp = val.get(); if("Hot Day".equals(key.toString().substring(0, 7))){ extremeTemp = Math.max(extremeTemp, temp); } else { extremeTemp = Math.min(extremeTemp, temp); } } res.set(extremeTemp); context.write(key, res); } }
内容的提问来源于stack exchange,提问作者Anvay
相关产品推荐
相关产品推荐

