MapReduce

来源:互联网 发布:恺英网络工作怎么样 编辑:程序博客网 时间:2024/05/10 03:28

MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.

MR由两个阶段组成:MapReduce,用户只需要实现map()reduce()两个函数,即可实现分布式计算,非常简单。

这两个函数的形参是keyvalue对,表示函数的输入信息。



◆执行步骤:

 1. map任务处理

1.1读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。

1.2写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。

1.3对输出的key、value进行分区。

1.4对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。

1.5 (可选)分组后的数据进行归约。

2.reduce任务处理

2.1对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。

2.2对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。

2.3把reduce的输出保存到文件中。


最小的MapReduce驱动

Configuration configuration = new Configuration();

Job job = newJob(configuration, "HelloWorld");

job.setInputFormat(TextInputFormat.class);

job.setMapperClass(IdentityMapper.class);

job.setMapOutputKeyClass(LongWritable.class);

job.setMapOutputValueClass(Text.class);

job.setPartitionerClass(HashPartitioner.class);

job.setNumReduceTasks(1);

job.setReducerClass(IdentityReducer.class);

job.setOutputKeyClass(LongWritable.class);

job.setOutputValueClass(Text.class);

job.setOutputFormat(TextOutputFormat.class);

job.waitForCompletion(true);


FileInputFormat是所有以文件作为数据源的InputFormat实现的基类,FileInputFormat保存作为job输入的所有文件,并实现了对输入文件计算splits的方法。至于获得记录的方法是有不同的子类——TextInputFormat进行实现的。 

InputFormat负责处理MR的输入部分.

有三个作用:

v验证作业的输入是否规范.
v把输入文件切分成InputSplit.
v提供RecordReader的实现类,把InputSplit读到Mapper中进行处理.

◆   在执行mapreduce之前,原始数据被分割成若干split,每个split作为一个map任务的输入,在map执行过程中split会被分解成一个个记录(key-value对),map会依次处理每一个记录。

◆   FileInputFormat只划分比HDFS block大的文件,所以FileInputFormat划分的结果是这个文件或者是这个文件中的一部分.               

◆   如果一个文件的大小比block小,将不会被划分,这也是Hadoop处理大文件的效率要比处理很多小文件的效率高的原因。

◆    Hadoop处理很多小文件(文件大小小于hdfs block大小)的时候,由于FileInputFormat不会对小文件进行划分,所以每一个小文件都会被当做一个split并分配一个map任务,导致效率底下。


◆  TextInputformat是默认的处理类,处理普通文本文件。

◆  文件中每一行作为一个记录,他将每一行在文件中的起始偏移量作为key,每一行的内容作为value

◆  默认以\n或回车键作为一行记录。

◆  TextInputFormat继承了FileInputFormat


◆    CombineFileInputFormat

       相对于大量的小文件来说,hadoop更合适处理少量的大文件。

        CombineFileInputFormat可以缓解这个问题,它是针对小文件而设计的。

◆    KeyValueTextInputFormat

        当输入数据的每一行是两列,并用tab分离的形式的时候,KeyValueTextInputformat处理这种格式的文件非常适合。

◆    NLineInputformat 
       
NLineInputformat可以控制在每个split中数据的行数。

◆    SequenceFileInputformat 

        当输入文件格式是sequencefile的时候,要使用SequenceFileInputformat作为输入。


◆    TextOutputformat

       默认的输出格式,keyvalue中间值用tab隔开的。

◆    SequenceFileOutputformat

       keyvaluesequencefile格式输出。

◆    SequenceFileAsOutputFormat

       keyvalue以原始二进制的格式输出。

◆    MapFileOutputFormat

       keyvalue写入MapFile中。由于MapFile中的key是有序的,所以写入的时候必须保证记录是按key值顺序写入的。

◆    MultipleOutputFormat

        默认情况下一个reducer会产生一个输出,但是有些时候我们想一个reducer产生多个输出,MultipleOutputFormatMultipleOutputs可以实现这个功能。









0 0
原创粉丝点击