大数据原理笔记——MapReduce

解决能够满足“分而治之”处理要求的场景。处理结果之间不能相互依赖。

map任务之间是不能通信的,reduce之间也不会发生信息交换。

处理过程:inputformat,负责数据的输入,验证数据格式及文件切分(split),通过RR(record-reader)过程,根据切片后文件的位置信息,从hdfs中将文件读取出来以K-V的形式传递给map,map后的中间结果经过shuffle,对中间结果进行归并,形成key-value list,传递给reduce,经过处理后形成k-v形式的处理结果,经过outputformat的验证等操作,存放到hdfs上。

split:split是逻辑概念,记录切分元信息,如数据起始位置、数据长度、数据所在节点等,切分方式也由用户决定。而block是物理存储单位,两者的切片结果并不保持一致,只是理想的状态是split的大小与block块大小 一致。split的数量决定了map任务的数量,map任务的数量过多(split过小)和过少(split过大)均不合适(管理资源占用、shuffle过程复杂等),需要根据实际情况进行调整,以达到最佳性能。reduce的任务数目取决于集群中的reduce任务槽(slot)的数目,通常设置reduce任务数比slot数目稍少一些。

shuffle:map过程在处理数据时,先将处理数据以k-v的形式存储在缓存中,当缓存区域饱和后,进行溢写操作,溢写过程中,会对数据进行分区、排序和合并操作,将缓存中的数据写到磁盘上;之后由reduce将各自需要的分区数据取走进行归并操作,再输入到reduce操作,进行数据处理,最后输出到hdfs。而数据归并的过程即是shuffle过程,它包含map和reduce两端的shuflle。

在map端的shuffle,经过四个步骤:输入数据到map任务、写入缓存、溢写(分区、排序、合并)、文件归并。每个map任务分配一个缓存,mr默认100m缓存。可以设置溢写比例,需要小于1,以确保在溢写过程中新进的数据能够进入缓存,避免数据丢失。溢写过程中,会默认按照哈希函数进行分区存储,而后按照key值进行排序操作(默认),排序后的数据可以进行合并(combine)操作,最后写入磁盘。多个溢写文件归并到大的文件(已经过分区和排序)。combine操作可以设计预定值,当溢件大于预定值时执行combine操作,否则不执行。jobtracker此时一直监控map任务的执行过程,当map过程全部完成后,通知reduce,执行后续操作。

reduce端shuffle,reduce通过RPC向jobtracker询问map任务状态,map完成后,reduce认领数据到缓存,多个数据先归并(merge)再合并(combine),写入磁盘。如果最终文件大于数据块,会生成多个归并文件,且文件中键值对是排序的,如果数据量很小,则不需要溢写到磁盘,直接在缓存中归并,并输出到reduce。

mapreduce执行过程:

1、程序部署,部署到master上,选择一部分worker执行map一部分执行reduce;

2、分配map任务和reduce任务;

3、mapper读数据;

4、将map结果写入缓存及本地磁盘(不是hdfs)

5、reducer远程读取数据,并执行reduce操作;

6、输出reduce结果

mapreduce可以用于关系代数运算(选择、并、交、差、连接等)、分组与聚合运算、矩阵-向量乘法和矩阵乘法。

猜你喜欢

转载自blog.csdn.net/junweishiwo/article/details/82783369