Hadoop MapReduce框架详解

Hadoop MapReduce框架详解


1.我们要学习的就是这个计算模型的运行规则。在运行一个mapreduce计算任务时候,任务过程被分为两个阶段:map阶段和reduce阶段,每个阶段都是用键值对(key/value)作为输入(input)和输出(output)。而程序员要做的就是定义好这两个阶段的函数:map函数和reduce函数。
2.HDFS,即Hadoop Distributed File System,它是Hadoop的存储基础,是数据层面的,提供海量的数据存储;而MapReduce,则是一种引擎或者编程模型,可以理解为数据的上一层,我们可以通过编写MapReduce程序,对海量的数据进行计算处理。这就类似于我们通过 检索(MapReduce)所有文件(HDFS),找到我们想要的结果。
3.Mapreduce是一种编程模型,是一种编程方法,抽象理论。
4.mapreduce程序,我们的实现一个map函数和reduce函数。
5.Hadoop是一个开源的框架,可编写和运行分布式应用处理大规模数据,是专为离线和大规模数据分析而设计的,
6.分布式计算, 分布式计算的核心就在于 利用分布式算法 把运行在单台机器上的程序扩展到多台机器上并行运行.从而使数据处理能力成倍增加.但是这种分布式计算一般对编程人员要求很高,而且对服务器也有要求.导致了成本变得非常高.
7.Haddop 就是为了解决这个问题诞生的.Haddop 可以很轻易的把 很多linux的廉价pc 组成 分布式结点,然后编程人员也不需要知道分布式算法之类,只需要根据mapreduce的规则定义好接口方法,剩下的就交给Haddop. 它会自动把相关的计算分布到各个结点上去,然后得出结果.
8.例如上述的例子 : Hadoop 要做的事 首先把 1PB的数据文件导入到 HDFS中, 然后编程人员定义好 map和reduce, 也就是把文件的行定义为key,每行的内容定义为value , 然后进行正则匹配,匹配成功则把结果 通过reduce聚合起来返回.Hadoop 就会把这个程序分布到N 个结点去并行的操作.那么原本可能需要计算好几天,在有了足够多的结点之后就可以把时间缩小到几小时之内.


核心组成部分:
1.客户端,就是编写mapreduce程序,配置作业,提交作业
2.JobTracker(Hadoop服务器上的一个管理),分配jobID,进行输入数据的分片,初始化job,分配作业,与TaskTracker通信,协调整个作业的执行;任务个数的确定和任务状态的管理等。
3.TaskTracker,一直和JobTracker保持心跳和通信,在分配的数据片段上执行Map、Reduce任务。TaskTracker是一个运行Map、Reduce任务的容器并与JobTracker保持通信和上报状态。
4.map任务,不断读取输入数据,并调用map接口的任务,是TaskTracker运行的一个任务。
5.Reduce任务,不断读取输入数据,并调用reduce接口的任务,是TaskTracker运行的一个任务。
6.JobTracker相当于一个job管理服务器,TaskTracker相当于一堆的可以运行的任务的服务器(具有JVM运行环境),map、Reduce任务相当于运行在TaskTracker上的进程或线程。
7.JobTracker会跟据job的情况和TaskTracker的运行情况向TaskTracker分配map、Reduce任务,TaskTracker运行完成后返回运行状态给JobTracker。
8.JobTracker接收到一个Job最后一个任务成功完成返回后,就返回这个Job的完成状态给客户端。


启动过程:
1.客户端要编写好mapreduce程序,配置好mapreduce的作业也就是job,接下来就是提交job了,提交job是提交到JobTracker上,
2.时候JobTracker就会构建这个job,具体就是分配一个新的job任务的ID值,接下来它会做检查操作,
(1)确定输出目录是否存在,如果存在那么job就不能正常运行下去,JobTracker会抛出错误给客户端,
(2)接下来还要检查输入目录是否存在,如果不存在同样抛出错误,如果存在JobTracker会根据输入计算输入分片(Input Split),如果分片计算不出来也会抛出错误,
3.这些都做好了JobTracker就会配置Job需要的资源了。分配好资源后,JobTracker就会初始化作业,初始化主要做的是将Job放入一个内部的队列,让配置好的作业调度器能调度到这个作业,然后进行调度,默认的调度方法是FIFO调试方式。
4.作业调度器会初始化这个job,初始化就是创建一个正在运行的job对象(封装任务和记录信息),以便JobTracker跟踪job的状态和进程。
5.初始化完毕后,作业调度器会获取输入分片信息(input split),每个分片创建一个map任务。
6.接下来就是任务分配了,这个时候tasktracker会运行一个简单的循环机制定期发送心跳给jobtracker,心跳间隔是5秒,程序员可以配置这个时间,心跳就是jobtracker和tasktracker沟通的桥梁,通过心跳,jobtracker可以监控tasktracker是否存活,也可以获取tasktracker处理的状态和问题,同时tasktracker也可以通过心跳里的返回值获取jobtracker给它的操作指令。
7.任务分配好后就是执行任务了。在任务执行时候jobtracker可以通过心跳机制监控tasktracker的状态和进度,同时也能计算出整个job的状态和进度,而tasktracker也可以本地监控自己的状态和进度。
8.当jobtracker获得了最后一个完成指定任务的tasktracker操作成功的通知时候,jobtracker会把整个job状态置为成功,然后当客户端查询job运行状态时候(注意:这个是异步操作),客户端会查到job完成的通知的。


mapreduce工作过程
HDFS(文件)-->输入分片(input split)-->map任务-->map接口-->环形内存缓冲区-->Combiner(可选,进行输出相同的合并)-->排序-->HDFS(进行hash分区,输出map任务数量个溢出文件)-->合并这些溢出文件-->按reduce个数进行分区输出到新的文件(HDFS)-->reduce任务-->reduce接口-->结果调用输出API输出到结果的文件中(存储在hdfs上的)


mapreduce运行机制,这些按照时间顺序包括:输入分片(input split)、map阶段、combiner阶段、shuffle阶段和reduce阶段。
1. 输入分片(input split):
(1)在进行map计算之前,mapreduce会根据输入文件计算输入分片(input split),每个输入分片(input split)针对一个map任务,输入分片(input split)存储的并非数据本身,而是一个分片长度和一个记录数据的位置的数组,输入分片(input split)往往和hdfs的block(块)关系很密切,假如我们设定hdfs的块的大小是64mb,将按分区大小进行分片。
(2)就是对输入的文件(文件集)按分区大小进行分割成多个分区,有多少个分区就会启多个少个map任务
(3)map任务按行对数据进行分割生成<key,value>对(其中偏移量(即key值),value为这一行的内容),并调用用户定义的map方法进行处理,生成新的<key,value>对。

2. map阶段:
就是程序员编写好的map函数了,所做的操作就是读出map任务传出来的(Text value),并跟据(Text value)生成你用于统计用的<key,value>对,之后调用输出接口输出新的<key,value>对

3. combiner阶段:
(1)combiner阶段是程序员可以选择的,combiner其实也是一种reduce操作,主要是在map计算出中间文件前(map任务输出)做一个简单的合并重复key值的操作。
(2)combiner在进行排序(按key排序)前完成,变成<key,value,value,...>对,排序是在输出文件前完成的。

4. shuffle阶段:
(1).将map的输出作为reduce的输入的过程就是shuffle了,这个是mapreduce优化的重点地方。
(2).一般mapreduce计算的都是海量数据,map输出时候不可能把所有文件都放到内存操作,因此map写入磁盘的过程十分的复杂,更何况map输出时候要对结果进行排序,内存开销是很大的,map在做输出时候会在内存里开启一个环形内存缓冲区,这个缓冲区专门用来输出的,默认大小是100mb,并且在配置文件里为这个缓冲区设定了一个阀值,默认是0.80,同时map还会为输出操作启动一个守护线程,如果缓冲区的内存达到了阀值的80%时候,这个守护线程就会把内容写到磁盘上,这个过程叫spill,另外的20%内存可以继续写入要写进磁盘的数据,写入磁盘和写入内存操作是互不干扰的,如果缓存区被撑满了,那么map就会阻塞写入内存的操作,让写入磁盘操作完成后再继续执行写入内存操作,前面我讲到写入磁盘前会有个排序操作,这个是在写入磁盘操作时候进行,不是在写入内存时候进行的,如果我们定义了combiner函数,那么排序前还会执行combiner操作。
(3).这个阶段就是完成<key,value,value,...>对的工作和进行排序,最后输出到新的文件中(这些文件叫溢出文件(80M左右一个))。
(4).当map输出全部做完后,map会合并这些输出文件。这个过程里还会有一个Partitioner操作(分区),Partitioner操作会跟据reduce个数进行分区(按key使用hash进行分区),使每个reduce处理一个分区的数据。
(5)

5. reduce阶段:
和map函数一样也是程序员编写的,最终结果是存储在hdfs上的。



参考(Hadoop MapReduce框架详解): http://blog.jobbole.com/84089/
参考(MapReduce工作原理): http://www.cnblogs.com/ywl925/p/3981360.html
参考(WordCount运行详解): http://blog.csdn.net/net19880504/article/details/17303375
参考(通过inputSplit分片size控制map数目): http://www.cnblogs.com/yaohaitao/p/5610546.html
参考(MapReduce Input Split(输入分/切片)详解): http://blog.csdn.net/dr_guo/article/details/51150278
参考(MapReduce启动过程): http://www.aboutyun.com/thread-6723-1-1.html
参考(MapReduce启动过程): http://blog.csdn.net/chlaws/article/details/23709571

猜你喜欢

转载自huangyongxing310.iteye.com/blog/2341059