mapreduce运行的5个阶段

mapreduce在运行的过程中大致概括为5个步骤
1. [input阶段]获取输入数据进行分片作为map的输入
2. [map阶段]过程对某种输入格式的一条记录解析成一条或多条记录
3. [shffle阶段]对中间数据的控制,作为reduce的输入
4. [reduce阶段]对相同key的数据进行合并
5. [output阶段]按照格式输出到指定目录

 

 

 

1、input阶段

input阶段主要是从节点上反序列化数据,读取后切片,供map阶段使用
序列化格式和inputformat格式可以自定义设置
只有支持分片的压缩格式可以分片
记录格式:如serse 用正则表达式来转换文本hive

 具体的步骤顺序如下:
1. 访问datanode中的数据反序列化数据并进行切片,为每一个切片分配一个map任务
2. 并发的执行这些任务
3. 通过recordReader读取切片中的每一条记录,按照记录格式读取,偏移值作为map的key,记录行作为value,当做map方法的参数

 

此阶段,每个输入文件被分片输入到map。如一个文件有200M,默认会被分成2片,因为每片的默认最大值和每块的默认值128M相同。

如果输入为大量的小文件,则会造成过多的map数,导致效率下降,可采用压缩输入格式CombineFileInputFormat

map阶段

通过对输入记录的处理,转换成一个或多个中间记录

 

此阶段,执行map任务。map数由分片决定,若要增加map数,可增大mapred.map.tasks,若减少map数,可增大mapred.min.split.size

shuffle阶段

需要注意:
1. shuffle阶段会对中间值进行优化,并且将分区的数据分发给各个reduce处理

  1. map任务的输出默认是放在本地磁盘的临时缓冲目录中的

  2. 分区,排序,combiner过程可自定义

  3. 由于受限于集群可用带宽,通常会对中间数据做压缩,combiner处理,减少网络带宽消耗

  4. 分区的作用就是决定根据map 输出的key值由哪个reduce处理

  5. mapper实现类读取配置文件属性,可以在配置中指定压缩的格式

  6. 每一个分组的后台线程对输出结果的key进行排序,在排序的过程中,有combine函数则会进行调用

  1. map数据会先输出到内存缓冲区中,到达默认的80%的阀值后,会像map任务本地写数据,每次写都会生成一个小文件。
  2. 在写到本地的过程中,会经历分区,排序,combiner(可选)的过程
  3. 当最后一个文件溢写到本地磁盘中的时候,区与区的文件就是合并,排序,压缩(可选)
  4. 经过分区的排序的大文件会按照不同的分区被拷贝到相应的reduce中处理
  5. reduce端通过http network复制map端传来的数据
  6. 将输入的数据排序后合并,经过2次排序后会返回一个value的迭代器
  7. 分组将相同key的value放到一起作为一个value集合,作为reduce的输入

 

此阶段,将map的输出经过“整理”后给到reduce,也称为“混洗”。分为map端操作和reduce端操作。

在map端,map的输出先写入缓存,当每次缓存快满时,由缓存“溢写”至磁盘,每次溢写都先进行“分区”,并对每个分区的数据进行“排序”和“合并”(可选)。一般会产生多个溢写的文件,这些文件会在map端先被“归并”为一个大的磁盘文件,通知reduce任务来领取自己的分区。

在reduce端,每个reduce任务会从多个map任务领取文件,然后将这些文件进行“归并”,交给reduce任务。

合并(combine)和归并(merge)的区别:对于两个键值对<“a”,1>和<“a”,1>,如果合并,会得到<“a”,2>,即复用reduce的逻辑(也可以自己实现combiner类);如果归并,会得到<“a”,<1,1>>。combine为可选,可通过调用job.setCombinerClass(MyReduce.class)设置这一操作。

reduce阶段

处理<key,list<value>>对,对每个key产生一个结果

output阶段

对输出数据通常会做压缩,节省磁盘空间

将reduce结果按照输出的格式写入文件中

    1. 按照输出文件的格式,将每个键值对结果输出一行,中间分隔符默认是‘\t’.默认调用键值对对象的toString()方法
posted @ 2021-01-04 10:44  幻雪追梦  阅读(3554)  评论(0编辑  收藏  举报