• mapreduce程序调用各个类的功能


    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的字节,一个换行符。

  • 相关阅读:
    进程池线程池
    线程与其操作方法
    生产者消费者模型
    Java反射机制详解
    ajax跨域原理以及解决方案
    数据库连接池的选择 Druid
    新目标
    让webstorm支持avalon语法自动补全
    使用IDEA和gradle搭建Spring MVC和MyBatis开发环境
    使用IDEA自带的rest client参数传递乱码问题
  • 原文地址:https://www.cnblogs.com/z1987/p/5052409.html
Copyright © 2020-2023  润新知