MapReduce
MapReduce 综述
MapReduce是一种计算模型,该模型可以将大型数据处理任务分解成很多单个的、可以在服务器集群中并行执行的任务,而这些任务的计算结果可以合并在一起来计算最终的结果。简而言之,Hadoop Mapreduce是一个易于编程并且能在大型集群(上千节点)快速地并行得处理大量数据的软件框架,以可靠,容错的方式部署在商用机器上。
MapReduce这个术语来自两个基本的数据转换操作:map过程和reduce过程。
map:
map操作会将集合中的元素从一种形式转化成另一种形式,在这种情况下,输入的键值对会被转换成零到多个键值对输出。其中输入和输出的键必须完全不同,而输入和输出的值则可能完全不同。
reduce:
某个键的所有键值对都会被分发到同一个reduce操作中。确切的说,这个键和这个键所对应的所有值都会被传递给同一个Reducer。reduce
过程的目的是将值的集合转换成一个值(例如求和或者求平均),或者转换成另一个集合。这个Reducer最终会产生一个键值对。需要说明的是,如果job不需要reduce过程的话,那么reduce过程也是可以不用的。
task:
Hadoop提供了一套基础设计来处理大多数困难的工作以保证任务可以成功执行,比如Hadoop决定如果将提交的job分解为多个独立的map和reduce任务(task)来执行,它就会对这些task进行调度并为其分配合适的资源,决定将某个task分配到集群中哪个位置(如果可能,通常是这个task所要处理的数据所在的位置,这样可以最小化网络开销)。Hadoop会监控每一个task确保其成功完成,并重启一些失败的task。
MapReduce原理及执行过程
MapReduce 架构
在MapReduce中,用于执行MapReduce任务的机器角色有两个:JobTracker和TaskTracker。其中JobTracker是用于调度工作的,TaskTracker是用于执行工作的。一个Hadoop集群中只有一台JobTracker。
MapReduce架构
客户端向JobTracker提交一个作业,JobTracker把这个作业拆分成很多份,然后分配给TaskTracker去执行,TaskTracker会隔一段时间向JobTracker发送(Heartbeat)心跳信息,如果JobTracker在一段时间内没有收到TaskTracker的心跳信息,JobTracker会认为TaskTracker挂掉了,会把TaskTracker的作业任务分配给其他TaskTracker。
MapReduce执行过程
MapReduce执行过程
1、客户端启动一个job
2、向JobTracker请求一个JobID
3、将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息。这些文件都存放在JobTracker专门为该作业创建的文件夹中,文件夹名为该作业JobID。JAR文件默认会有10个副本,输入划分信息告诉JobTracker应该为这个作业启动多少个map任务等信息。
4、JobTracker接收到作业后将其放在作业队列中,等待JobTracker对其进行调度。当JobTracker根据自己的调度算法调度该作业时,会根据输入划分信息为每个划分创建一个map任务,并将map任务分配给TaskTracker执行。这里需要注意的是,map任务不是随便分配给某个TaskTracker的,Data-Local(数据本地化)将map任务分配给含有该map处理的数据库的TaskTracker上,同时将程序JAR包复制到该TaskTracker上运行,但是分配reducer任务时不考虑数据本地化。
5、TaskTracker每隔一段时间给JobTracker发送一个Heartbeat告诉JobTracker它仍然在运行,同时心跳还携带很多比如map任务完成的进度等信息。当JobTracker收到作业的最后一个任务完成信息时,便把作业设置成“成功”,JobClient再传达信息给用户。
MapReduce中的Map和Reduce
MapReduce 框架只操作键值对,MapReduce 将job的不同类型输入当做键值对来处理并且生成一组键值对作为输出。
举个例子,我们要数图书馆中的所有书。你数1号书架,我数2号书架。这就是“Map”。我们人越多,数书就更快。现在我们到一起,把所有人的统计数加在一起。这就是“Reduce”。简单来说,Map就是“分”而Reduce就是“合” 。
(input) ->map-> ->combine-> ->reduce-> (output)
map
MapReduce中的每个map任务可以细分4个阶段:record reader、mapper、combiner和partitioner。map任务的输出被称为中间键和中间值,会被发送到reducer做后续处理。
map
(1)读取HDFS中的文件。每一行解析成一个<k,v>。每一个键值对调用一次map函数。<0,helloyou> <10,hello me>
(2)覆盖map(),接收(1)中产生的<k,v>,进行处理,转换为新的<k,v>输出。<hello,1><you,1> <hello,1> <me,1>
(3)对(2)输出的<k,v>进行分区。默认分为一个区。
(4)对不同分区中的数据进行排序(按照k)、分组。分组指的是相同key的value放到一个集合中。排序后:<hello,1> <hello,1><me,1> <you,1> 分组后:<hello,{1,1}><me,{1}><you,{1}>
(5)(可选)对分组后的数据进行归约。
reduce
reduce任务可以分为4个阶段:混排(shuffle)、排序(sort)、reducer和输出格式(output format)
reduce
(1)多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点上。(shuffle)
(2)对多个map的输出进行合并、排序。覆盖reduce函数,接收的是分组后的数据,实现自己的业务逻辑, <hello,2><me,1> <you,1>处理后,产生新的<k,v>输出。
(3)对reduce输出的<k,v>写到HDFS中。
作者:TOMOCAT
链接:https://www.jianshu.com/p/1e542477b59a
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。