1、map类

  map类继承了库类中的Mapper,即Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>。通常map类中会重写map方法,map每次只接受一个key-value,然后对其进行预处理,再分发出处理后的数据。其map方法为:

protected void map(Object key, Value value, Context context)
        throws IOException, InterruptedException{
    context.write((KEYOUT) key, (VALUEOUT) value);
}

2、Reducer类

  Reducer类继承了类库中的Reducer,原型为Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>,reduce类除了reduce方法不一样外,其他跟map均一样,功能也相同。其reduce方法为:

protected void reduce(Text key, Interable<InterWrite> values, Context context)
        throws IOException, InterruptedException {
    for(Interable<IntWritable> value: values) {
        context.write(Text key, IntWritable value;
    }           
}

3、mapreduce驱动

  简单来说就是Main函数中的代码,一般情况下包括:

        Configuration conf = new Configuration();
        //获取输入输出文件路径
        String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
        if(otherArgs.length != 2){
            System.err.println("Usage WordCount <int> <out>");
            System.exit(2);
        }
        Job job = new Job(conf,"Dedup");
        job.setJarByClass(Dedup.class);          //主类                                      
        job.setMapperClass(Map.class);           //map类
        job.setCombinerClass(Reduce.class);  //job合成类
        job.setReducerClass(Reduce.class);    //reduce类
        job.setOutputKeyClass(Text.class);      //设置job输出数据的key类
        job.setOutputValueClass(Text.class);   //设置job输出数据的value类
        FileInputFormat.addInputPath(job, new Path(otherArgs[0]));     //文件输入
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); //文件输出
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }

其实这里还包括一个maprecude最小驱动即之调用MiniMapReduceDriver类,

        Job job = new Job(conf,"Dedup");
        job.setJarByClass(Dedup.class);
        FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);

4、InputFormat接口

  InputFormat类的层次结构如下所示。TextInputFormat是InputFormat的默认实现方式,对输入数据中没有明确key-value时很有效,其返回的key表示这行数据的偏移量,value为行的内容。

5、InputSplit类

  默认情况下,FileInputFormat及其子类以64MB(建议Split大小与此相同)为基数拆分文件。通过以块形式处理文件,可以让多个Map任务并行地操作一个文件。对于大文件,就会极大提升性能。map的输入是一个个的输入分片,即为InputSplits。

  InputSplit的子类有FileSplit和CombineFileSplit。两者均包含文件路径、分片开始位置、分片大小、存储分片数据的host列表。但CombineFileSplit是针对小文件,其将很多小文件包在一个InputSplit内,这样就能处理很多小文件了。

  针对某些文件不可切分,则可通过两种方式完成,第一种为将文件最小分片大小设置为大于文件大小,第二种方法为使用FileInputFormat的子类,并重载isSplitable方法,把返回值设置为false。

6、RecordReader类

  InputSplit定义了如何切分工作,RecordReader类则定义了如何加载数据并转换为适合map方法读取的key-value对。其默认输入格式为TextInputFormat。

7、OutputFormat类

  与InputFormat相似,其大多数继承自FileOutFormat,但NullOutputFormat和DBOutputFormat除外。其默认格式为TextOutputFormat。OutputFormat提供了对RecordWriter的实现,从而指定如何序列化数据。RecordWriter类可以处理包含单个键值对的作业,并将结果写入OutputFormat已准备好的位子中。RecordWriter主要通过write和close两个函数实现。write函数从MapReduce作业中取出键值对,并将其字节写入磁盘。close函数会关闭hadoop到输出文件的数据流。

  OutputFormat的层次结构图如下:

8、RecordWriter类

  LineRecordWriter是默认使用的RecordWriter,写入内容包括:key的字节,一个用以定界的制表符,value的字节,一个换行符。

posted on 2015-12-16 22:53  成长中的蒲公英  阅读(2127)  评论(0编辑  收藏  举报