1.MapReduce概述
1.设计理念
把代码拷贝到节点上,而不是拷贝数据。
2.计算框架
数据来源于HDFS的block。
解读:图为统计文本中单词出现次数
- 一共4个步骤:spliting/mapping/shuffing/reducing
- split把输入文件分割(但不一定是按行分割)
- map从split的结果取出单词,单词为键,值为1,形成键值对的形式
- shuffling把相同的单词合并
- reduce把结果汇总,值相加(reduce也可能只有一个,汇总时先统计Bear,再统计Car……)
3.Shuffler
其框架如下:
- map后的数据存放在内存中,经过分区和排序,再溢写到磁盘中(此任务在map所在当前节点本地完成)
- partition分区就是把map的数据分成一个个部分,规则由程序员指定,默认由哈希模运算分区,分区的目的是把map的输出数据进行负载均衡
- sort比较规则为按照ASCII码大小进行比较
- merge on disk:合并到磁盘,默认规则为按照哈希值进行合并
- 分区在把数据传入reduce的时候起作用。例如:分区在0区,就传给第1个reduce;在1区,就传给第2个reduce……
主要考点:partition/sort/combiner,combiner可以没有。
上面统计单词个数的框架中,map阶段就可以使用combiner,使第2个map中的(car,1)(car,1)变成(car,2)。
下图为reduce的工作流程:
过程如上上图所说,reduce从task tracker拷贝数据,存入内存缓冲区中,満了就溢写到disk中,再合并成一个大文件(合并规则是按照键进行合并),然后作为reduce的输出。
4.split
split为把block切割成一个个片段。
上图前3行为说明,最后一行为计算split大小的算法:先取max.split和block的最小值,再取min.split和刚才得到的最小值的最大值。
5.JobTracker和TaskTracker
- JobTracker在2.x版本后就没有了
- TaskTracker负责执行每一个任务是指map任务或reduce任务
- JobTracker可以运行在任何节点,而TaskTracker一般运行在DataNode上