【问题标题】:Reducer not working in Hadoop MapreduceReducer 在 Hadoop Mapreduce 中不起作用
【发布时间】:2015-11-04 23:05:45
【问题描述】:

嗨,我的 Reducer 没有打印所需的结果,请查看代码。

这是我的地图功能

public  void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException 
        {   

            String str_line = value.toString();
            Detail_output1_column_array = str_line.split("\\"+tabSpace);


            Outputkey = Detail_output1_column_array[2];
            System.out.println(Outputkey);
            context.write(new Text(Outputkey),NullWritable.get());
        }
    }

    public  static class ShopFile_Reducer extends Reducer<Text,Iterable<NullWritable>,NullWritable,Text> {


        public void reduce(Text Key,Iterable<NullWritable> Values,Context context) throws IOException, InterruptedException {



            Key = new Text(Key.toString());
            context.write(NullWritable.get(),new Text(Key));

        }

    }

假设 Detail_output1_column_array[2] 包含 01 01 01 02 01 02 01 03 01

reducer 之后我需要这样的输出 01 02 03

但它正在打印所有内容 01 01 01 02 01 02 01 03 01

这是我的驱动类

Configuration Shopconf = new Configuration();
        Shopconf.setStrings("DTGroup_input",DTGroup_input);
        Job Shop = new Job(Shopconf,"Export_Column_Mapping");
        Shop.setJarByClass(ExportColumnMapping.class);
        Shop.setJobName("ShopFile_Job");
        Shop.setMapperClass(ShopFile_Mapper.class);
        Shop.setReducerClass(ShopFile_Reducer.class);
        Shop.setInputFormatClass(TextInputFormat.class);
        Shop.setOutputFormatClass(TextOutputFormat.class);
        Shop.setMapOutputKeyClass(Text.class);
        Shop.setMapOutputValueClass(NullWritable.class);
        Shop.setOutputKeyClass(Text.class);
        Shop.setOutputValueClass(Text.class);
        FileInputFormat.addInputPath(Shop, new Path(outputpath+"/Detailsfile/part*"));
        FileOutputFormat.setOutputPath(Shop, new Path(outputpath+"/Shopfile"));
        Shop.waitForCompletion(true);

【问题讨论】:

  • 01 01 01 02 01 02 01 03 01 .... 这是单个值还是各种输入行的映射输出?
  • 你的输入格式是什么?在您的代码 sn-p 中,您的映射器实际上将 &lt;"01 01 01 02 01 02 01 03 01", NullWritable&gt; 写入减速器,它应该改为写入 &lt;"01", NullWritable&gt;&lt;"01", NullWritable&gt;&lt;"02", NullWritable&gt;
  • 是输入文件@madhu中各行的map输入。
  • 能否使用 system.out.println 打印 reducer 中的关键变量并告诉我们确切的结果
  • @user2018791 no ,maper 输出如你所愿 ,,

标签: hadoop mapreduce


【解决方案1】:

在您的映射器代码中 使用这个Outputkey.set( Detail_output1_column_array[2]); 而不是Outputkey = Detail_output1_column_array[2];

【讨论】:

    【解决方案2】:

    你写错了

     Detail_output1_column_array = str_line.split("\\"+tabSpace);
    

    似乎字符串拆分无法正常工作。如果你想按制表符和空格分割它,你应该把它改成

    Detail_output1_column_array = str_line.split("( |\\t)");
    

    【讨论】:

      【解决方案3】:

      您可以在您的配置中进行以下更改并检查

      代替这一行

       Shop.setOutputKeyClass(Text.class);
      

      添加这一行

      Shop.setOutputKeyClass(NullWritable.class);
      

      【讨论】:

      • 我试过还是没有产生预期的结果
      【解决方案4】:

      好的。所以我不知道那里到底出了什么问题。你的代码对我有用。

      我的数据:

      bash-4.1$ hdfs dfs -cat input/numbers
      a   01
      b   01
      a   01
      a   02
      a   01
      a   02
      a   01
      a   03
      a   01
      

      输出:

      bash-4.1$ hdfs dfs -cat output/part-r-00000
      01
      02
      03
      

      您的代码:

      import org.apache.hadoop.conf.Configuration;
      import org.apache.hadoop.fs.*;
      import org.apache.hadoop.io.LongWritable;
      import org.apache.hadoop.io.NullWritable;
      import org.apache.hadoop.io.Text;
      import org.apache.hadoop.mapred.MapTask;
      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.Iterator;
      
      public class HdfsFiles {
        public static void main(String[] args) throws Exception {
          Configuration conf = new Configuration();
          conf.set("fs.defaultFS", "hdfs://namenode:9000");
          Job job = Job.getInstance(conf);
          job.setJarByClass(HdfsFiles.class);
          job.setJobName("myjob");
          job.setMapperClass(ShopFile_Mapper.class);
          job.setReducerClass(ShopFile_Reducer.class);
      
          FileInputFormat.addInputPath(job, new Path("input"));
          FileOutputFormat.setOutputPath(job, new Path("output"));
      
          job.setMapOutputKeyClass(Text.class);
          job.setMapOutputValueClass(NullWritable.class);
      
          job.setOutputKeyClass(NullWritable.class);
          job.setOutputValueClass(Text.class);
      
          System.exit(job.waitForCompletion(true) ? 0 : 1);
        }
      
        static class ShopFile_Mapper extends Mapper<LongWritable, Text, Text, NullWritable> {
          @Override
          protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String str_line = value.toString();
            context.write(new Text(str_line.split("\\t")[1]), NullWritable.get());
          }
        }
      
        static class ShopFile_Reducer extends Reducer<Text, Iterator<NullWritable>, NullWritable, Text> {
          @Override
          protected void reduce(Text key, Iterable<Iterator<NullWritable>> values, Context context) throws IOException, InterruptedException {
            context.write(NullWritable.get(), key);
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多