mr框架原理

MR框架原理

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

一、关于Reducer与输出文件

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

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

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

 

二、FS的模式:

hadoop dfsadmin -safemode value

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

 

三、机制:JobJobTracker,TaskTracker,HDFS

cid:003d01d11c86$52d16830$_CDOSYS2.0

1.在客户端启动一个作业Job

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

一、Mapper个数由文件块决定,Reducer个数可以设定。

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

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

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

六、一个Mapper任务可以调用多次map函数,一个Reducer任务可以接受多个Mapper任务,多次调用reduce函数

七、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。

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/stone-d/p/7265759.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值