副问题[/!--empirenews.page--]
MapReduce是一种编程模子,用于大局限数据集(大于1TB)的并行运算。MapReduce回收”分而治之”的头脑,把对大局限数据集的操纵,分发给一个主节点打点下的各个分节点配合完成,然后通过整合各个节点的中间功效,获得最终功效。简朴地说,MapReduce就是”使命的解析与功效的汇总”。
MapReduce架构
先来看一下MapReduce1.0的架构图
上图中的TaskTracker对应HDFS中的DataNode,
在MapReduce1.x中,用于执行MapReduce使命的呆板脚色有两个:一个是JobTracker;另一个是TaskTracker,JobTracker是用于调治事变的,TaskTracker是用于执行事变的。一个Hadoop集群中只有一台JobTracker。
流程说明
- 在客户端启动使命,客户端向JobTracker哀求一个Job ID。
- 将运利用命所必要的措施文件复制到HDFS上,包罗MapReduce措施打包的JAR文件、设置文件和客户端计较所得的输入分别信息。这些文件都存放在JobTracker专门为该使命建设的文件夹中。文件夹名Job ID。
- JobTracker吸取到使命后,将其放在一个行列里,守候调治器对其举办调治,看成业调治器按照本身的调治算法调治到该使命时,会按照输入分别信息建设N个map使命,并将map使命分派给N个TaskTracker(DataNode)执行。
- map使命不是随任意便地分派给某个TaskTracker的,这里有个观念叫:数据当地化(Data-Local)。意思是:将map使命分派给含有该map处理赏罚的数据块的TaskTracker上,同时将措施JAR包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”。而分派reduce使命时并不思量数据当地化。
- TaskTracker每隔一段时刻会给JobTracker发送一个Heartbeat(心跳),汇报JobTracker它依然在运行,同时心跳中还携带着许多的信息,好比当前map使命完成的进度等信息。当JobTracker收到功课的最后一个使命完成信息时,便把该功课配置成“乐成”。当JobClient查询状态时,它将得知使命已完成,便表现一条动静给用户。
以上是在客户端、JobTracker、TaskTracker的条理来说明MapReduce的事变道理的,下面我们再过细一点,从map使命和reduce使命的条理来说明说明吧。
MapReduce运行流程
以wordcount为例,运行的具体流程图如下
1.split阶段
起首mapreduce会按照要运行的大文件来举办split,每个输入分片(input split)针对一个map使命,输入分片(input split)存储的并非数据自己,而是一个分片长度和一个记录数据位置的数组。输入分片(input split)每每和HDFS的block(块)相关很亲近,若是我们设定HDFS的块的巨细是64MB,我们运行的大文件是64x10M,mapreduce会分为10个map使命,每个map使命都存在于它所要计较的block(块)的DataNode上。
2.map阶段
map阶段就是措施员编写的map函数了,因此map函数服从相对好节制,并且一样平常map操纵都是当地化操纵也就是在数据存储节点长举办。本例的map函数如下:
- publicclassWCMapperextendsMapperLongWritable,Text,Text,IntWritable{@Override
- protectedvoidmap(LongWritablekey,Textvalue,Contextcontext)throwsIOException,InterruptedException{
- Stringstr=value.toString();
- String[]strs=StringUtils.split(str,'');for(Strings:strs){
- context.write(newText(s),newIntWritable(1));
- }
- }
- }
按照空格切分单词,计数为1,天生key为单词,value为呈现1次的map供后续计较。
3.shuffle阶段
shuffle阶段首要认真将map端天生的数据转达给reduce端,因此shuffle分为在map端的进程和在reduce端的执行进程。
先看map端:
- map起首举办数据功效数据属于哪个partition的判定,个中一个partition对应一个reduce,一样平常通过key.hash()%reduce个数来实现。
- 把map数据写入到Memory Buffer(内存缓冲区),达到80%阀值,开启溢写进磁盘进程,同时举办key排序,假若有combiner步调,则会对沟通的key做合并处理赏罚,最终多个溢写文件归并为一个文件。
reduce端:
reduce节点从各个map节点拉取存在磁盘上的数据放到Memory Buffer(内存缓冲区),同理将各个map的数据举办归并并存到磁盘,最终磁盘的数据缓和冲区剩下的20%归并传给reduce阶段。
4.reduce阶段
reduce对shuffle阶段传来的数据举办最后的清算归并
- publicclassWCReducerextendsReducerText,IntWritable,Text,IntWritable{@Override
- protectedvoidreduce(Textkey,IterableIntWritablevalues,Contextcontext)throwsIOException,InterruptedException{intsum=0;for(IntWritablei:values){
- sum+=i.get();
- }
- context.write(key,newIntWritable(sum));
- }
- }
MapReduce的优弱点
利益:
- 易于编程;
- 精采的扩展性;
- 高容错性;
4.得当PB级别以上的大数据的漫衍式离线批处理赏罚。
弱点:
- 难以及时计较(MapReduce处理赏罚的是存储在当地磁盘上的离线数据)
- 不能流式计较(MapReduce计划处理赏罚的数据源是静态的)
- 难以DAG计较MapReduce这些并行计较多半是基于非轮回的数据流模子,也就是说,一次计较进程中,差异计较节点之间保持高度并行,这样的数据流模子使得那些必要重复行使一个特定命据集的迭代算法无法高效地运行。
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|