2023年11月26日发(作者:)
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数,可增⼤,若减少map数,可增
⼤。
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为可选,可通过调
⽤()设置这⼀操作。
binerClass
reduce阶段
处理对,对每个key产⽣⼀个结果
output阶段
对输出数据通常会做压缩,节省磁盘空间
将reduce结果按照输出的格式写⼊⽂件中
1. 按照输出⽂件的格式,将每个键值对结果输出⼀⾏,中间分隔符默认是‘t’.默认调⽤键值对对象的toString()⽅法


发布评论