HaDoop之MapReduce流程

MapReduce简介及优点
  • MapReduce是一个分布式运算程序的编程框架,是Hadoop数据分析的核心
  • MapReduce的核心思想是将用户编写的逻辑代码和架构中的各个组件整合成一个分布式运算程序,实现一定程序的并行处理海量数据,提高效率
  • 海量数据难以在单机上处理,而一旦将单机版程序扩展到集群上进行分布式运行势必将大大增加程序的复杂程度,所以引入MapReduce架构,开发人员可以将精力集中于数据处理的核心业务逻辑上,而将分布式程序中的公共功能封装成框架,以降低开发的难度
  • 一个完整的MapReduce 程序有三类实例进程
    • MRAppMaster:负责整个程序的协调过程
    • MapTask:负责map阶段的数据处理
    • ReduceTask:负责reduce阶段的数据处理
MapReduce基本流程

第一步:InputFormat
第二步:Split
第三步:RecordReader
第四步:Map
第五步:Partition
第六步:Sort
第七步:Combiner
第八步:Group
第九步:Reduce
第十步:OutputFormat
HaDoop之MapReduce流程_第1张图片

MapReduce整体详细流程

1.Map阶段
1、数据读取、逻辑切片
   首先,读取数据的组件InputFormat(默认TextInputFormat)
   会通过getSplits方法对输入目录中的文件进行逻辑切片规划得到splits切片
   有多少个split就对应启动多少个MapTask,默认情况下split与block的对应关系默认是一对一
2、RecordReader处理输出
   	将输入文件切分为splits之后,由RecordReader对象(默认	LineRecordReader)进行读取
   以\n作为分隔符,读取一行数据,返回
   Key表示每行首字符偏移值,value表示这一行文本内容
 3、执行map方法
   读取split返回,进入用户自己继承的Mapper类中,执行用户重写的map函数
   RecordReader读取一行,用户重写的map调用一次,并输出一个
2.Shuffle阶段(Map输出之后,Reduce输出之前)
1.数据分区、写入内存
  此时outputCollectot,会收集Map写出的数据,将key/value以及Partition的结果将并放入内存中的环形缓冲区
   注意:
  a.在写到到环形缓冲区的过程中进行分区
  b.缓冲区的作用是批量收集map结果,减少磁盘IO的影响
  c.使用环形数据结构是为了更有效地使用内存空间,在内存中放置尽可能多的数据;
  d.环形缓冲区其实是一个字节数组,数组中存放着key、value的序列化数据和key、value的元数据信息,
  包括partition、key的起始位置、value的起始位置以及value的长度;环形结构是一个抽象概念
 + e.缓冲区是有大小限制,默认是100MB,可修改;当Map task的输出结果很多时,就可能会撑爆内存,
    所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区;
    这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写;这个溢写是由单独线程来完成,
    不影响往缓冲区写map结果的线程;溢写触发的比例默认是0.8,也就是当缓冲区的数据已经达到阈值时,
    溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响
2、溢写、排序、combine(局部合并)
   当环形缓冲区中的数据到达一定比例时,开启溢写( 从内存往磁盘写数据的过程被称为Spill,中文可译为溢写 ),
   锁定需要溢写的数据,将需要溢写的数据写到磁盘中的临时文件中,
   并在写入前根据key进行合并(combine,可选操作)和 排序(sort)
   注意:
   		a.分区(Partitioner)
			MapReduce提供Partitioner接口,它的作用就是根据key或value及reduce的数量
			来决定当前的这对输出数据最终应该交由哪个Reducetask处理;
			默认对key HashPartitioner 后再以Reducetask数量取模;默认的取模方式
			只是为了平均Reduce的处理能力,如果用户自己对Partitioner有需求,可自行设置;
	 	b.排序(key.compareTo):调用key的compareTo方法进行比较,默认是快排,字典排序
		c.Combiner:是Mapreduce的组件,作用:进行局部汇总;工作机制与Reduce完全一致。由用户是否使用	
		d.数据区会有三个数据来记录索引:顺序,大小,偏移量等
		e.当80%的数据区被写满之后,数据区会被锁定,此时outputcollector收集的数据会写入20%的保留区。
		  当数据区的数据溢写	完成后,锁定解除。
		f.此时的20%的保留区加上数据区的60%构成新的数据区,数据区剩余的20%为新的保留区
		g.保留区与数据区的比例是可以由用户决定的。
		h.每个文件都会有一个index索引文件(用于描述区的偏移量)
3.group(分组)、merge(整合)
    当整个数据处理结束之后,会对磁盘中所有的临时文件进行归并,生成一个大文件
	此时的归并是将所有临时文件中的相同分区的合并到一起,并对各个分区中的数据再进行一次排序(sort)
	需要注意的问题:
		a.一个Maptask最后会整合成一个大文件,大文件也会有索引
		b.merge的过程中combiner也会起作用
		c.reducetask会去每个Maptask上拉取对应分区的文件,拉取完毕后,会得到一堆小文件,对所有的小文件,
		进行merge,归并排序成一个大文件

HaDoop之MapReduce流程_第2张图片

3.Reduce阶段
1.拉取、分组、合并数据
  ReduceTask不断从MapTask拉取属于自己分区的数据读取到内存中的缓存区里,到达阈值后溢写到磁盘中,
  内存中的所有数据写入完成之后开始做merge归并,最后合并成一个分区相同的大文件,然后对这个
  文件中的键值对按照key进行sort排序,排好序之后根据分区规则进行分组,分组完成后一组一组的调用reduce方法
2.执行reduce方法

HaDoop之MapReduce流程_第3张图片

Shuffle阶段是在Map的输出到Reduce的输入

流程角度

HaDoop之MapReduce流程_第4张图片

内存角度

HaDoop之MapReduce流程_第5张图片

你可能感兴趣的:(大数据,hadoop,MapReduce)