Hadoop之MapReduce原理

来源:互联网 发布:软件系统设计实例 编辑:程序博客网 时间:2024/05/23 16:06

Point 1:什么是MapReduce?
Hadoop MapReduce是一个计算框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的,具有容错能力的方式并行地处理上TB级别的海量数据集。这个定义里面有着这些关键词,一是软件框架,二是并行处理,三是可靠且容错,四是大规模集群,五是海量数据集。

Point 2:MapReduce 分布式计算框架的核心理念
分分合合,简单来说就是分布式计算:先将数据拆分,然后多台机器并行进行计算,最后聚合统一结果,还有一点是需要注意的就是移动计算,而不是移动数据,换句话说就是,数据在哪台机器上,就一直放在那里,然后可以改变处理逻辑

Point 3:
MapReduce的处理liucheng
1.数据的输入(数据存在磁盘—split不出意外的话对应一个block)–由HDFS将数据交给MapReduce开始处理
2.Map(函数—并行执行N个block)
3.shuffle阶段
4.Reduce(函数)
5.输出(落地—HDFS—副本的拷贝—磁盘)

简单的说,MapReduce的优点是稳定,缺点是慢,不适合迭代计算(有点麻烦)

Point 4:
MapReduce的六个阶段:
split-input-map-shuffle-reduce-output

Point 5:
shuffle的简介:
Map端的shuffle环形缓冲区(默认分配是100MB、0.8—当环形缓冲区达到80MB,开始落地磁盘—主要是防止溢出)—partition(分区,个数与reduce有关—对map输出的key求hash,然后再取模—比如0,1,2)—sort排序(字典key排序)—spill(溢写)—merge on disk—fetch(将数据送达到reduce端,需要经过网络—当然也可以不通过网络,除非两者在一起)——reduce端的shuffle—合并(merge,group,在合并过程中还会有排序)——传送给reduce

Point 6:
spill溢写是一个单独线程完成,不影响往缓冲区写map结果的线程

Point 7:
combiner的作用:
局部数据的累加、同时减少溢写的数据量(指的是网络传输),Reduce端加和的数据量减少——属于可选项
copy过来的数据,先放在内存缓冲区(比map端的更为灵活),基于JVM的heap size(堆内存)设置——然后再溢写和merge的时候会发生combiner,和reduce的逻辑是一样的—在Map端需要分组跟Reduce端分组

Point 8:
merge:内存到内存、内存到磁盘、磁盘到磁盘—必须进行排序

Point 9:
MapReduce的split的大小
max.split(100M) min.split(10M)
max(min.split,min(max.split,block))—公式

Point 10:
每个分区里面的数据并不相同,每次的merge都要进行排序—因为要分组,在Map端先进行一个预排序,这样后面的工作量就小了
Hash(key)%mod 相同的key取模得到的值是一样的,key决定了partition,取余相同就在一个分区,同时分区是在溢写之前就计算好了的
在整个shuffle的过程中,有两次merge,一次在map端,一次在reduce端
第一次merge合并的对象:partition相同的进行合并
第二次merge合并的对象:所有的maptask的partitio相同的进行合并,全部合并之后分组再传递给Reduce

Point 11:
buffer in memery 环形缓冲区
提交任务的整个流程(yarn)提交jar包,然后resourcemanager,然后nodemanager

ResourceManager——NodeManager——Container(资源的单位—进程)—–ApplicationMaster
然后
ApplicationMaster—ResourceManager—NodeManager—Container(执行MapTask和ReduceTask)

原创粉丝点击