大数据hadoop之MapReduce数据处理过程

2023-05-16

流程图与过程详解

MapTask阶段
在这里插入图片描述

  1. 既然需要进行数据处理,自然需要我们提供数据,那么首先我们需要提供待处理的文件,可以是一个也可以是多个

  2. 在我们(客户端)提交(submit())数据前,客户端会获取数据的信息,根据参数配置,形成任务分配的规划,即计划切片数(默认一个切片大小128M,hadoop老版本是64M)
    注:虽然切片的大小是按照128M为一个分界线,但是如果有两个文件需要被切片,那么不论第二的文件多小,都独占一个切片,不需要跟在第一个文件最后一个切片的末尾,如图
    在这里插入图片描述

  3. 然后需要提交切片信息,包含job.split(切片)、wc.jar(本地模式无需提交,集群下需要)、job.xml(配置信息),这些信息

  4. 接着Yarn会调用RM(ResourceManager)会创建MrAppmaster(job资源的老大)、NodeManager。其中MrAppmaster会根据split(分片)决定启动MapTask的数量。

  5. 开始读取数据,调用InputFormat这个接口去读取,其中默认情况下是采用InputFormat下的TextInputFormat这个具体实现类进行的,特点是每次读取文本数据,是一行一行的去读,当然我们也可以重写TextInputFormat内部的RecordReader()方法,按整个文件去读,看你的需求。

  6. 根据RecordReader()方法,每次读取一行则产生一个<k,v>键值对,k是每行起始位置的偏移量,v是这一行的内容:(注意每行结尾的换行符也占一个偏移量)
    在这里插入图片描述

  7. 得到全部行的<k,v>后,将结果返回给Mapper,接下来进行业务逻辑的处理:把每行转化为string、进行切割、封装,再由context.write(k,v)进行写出

  8. context.write(k,v)写出的数据会先传给OutPutCollector(收集器),在由收集器写到环形缓冲区内(默认大小100M),环形缓冲区内部顺时针写数据,逆时针写对应的数据的索引,并且每次写到整个缓冲区的80%容量时,会进行一次溢写,即把内存里的数据写到磁盘上,之后反向写数据和索引(红色剪头所示),继续接受收集器传来的信息(注:环形缓冲区并不是物理上的环形,而是逻辑上的,它本身是一个队列,数据和索引接头处默认有个分界线)
    在这里插入图片描述

  9. 环形缓冲区索引中的partiton就是对应数据被划分的分区,每个分区在内部进行对数据排序,按照字典顺序的规则,排序方式采用快速排序(为什么不合并分区再排序,而是各个分区排序? 因为每个分区是由对应的Reduce进行下一步的处理,现在合并没有意义)由环形缓冲区写到磁盘上的这一过程,称之为序列化, 之后针对属于同一个MapTask下的相同分区的内部数据进行归并排序。
    在这里插入图片描述
    Reduce阶段

  10. 在所有的MapTask完成以后,由MrAppMaster启动相应数量的ReduceTask,并告知ReduceTask需要处理的数据范围:例如所有分区0的由ReduceTask1处理,分区1的由ReduceTask2处理

在这里插入图片描述
11. 属于同一个ReduceTask下的数据,会进行文件合并,进行归并排序
12. 合并后的数据会根据key值相同的进入到Reducer中,写入到context.write(k,v),最后通过outputformat(默认是TextOutPutFormat)的RecordWriter写出到一个part里:如下图,<a,1>、<a,1>会先进入Reducer,之后轮到<c,1>
在这里插入图片描述

Shuffle流程

定义
简洁的说就是map方法之后,reduce方法之前的数据处理的过程,又称为洗牌。shuffle包含了对数据的分区、排序、combiner、归并、压缩等过程
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数据hadoop之MapReduce数据处理过程 的相关文章

随机推荐