You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:15:39