mr框架原理

MR框架原理

分片,map,分区,排序,分组,归约,合并,合并,排序,归约,合并,reduce算法

1、关于Reducer与输出文件安全

MRReducer默认值为一,当job.setNumReduceTasks(2)时,在Eclipse中运行只有一个输出文件。网络

将代码导出成JAR(代码中要添加job.setJarByClass(*.class); ),放入Linux中,执行hadoop jar *.jar,才会生成两个输出文件app

Eclipse中运行两分区两Reducer任务会报错?框架

 

2、FS的模式:函数

hadoop dfsadmin -safemode valueoop

参数value的说明以下:
enter -
进入安全模式
leave -
强制NameNode离开安全模式
get -
返回安全模式是否开启的信息
wait -
等待,一直到安全模式结束。spa

 

3、机制:JobJobTracker,TaskTracker,HDFS线程

cid:003d01d11c86$52d16830$_CDOSYS2.0

1.在客户端启动一个做业Job3d

2.JobTracker请求一个Job ID

3.将运行做业所须要的资源文件复制到HDFS上,包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息。这些文件都存放在JobTracker专门为该做业建立的文件夹中。文件夹名为该做业的Job IDJAR文件默认会有10个副本(mapred.submit.replication属性控制);输入划分信息告诉了JobTracker应该为这个做业启动多少个map任务等信息。

4.JobTracker接收到做业后,将其放在一个做业队列里,等待做业调度器对其进行调度,看成业调度器根据本身的调度算法调度到该做业时,会根据输入划分信息为每一个划分建立一个map任务,并将map任务分配给TaskTracker执行。对于mapreduce任务,TaskTracker根据主机核的数量和内存的大小有固定数量的map槽和reduce槽。这里须要强调的是:map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Local)。意思是:将map任务分配给含有该map处理的数据块的TaskTracker上,同时将程序JAR包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”。而分配reduce任务时并不考虑数据本地化。

5.TaskTracker每隔一段时间会给JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着不少的信息,好比当前map任务完成的进度等信息。当JobTracker收到做业的最后一个任务完成信息时,便把该做业设置成“成功”。当JobClient查询状态时,它将得知任务已完成,便显示一条消息给用户。

 

cid:003e01d11c86$52d16830$_CDOSYS2.0

 

 

 

 

cid:003f01d11c86$52d16830$_CDOSYS2.0

cid:004001d11c86$52d16830$_CDOSYS2.0

1、Mapper个数由文件块决定,Reducer个数能够设定。

2、Shuffle用来链接MapperReducer,包括Mapper阶段的Shuffle,即Mapper的写入,Reducer阶段的Shuffle,即Reduce的读入。前者为单个Mapper上的排序、归约、合并。后者为全部Mapper上的排序、归约、合并。

3、Mapper阶段将同一个key分配到同一个分区(分区是无序的?)Reducer阶段一个分区对应一个Reducer,reduce处理的数据是有序的

5、单个Reducer内的数据是有序的,但Reducer之间是无序的,默认是一个Reducer

6、一个Mapper任务能够调用屡次map函数,一个Reducer任务能够接受多个Mapper任务,屡次调用reduce函数

7、sort排序、combiner归约、merger合并

 

1. Mapper任务处理
1.1
读取输入文件内容,解析成keyvalue对。对输入文件的每一行,解析成keyvalue对。每个键值对调用一次map函数。
1.2 map
函数。
1.3
对输出的keyvalue进行分区。
1.4
对不一样分区的数据,按照key进行排序、分组。相同keyvalue放到一个集合中。
1.5 (
可选)分组后的数据进行归约(combine)


2.Reducer
任务处理
2.1
对一个或多个map任务的输出,按照不一样的分区,经过网络copy到不一样的Reducer节点。
2.2
在一个Reducer节点上未来自同一分区的数据进行合并、排序,再交给reduce函数

2.3 reduce的输出保存到文件中。

 

///////////////////////////////////////

Map阶段

分片(Split):map阶段的输入一般是HDFS上文件,在运行Mapper前,FileInputFormat会将输入文件分割成多个split ——1个split至少包含1个HDFS的Block(默认为64M);而后每个分片运行一个map进行处理。

 

执行(Map):对输入分片中的每一个键值对调用map()函数进行运算,而后输出一个结果键值对。

Partitioner:对map()的输出进行partition,即根据key或value及reduce的数量来决定当前的这对键值对最终应该交由哪一个reduce处理。默认是对key哈希后再以reduce task数量取模,默认的取模方式只是为了不数据倾斜。而后该key/value对以及partitionIdx的结果都会被写入环形缓冲区。

溢写(Spill):map输出写在内存中的环形缓冲区,默认当缓冲区满80%,启动溢写线程,将缓冲的数据写出到磁盘。

Sort:在溢写到磁盘以前,使用快排对缓冲区数据按照partitionIdx, key排序。(每一个partitionIdx表示一个分区,一个分区对应一个reduce)

Combiner:若是设置了Combiner,那么在Sort以后,还会对具备相同key的键值对进行合并,减小溢写到磁盘的数据量。

合并(Merge):溢写可能会生成多个文件,这时须要将多个文件合并成一个文件。合并的过程当中会不断地进行 sort & combine 操做,最后合并成了一个已分区且已排序的文件。

 

Shuffle阶段:广义上Shuffle阶段横跨Map端和Reduce端,在Map端包括Spill过程,在Reduce端包括copy和merge/sort过程。一般认为Shuffle阶段就是将map的输出做为reduce的输入的过程

Copy过程:Reduce端启动一些copy线程,经过HTTP方式将map端输出文件中属于本身的部分拉取到本地。Reduce会从多个map端拉取数据,而且每一个map的数据都是有序的。

Merge过程:Copy过来的数据会先放入内存缓冲区中,这里的缓冲区比较大;当缓冲区数据量达到必定阈值时,将数据溢写到磁盘(与map端相似,溢写过程会执行 sort & combine)。若是生成了多个溢写文件,它们会被merge成一个有序的最终文件。这个过程也会不停地执行 sort & combine 操做。

 

Reduce阶段:Shuffle阶段最终生成了一个有序的文件做为Reduce的输入,对于该文件中的每个键值对调用reduce()方法,并将结果写到HDFS。

相关文章
相关标签/搜索