Hadoop分布式计算框架MapReduce浅析

分布式计算框架有很多,只是适合做的种类不一样。
1、MapReduce适合做离线计算
2、storm适合做流式计算,更适合实时计算
3、spark是内存式计算框架,更适合做快速得到结果的计算

MapReduce设计理念

何为分布式计算

移动计算,而不是移动数据。
把计算程序都进行部署到不同的机器上,然后在不同的机器上进行计算,然后进行汇总,做到不移动计算的数据,也能得到计算结果。

MR(MapReduce)计算框架图解

解决大数据的问题:
1、数据存储(HDFS)
2、数据计算(MapReduce)

首先对数据进行处理split为每一个数据片段,每一数据片段都会有一个map线程去执行,如果有多个片段会并发的同时执行。

所以:如上图:
第一个步骤是:如何把数据切片,按照什么规则去切分。
第二个步骤是:就是map部分
第三个步骤是shuffle部分
第四个部分是 reduce部分
第五个部分就是 输出部分(计算生成的数据,也是保存在HDFS上)

整个MR过程就是:就是把HDFS数据进行计算处理,然后输出结果

实例MR计算


在shuffling阶段会有相应的合并和排序
有可能reduce为一个或者多个,这个是由程序去决定。

hadoop计算框架Shuffler

Shuffer的功能:
在mapper 和reducer中间的一个步骤。
可以把mapper的输出按照某种key值重新切分和组合成n份,把key值符合某种范围的输出送到特定的reducer那里,
可以简化reducer过程。

map过程

map是一个Java程序,或者其他计算机程序,map得到的结果在内存中, 内存有一定的阈值,当到达一定的阈值后,就需要写入到磁盘中, 这个过程叫做溢写。

在写入之前要做几件事情,partion和sort。把当前map的数据进行输出和排序,然后再溢写到磁盘。放在磁盘中的数据是已经排好序的数据。

什么是partition?

partition分区的数据是为以后产生作用的。把map的输出数据分成一个一个区,partition可以由程序员自定义编写代码。如果不写按照默认的分区模式进行分区,默认的分区模式是什么呢? Hash模运算
1、获取hash值,每个对象的hash值得到一个整数,把这个整数模reduce的个数,得到一个结果。假如:hash模2,只有两种结果0或者1,然后map的结果分成了两个部分,0区或者1区。

分区有什么作用??? 这是mapredure如何结局负载均衡和数据倾斜?

分区是为了把map的输出进行负载均衡,解决数据倾斜的问题。这样后期通过reduce进行计算的数据就不会有数据倾斜问题,一个计算的过多,一个计算的过少。这就是分区的作用。

map为什么不会数据倾斜???
map的数据是切片,每一片的大小相等,所以map的输入数据不会出现数据倾斜的问题。

sort
sort也有默认的的sort。默认的sort是按照ascii进行排序的。(即按照字典进行排序的)
为什么要sort???定义排序规则

上图中merge on disk什么意思???
每次都会溢写到磁盘中,溢写会按照hash值进行合并,相同hash值放到一起。每一次溢写就会生成一个文件,溢写的次数越多,生成的文件越多,这些文件需要进行合并为一个大的文件,如何合并,就是按照hash值进行合并,这是默认的规则。

合并的目的???
减少map的输出,因为后期reduce会移动map的输出到reduce服务器上,减少map的输出,就会减少网络io的操作,所以很有必要的。

以上是map的处理

reduce过程

map的处理结果落到磁盘以后,然后会进行merge,为什么merge,如果merge???

reduce 的输入数据就是map的输出数据,reduce的数据来源是map输出数据的拷贝。拷贝哪些数据,是根据partition的结果,只拷贝分给对应的reduce的数据。之前分区是按照reduce去模后的值进行分区的,分区以后的数据在copy到reduce所在的机器上,同事进行merge,便于下一步reduce进行处理。

分区就是在把数据拷贝到reduce的时候起作用的

为什么reduce task开始也有merge操作???
因为reduce会从很多的map输出结果中拷贝数据,这样会有很多个小文件,reduce为了计算,就需要对这些小文件进行merge。这就是为什么reduce开始时要进行merge操作。这个合并不是人为控制的,这个会根据key相同的进行合并,是hadoop自有的功能。合并完成以后相同key的数据会进行merge。

两个reduce是可以并发的。

抓重点:
这个过程比较虽然比较复杂,但是有很多部分是hadoop框架已经做的工作,只有一部分需要我们编程实现!!!

哪些部分需要我们编程实现???

1、partition(如何分区)
2、sort 比较(如何比较)
3、比较会进行多次
4、combiner

注意:在map执行之后,立刻进行partition,map的输出结果会分到哪个reduce,这个叫做分区,分区以后放在内存中,在溢写的时候,要执行sort和combiner,sort其实就是比较,默认按照ascii大小进行比较。 combiner可能会没有,所以上副图没有画combiner,这个意思是初次合并。 combiner可以减少map的输出数据。


MapReduce的Split大小

1、max.split(100M)
2、min.split(10M)
3、block(64M)
如何进行切分,切分大小算法
4、max(min.split,min(max.split,block))
代入如上值为: 64M