mapreduce学习-设计思想和原理

MapReduce设计思想及原理
mapreduce:一是软件框架,二是并行处理,三是可靠且容错,四是大规模集群,五是海量数据集
参考
参考:https://www.cnblogs.com/riordon/p/4605022.html
设计思想:分而治之,
mapper 负责分,分,将任务分为多个简单任务,简单任务就是1、相对于原任务要大大缩小,2、就近原则,相比移动数据,移动计算成本要低,计算会在数据就近的节点计算,3、任务可以并行。
Reducer负责对map阶段的结果进行汇总,至于需要多少个Reducer,用户可以根据具体问题,通过在mapred-site.xml配置文件里设置参数mapred.reduce.tasks的值,缺省值为1

mapreduce工作流程:
1、打包程序,运行,
2、向jobtracker获取一个job id
3、JobClient得到Job ID后,将运行Job所需要的资源拷贝到共享文件系统HDFS中
4、资源准备完备后,JobClient向JobTracker提交Job。
5、jobtracker初始化job
6、初始化完成后,JobTracker从HDFS中获取输入splits(作业可以该启动多少Mapper任务)。
7、与此同时,TaskTracker不断地向JobTracker汇报心跳信息,并且返回要执行的任务
8、TaskTracker得到JobTracker分配(尽量满足数据本地化)的任务后,向HDFS获取Job资源(若数据是本地的,不需拷贝数据)。
9、获取资源后,TaskTracker会开启JVM子进程运行任务。
在这里插入图片描述

mapreduce框架组成:jobtracker、tasktracker
JobTracker负责调度构成一个作业的所有任务,这些任务分布在不同的TaskTracker上(由上图的JobTracker可以看到2 assign map 和 3 assign reduce)。你可以将其理解为公司的项目经理,项目经理接受项目需求,并划分具体的任务给下面的开发工程师。
TaskTracker负责执行由JobTracker指派的任务,这里我们就可以将其理解为开发工程师,完成项目经理安排的开发任务即可。

mapreduce的原理:
map task
程序会根据InputFormat将输入文件分割成splits,每个split会作为一个map task的输入,每个map task会有一个内存缓冲区,
输入数据经过map阶段处理后的中间结果会写入内存缓冲区,并且决定数据写入到哪个partitioner,当写入的数据到达内存缓冲
区的的阀值(默认是0.8),会启动一个线程将内存中的数据溢写入磁盘,同时不影响map中间结果继续写入缓冲区。在溢写过程中,
MapReduce框架会对key进行排序,如果中间结果比较大,会形成多个溢写文件,最后的缓冲区数据也会全部溢写入磁盘形成一个溢写
文件(最少有一个溢写文件),如果是多个溢写文件,则最后合并所有的溢写文件为一个文件。
reduce task
当所有的map task完成后,每个map task会形成一个最终文件,并且该文件按区划分。reduce任务启动之前,一个map task完成后,
就会启动线程来拉取map结果数据到相应的reduce task,不断地合并数据,为reduce的数据输入做准备,当所有的map tesk完成后,
数据也拉取合并完毕后,reduce task 启动,最终将输出输出结果存入HDFS上。

猜你喜欢

转载自blog.csdn.net/qq_22994783/article/details/84303896
今日推荐