MapReduce: MapTask & ReduceTask
- 每一个block会有map任务 。
- block切分为切片,每个切片对应一个map任务,默认一个block,一个切片,一个map。
- map默认按行读取切片数据,组成键值对<当前行的字节偏移量,读取到行的字符串>。
-
map函数对该键值对进行计算,输出若干键值对。<key, value, partition>,partition指定该键值对由哪个reducer进行处理 。
-
map输出的kvp写到环形缓冲区,环形缓冲区默认100MB,阈值80%,当环缓达到80%就向磁盘溢写小文件,该小文件首先按照分区号排序,相同分区号的按key进行排序。
-
默认如果落磁盘的小文件达到了3个,则进行归并,归并的大文件也是按分区号排序,相同分区号按照key进行排序。只是一个归并。
-
如果map任务处理完了,它的输出被下载到reducer所在主机
按照HTTP GET的方式下载到reducer:
reducer发送HTTP GET请求到mapper主机下载数据,该过程是洗牌shuffle
-
每个map任务都要经历运行结束洗牌的过程
-
可以设置combinClass,先在map端对数据进行一个压缩,比如10w个<hello,1>压缩为1个<hello, 10w>通过网络IO洗牌,肯定要快很多。一般情况下,combineClass就是一个reducerClass。combinerClass的设置要求数据算法满足结合律。
reeduce任务开始
-
等所有map任务都运行结束,并且洗牌结束,每个reducer获取到它自己应得的所有数据,此时开始reducer处理过程。
-
如果有时间,reduce会对洗牌获取的数据进行归并落磁盘
如果没有时间,也归并,只是可能不落磁盘,直接交给reduce方法进行迭代处理了。
洗牌获取到的数据也可能不落磁盘,此时归并的键值对来源可能是磁盘的和内存的一个混合。
-
reduce按照key进行分组,每个分组调用一次reduce方法,该方法迭代计算,将结果写到HDFS输出。
总结
Map:
1、根据业务需求处理数据并映射为KV模型
2、并行分布式
3、计算向数据移动
Reduce:
1、数据全量/分量加工
2、Reducer中可以包含不同的key 分区的范围大于分组
3、相同分区的Key汇聚到一个Reducer中
4、“相同”的Key调用一次reduce方法
5、排序和比较实现key的汇聚
K,V使用自定义数据类型 MyKey:WritableComparable
MyValue:Writable
1、节省开发成本,提高程序自由度
2、框架会对键和值序列化,因此键类型和值类型需要实现Writable接口。
3、框架会对键进行排序,因此必须实现WritableComparable接口。