一,combiner实验:
Map阶段结束后,产生的键值对的value全为1,为了减少map将键值对传到节点上时用过多的时间和内存,减少reduce端聚合的次数,在map之后reduce之前,先将每个map任务产生的相同key值的value进行一次合并。由于在wordcount中combiner操作与reduce操作是一样的,所以Mycombiner类代码内容与reducer一样。
在编写完combiner类之后,要在主类下进行设置。如下图:
其他类不变。
二,多mapReduce任务的串联。
实际中很多大数据处理任务无法通过一个单独的MapReduce过程完成。下面方法利用原有的wordcount程序实现统计总共使用了多少个单词。
第一个mapreduce产生的结果是,每种单词以及他们出现的次数,
这样我们只需要计算文件的行数就可以了。所以在第二个map阶段,需要把所有的key变成一样的字符,value全部变成1,在reduce阶段就可以将所有的value合并,就是所用单词的个数。
1,第一个map阶段程序没有改变,第二个map阶段的程序如图所示
第一次MapReduce产生的所有键值对全部替换成<”The num of words: ”, 1 >。再进行一次reduce即可。
2,配置wordcount主类。
首先修改之前的job对象名为job1,
删掉result提交运行程序步骤。
在job2阶段加上,
建立第二个job2对象。将第一个job1的输出作为job2的输入。
完成后如下图。
3,在localhost:50070 下BrowseDirectory下建立两个文件夹名为luzhiming1,luzhiming2
4,配置run下的configuration。添加job1,job2的输入输出路径。如下图:
5,运行程序,查看两个目录下的文件如图。
第一次MapReduce结果:
第二个MapReduce结果:
三,对mapreduce的理解总结。
- MapReduce 的作用;
当我们需要处理海量的数据时,单个的计算机很难完成,所以需要将数据分布式储存在很多机器上,这就是hadoop分布式文件系统,而MapReduce就是在hadoop分布式文件系统上处理数据的一种分布式计算模型。
- MapReduce的工作流程:
- Splitting阶段。在input数据后,在此阶段,每个输入文件会被分片输入到map,一个split就是对应一个map处理数据块的描述。
- 将split处理后,数据将<key,value>形式进入到map阶段,执行map任务。Map将初始的<key,value>形式的数据处理为特定的<key,value>的形式。
- Shuffle阶段。混洗操作,将一个map结果分到不同的reduce进行处理。Partition分区操作。将map产生的不同<key, value>键值对分配给不同的reduce;Combine合并操作将一个分区内相同key的value进行合并运算处理,可以减少需要在map和reduce之间传输的数据量。Merge文件合并操作,MapReduce将map产生的<key, value>数据写入磁盘。
- Reduce阶段,reduce数量由分区数决定,将map阶段的结果再次进行合并处理。在wordcount中,reduce阶段将key值相同的键值对的值进行合并。
- output阶段,将reduce结果的每个键值对按一行输出到指定文件。文件路径需要提前在configuration中配置。
总结:
实际上,在对复杂问题进行处理时,往往需要对多个MapReduce任务进行串联,这个时候要理清每个MapReduce的作用。前一个reduce的结果直接输出到map阶段,再执行一次reduce操作,每个MapReduce操作可能相同,也可能不同。