Haddop:Mapreduce

Hadoop的核心思想之一是mapreduce(分布式计算框架)
Compute:计算层(处理层)
HDFS:分治

一、What? 什么是MR

1、过滤性别为0的
循环处理每行记录,切割性别列,进行过滤
2、转换码值为字典值
read line,切割性别列,进行转换
3、展开字段为复合值
read line,切割性别列,进行转换

简单概括:
MAP:以一条记录为单位做映射。
REDUCE:以一组记录为单位做计算。
什么叫一组?分组!
分组依赖一种数据格式:key:value
k,v的实现:MAP实现的

1、思考:为啥叫MapReduce?

  • Map
    映射、变换、过滤
    一进N出
  • Reduce
    分解、缩小、归纳
    一组进N出
  • (KEY,VAL)
    键值对的键划分数据分组

2、MapReduce逻辑架构

MapReduce逻辑架构

1)蓝色框(方法)
2)虚线框(任务task)
3)part分区(包含若干组)
4)Split分片:逻辑划分,不包含具体数据,只包含这些数据的位置信息,一个Split只会包含一个File的block,不会跨文件

块、切片、map、reduce、组、分区的关系:

1)bloock:split=1:1,1:N,N:1,
2)split:map=1:1
3)map:reduce=N:1,1:1,N:N,1:N
4)group(key):partiton=1:1,N:1,N:N

总结:

MR:数据以一条记录为单位,经过map方法映射成kv键值对,相同的key为一组,这一组数据调用一次reduce方法,在方法内迭代计算一组数据。(迭代器模式)

经验:数据集一般是用迭代计算的方式

详情:map到reduce线性发展顺序关系。map并行度,由计算层切片split的数量决定(可调的窗口机制,split默认=Block(文件),一般不会调),split与map为1:1的关系,切片split里面要格式化format出一条记录,以一条记录为单位调用一次map方法(map方法以记录为单位调用),map的输出是k,v(kv完成分组的事情,相同的k为一组,一组数据调用一次reduce方法,一组数据不能被破坏),每个reduce拉取属于自己的分区的数据(一个reduce任务一个分区,每个分区包含若干组),reduce的个数由人决定(reduce并行度)。

1.一个map只会处理一个Split
2.map处理完的数据会分成不同的partition
3.一类partition对应一个reduce
那么一个mr程序中 map的数量是由split的数量决定的,reduce的数量是由partiton的数量决定的。

3、MapReduce执行过程

MapReduce执行过程

1、input split:切片会格式化出记录,以记录为单位调用map方法
2、map:map的输出映射成kv,kv会参与一次分区计算,拿着key算出P分区号,最终输出k,v,p(相同的k,p是一样的)
3、buffer内存缓冲区:默认为100M,分区排序,内部有序外部无序,先快速排序后归并排序
4、内存缓冲区溢写磁盘时做一个2次排序,分区有序,且分区内key有序,未来相同的一组key会相邻的排在一起。一次写入(一次用户态与内核态的切换)
5、map Task的输出是一个文件,存在本地文件系统中
6、reduce的归并排序其实可以和reduce方法的计算同时进行,尽量减少IO,因为有迭代器模式的支持。

迭代器模式是批量计算中非常优美的实现形式。

Mapreduce的执行步骤:

MapReduce的执行过程主要包含是三个阶段:Map阶段、Shuffle阶段、Reduce阶段

一、Map任务处理
1)读取HDFS中的文件,每一行解析成一个。每一个键值对调用一次map函数。
2)覆盖map(),接收1.1产生的,进行处理,转换为新的输出。
3)对1.2输出的进行分区。默认分为一个区。
4)对不同分区中的数据进行排序(按照k)、分组。分组指的是相同的key的value放到一个集合中。排序后 分组后:
5)(可选)对分组后的数据进行归约。

二、Shuffle
Shuffle,翻译成中文是混洗。mr没有排序是没有灵魂的,shuffle是mr中非常重要的一个过程。他在Map执行完,Reduce执行前发生。

Shuffle阶段横跨Map端和Reduce端,在Map端包括Spill过程,在Reduce端包括copy和merge/sort过程。通常认为Shuffle阶段就是将map的输出作为reduce的输入的过程。

1、Map阶段的shuffle
数据经过用户自定的map函数处理完成之后,数据会放入内存中的环形缓冲区之内,他分为两个部分,数据区和索引区。数据区是存放用户真实的数据,索引区存放数据对应的key值,partition和位置信息。当环形缓冲区数据达到一定的比例后,会将数据溢写到一个文件之中,即途中的spill(溢写)过程。
在溢写前,会将数据根据key和partition进行排序,排好序之后会将数据区的数据按照顺序一个个写入文件之中。这样就能保证文件中数据是按照key和parttition进行排序的。最后会将溢写出的一个个小文件合并成一个大的文件,并且保证在每一个partition中是按照Key值有序的。

总结:
Collect阶段将数据放进环形缓冲区,缓冲区分为数据区和索引区。
Sort阶段对在同一partition内的索引按照key排序。
Spill阶段跟胡排好序的索引将数据按照顺序写到文件中。
Merge阶段将Spill生成的小文件分批合并排序成一个大文件。

2、Reduce阶段的shuffle
reduce节点会将数据拷贝到自己的buffer缓存区中,当缓存区中的数据达到一定的比例的时候,同样会发生溢写过程,我们任然要保证每一个溢写的文件是有序的。与此同时,后台会启一个线程,将这些小文件合并成一个大文件,经过一轮又一轮的合并,最后将这些文件合并成一个大的数据集。在这个数据集中,数据是有序的,相同的key值对应的value值是挨在一起的。最后,将这些数据交给reduce程序进行聚合处理。

总结:
Copy阶段将Map端的数据分批拷贝到Reduce的缓冲区。
Spill阶段将内存缓存区的数据按顺序写到文件中。
Merge阶段将溢出的文件合并成一个排序的数据集。

三、Reduce任务处理
1)多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点上。
2)对多个map的输出进行合并、排序。覆盖reduce函数,接收的是分组后的数据,实现自己的业务逻辑, 
处理后,产生新的输出。
3)对reduce输出的写到HDFS中。

参考资料:
https://www.cnblogs.com/lfxiao/p/10770051.html
https://www.jianshu.com/p/d1e7b4ff3810

你可能感兴趣的:(Haddop:Mapreduce)