您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > mapreduce运行全流程图解析
mapreduce运行全流程图解析MapReduce三大问题:一、读数据是怎么回事?二、shuffle的过程?三、结果数据存储是怎么回事?源码解析:FileInputFormat--createRecordReader控制切片,压缩格式不能切片。LongWritable关于偏移量的底层代码:解一:读数据是怎么回事?1.首先maptask驱动TextInputFormat,底层方法有craeteRecordReader,然后生成LineRecordReader,底层包含nextKeyvalue,getCurrentKey,getCurrentValue方法,主要是定义key,value的数据类型,keyin的值定义了按行读取的偏移量。2.解析:maptask拿到key和value后驱动自己定义的MyMapper类.MyMapper类继承了Mapper基类。读取文件数据的细节:maptask先经过切片,通过流式读取文件。以上为切片的规则,大小为128M,往下一个切片会多读一行,下一个切片会永远抛弃第一行,文件的起始片不能抛弃第一行,文件的最后一个切片不往下多读一行。context.write(k,v)输出数据后,由outputCollector收集,之后进入环形缓存区,区内分为80%的数据区和20%的保留区,多余的数据会溢出到溢出器,溢出器会保留在磁盘。在这个过程中数据会进行,分区及排序。数据分区排序后,会生成文件,并通过索引分区文件。索引是描述区的偏移量。很多的小文件,通过外部排序及归并算法,生成一个大文件。Reduce端:这里注意:在调用reduce()方法时,框架reducetask先从合并文件中读出一个key传给reduce方法,同时传出一个迭化器。Value迭化器的hasnext方法会判断文件的下一个key是否是已经传入的key。如果是,则next返回下一个value。否则,hasnext直接返回false,导致本次reduce方法调用结束。看起来的效果则是,reducetask会把数据按照key事先分好组,然后对每一组的数据调用一次reduce的方法。1.reducetask先从合并文件中读出一个key传给reduce方法,同时传一个迭代器。2.value的迭代器的hasnext()方法会判断文件的下一个key是否是已经传入的key,如果是,则next返回下一个value,否则,hadnext()直接返回false,导致本次reduce方法调用结束。3.看起来的效果是:reducetask会把数据按照key事先分好组,然后对每一组的数据调用一次reduce方法来做统计---------------------------------------------------通过context.write(),输出key,value,到外部存储系统.按行输入数据。这里会有人问到,有哪些是可干预的?1.数据读的方式:InputFormat(可设置文件,流,xml,只要能解析元数据)。配套的LineRecordReader也要改。2.分区。Partitioner。3.排序。key.compareTo()顺序,倒叙,重写,序列化。4.combiner组件进行局部汇总。5.TextOutputFormat,LineRecordWriter6.可以干预判断
本文标题:mapreduce运行全流程图解析
链接地址:https://www.777doc.com/doc-5582406 .html