MapReduce 1底层实现原理

来源:互联网 发布:华康少女字体mac 编辑:程序博客网 时间:2024/05/20 05:57

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/MapReduce 1底层实现原理/

1、 云计算框架:
   MapReduce:适合离线计算
   Storm:流式计算框架,实时计算
   Spark:内存计算框架,快速得到结果的情形
2、 MapReduce理念:移动计算而不移动数据!
3、 MapReduce流程:
   数据来源:HDFS
   数据去处:HDFS
 
(1) Split部分:先把HDFS取出的数据分割成多块split;
   默认split算法:
   假设split的最大和最小以及block大小如下:
   Max.split(100M),min.split(10M),block(64M)
   Split算法为:max(min.split,min(max.split,block))
(2) Map部分:一个Map就是一个java线程,每个Split分配给一个Map去执行,多个Map之间并发执行,Map执行过程是开发者自定义的处理过程,输入输出都必须是键值对的形式,
(3) Shuffling部分:把所有Map执行的结果进行分区、合并(相同Key)和排序(Value),每个相同的Key形成一个集合,每个分区传给一个Reduce
(4) Reduce部分:Reduce收到多个Map传来的相应partition的数据,先把这些数据按照Key值进行合并,形成一个个相同Key值的集合,每个集合再传给reduce执行;
   不同Reduce之间可并发执行;
   Reduce数量开发者根据任务规模进行设定,Reduce越多执行越快;
(5) Part部分:reduce对数据执行完成之后,再把结果数据写入HDFS中,完成这次计算过程;

Shuffling流程(Partition--sort--spill--merge--fetch):
 
(1) Map执行结果数据(可能是内存放不下的,执行过程中就要边写入HDFS),写入(Spill)HDFS的过程中执行了Partition和sort操作,将Map执行结果进行分区和排序:

(2) Partition分区:将Map的结果分成多个分区,每个分区交给不同的reduce去执行
   默认方式是哈希模运算(以reduce数量为模)(这个方法也是可能产生数据倾斜问题的),可自行编写设定,这是为了之后的不同分区送给不同的reduce进行运算操作。(解决负载均衡和数据倾斜问题)
(3) Sort:默认为ASCII字典排序,11排在9前面,内部操作并没有真正进行排序,只是给数据赋值了一个表示顺序的标记位。
(4) 由(1)说明可知,一个Map的结果数据是边运行边写入HDFS的,buffer满了才会spill到磁盘中,每次spill都形成一个文件,就造成了好多个buffer块文件,merge操作就是把这些buffer文件按照分区合并(Combiner)(sort的实际执行时点)在一起,形成完整的Map结果(按照分区完整存于HDFS中)。
   合并规则:按照哈希值合并--即Map的相同Key值合并在一起(可自定义)
   合并目的:为之后的fetch网络拷贝减少数据量,加快速度
(5) Fetch过程:根据分区编号将各自分区传送给对应的reduce进行处理


负载均衡和数据倾斜问题:(分析方式--分析需要分析的过程的数据来源)
(1) Map过程:来源于HDFS的Split切片,Split自己的切面规则不会导致数据倾斜问题,并且HDFS的Block不外乎128M,肯定不会有这个问题
(2) Reduce过程:通过Shuffling将Map分区交给reduce,只要保证分区规则适当,不会让某个或某几个reduce执行大量任务,就不会有数据倾斜问题,默认Partition不完美,需要根据情况调整适当的分区规则。
注:Map处理过后的每个数据块大小是基本一致的,因此只要控制好reduce处理的数据块数量,解决数据倾斜问题,就解决了负载均衡问题。

流程中开发者可开发修改部分
   A、 Partition:自定义分区规则
   B、 Sort:自定义比较规则(Key比较)
   C、 Combiner:buffer块的合并规则,先sort再Combiner,这个过程是可选的,有些业务逻辑无法合并就不能强求,这个过程是为了减少网络资源消耗
   D、 Reduce过程:对map的执行结果合并之后的集合进行相关的操作,和业务逻辑相关,开发者根据自己的业务需求进行相应的开发修改工作;

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/MapReduce 1底层实现原理/


0 0