分片,map,分区,排序,分组,归约,合并,合并,排序,归约,合并,reduce算法
1、关于Reducer与输出文件安全
MR中Reducer默认值为一,当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、机制:Job,JobTracker,TaskTracker,HDFS线程
1.在客户端启动一个做业Job。3d
2.向JobTracker请求一个Job ID。
3.将运行做业所须要的资源文件复制到HDFS上,包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息。这些文件都存放在JobTracker专门为该做业建立的文件夹中。文件夹名为该做业的Job ID。JAR文件默认会有10个副本(mapred.submit.replication属性控制);输入划分信息告诉了JobTracker应该为这个做业启动多少个map任务等信息。
4.JobTracker接收到做业后,将其放在一个做业队列里,等待做业调度器对其进行调度,看成业调度器根据本身的调度算法调度到该做业时,会根据输入划分信息为每一个划分建立一个map任务,并将map任务分配给TaskTracker执行。对于map和reduce任务,TaskTracker根据主机核的数量和内存的大小有固定数量的map槽和reduce槽。这里须要强调的是:map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Local)。意思是:将map任务分配给含有该map处理的数据块的TaskTracker上,同时将程序JAR包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”。而分配reduce任务时并不考虑数据本地化。
5.TaskTracker每隔一段时间会给JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着不少的信息,好比当前map任务完成的进度等信息。当JobTracker收到做业的最后一个任务完成信息时,便把该做业设置成“成功”。当JobClient查询状态时,它将得知任务已完成,便显示一条消息给用户。
1、Mapper个数由文件块决定,Reducer个数能够设定。
2、Shuffle用来链接Mapper和Reducer,包括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 读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每个键值对调用一次map函数。
1.2 map函数。
1.3 对输出的key、value进行分区。
1.4 对不一样分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
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。