mapreduce细节

InputFormat主要用于描述输入数据的格式,提供功能:
1.数据切分:按某个策略将输入数据切分成若干个split,从而确定map task的个数以及对应的split,对应getSplits方法
2.为mapper提供输入数据:对于每个split,将其解析成一个个key/value对,对应getRecordReader方法,返回RecordReader对象,map task执行过程中会不断调用它的方法回去key/value对

InputFormat–>(DBInputFormat,FileInputFormat,EmptyInputFormat)
FileInputFormat基于文件–>(TextInputFormat(针对文本文件格式),针对二进制文件的SequenceFileInputFormat)

对于FileInputFormat的getSplits方法,涉及到文件切分算法和host选择算法,文件切分不说了 max(min())那个
InputSplit方案确定后,要确定每个InputSplit的元数据信息,包括
(file,start,length,hosts)表示所在的文件,起始位置,长度以及所在的host列表,
host列表涉及到运行过程中的任务本地性。
host选择策略是,先按照机架包含的数据量排序,然后按机架下node包含的数据量排序,最后取前N个node作为host列表,N为block的副本数

对应OutputFormat描述输出数据的格式
FileOutputFormat主要实现
1.checkOutputSpecs接口
作业运行之前被调用,默认功能是检查输出目录是否存在,防止之前的数据被覆盖
2.处理side-effect file
当某个任务特别慢时,hadoop会另起一个任务同时执行,为了防止这俩任务同时往一个输出文件中写入数据,会为每个map task数据创建一个side-effect file,将产生的数据写入该文件,待
任务完成后再移动到最终输出目录,涉及到这个文件的创建、删除、移动等操作由FileOutputFormat实现

reduce task需要拷贝各个map task端的数据,按照key进行分组后才能交给reduce()函数处理,为此hadoop实现了基于排序的分组算法。但考虑到若完全由reduce task进行全局排序会产生性能瓶颈,
hadoop采用了分布式排序策略,先由各个map task对输出数据进行一次局部排序,然后由reduce task进行一次全局排序。 (感觉类似归并排序)

map task的具体阶段
1Read阶段:map task通过RecordReader,从输入的InputSplit中解析出key/value对
2.Map阶段:将解析出的key/value交给用户编写的map()函数处理,产生新的key/value对
3.Collect阶段:map()函数中,数据处理完成后,会调用OutputCollector.collect()输出结果,将生成的key/value分片(调用Partitioner),写入环形内存缓冲区中。
4.Spill阶段:环形缓冲区写满之后,mapreduce会将数据写到本地磁盘上生成一个临时文件,写之前会对数据进行一次本地排序,必要时会对数据进行合并、压缩。
5.Combine阶段:所有数据处理完之后,对临时文件进行合并,确保最终只生成一个数据文件。

reduce task的具体阶段
1.Shuffle阶段:也成为Copy阶段,Reduce task从map task上远程拷贝一片数据,如果其大小超过一定阈值,则写到磁盘,否则放入内存。
2.Merge阶段:远程拷贝数据的同时,Reduce task启动了两个后台线程对内存和磁盘上的文件进行合并,防止内存使用过多或磁盘上的文件过多。
3.Sort阶段:按照mapreduce语义,用户编写的reduce()函数输入数据是按照key进行聚集的一组数据。为了将key相同的数据聚集在一起,hadoop采用了基于排序的策略。由于各个map task已经实现对自己的处理结果进行了局部排序,因此,reduce task只需对所有数据进行一次归并排序即可。
4.reduce阶段:实际调用reduce()函数。
5.write阶段:将计算结果写到hdfs上。

Shuffle和Merge是并行进行的,当远程拷贝数据量达到一定阈值后会触发合并线程对数据进行合并,细分为三个子阶段:
1).GetMapEventsThread线程周期性的询问已获取已完成map task的列表。
2).Reduce task启动多个线程(默认5个)从map task拷贝数据,大小超过阈值写磁盘否则写内存。reduce task大部分内存用于缓存从map task端拷贝的数据,这些内存占到jvm内存的(默认0.7)倍。这些内存由
ShuffleRamManager管理。
当数据分片大小未超过该部分内存的0.25倍时,可放到内存中。需向ShuffleRamManager请求,同意后才能拷贝,否则等待。
3).防止内存或磁盘的文件过多,分别对文件进行合并。
磁盘的合并逻辑是文件数目超过(2*ioSortFactor-1)后,ioSortFactor默认是10,会取出最小的ioSortFactor个文件进行合并,并将合并后的文件再次写到磁盘上.
内存中的文件满足条件之一则会触发合并并写入磁盘。
1.所有数据拷贝完毕 2.已使用内存超过可用内存的(默认66%)且内存文件数目超过2个 3.内存中文件数目超过(默认1000个) 4.阻塞在ShuffleRamManager上的请求数目超过
拷贝线程数目的75%(默认)

Sort和Reduce也是并行进行的。

对一个作业来说,当5%(默认)的map task运行完成之后,reduce task就开始被调度了,当map task执行完之前,启动起来的reduce task将始终处于Shuffle阶段,待map task运行完成之后,reduce task才可能将全部结果拷贝过来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值