Hadoop学习笔记————MapReduce

简介

MapReduce是一种编程模型,并且是处理和生成大数据集的相关实现。用户指定一个map函数去处理key/value对,生成一个包含新的key/value对的集合(中间数据);reduce函数合并具有相同key值的中间数据。用户的程序按照这个模式编写,并且在一个集群上运行,这是利用分布式的一个典型的『并行』思想。用户无需关注输入文件的分割、任务在集群上的调度、集群内部的通信以及机器运行的失败,而把重点放在map和reduce程序的编写上。这使得那些即使没有分布式和并行处理经验的人,也可以很容易的使用分布式系统。

运行机制

按照运行一个MapReduce作业的顺序来看

输入

数据分片
Hadoop将输入文件分片(split)后,每一个Map任务处理一个分片,分片由FileInputFormat实现类的getSplits(job)方法完成,分片的步骤如下:
1.获取输入文件/目录
2.遍历文件
3.通过fs.sizeof(filename)获取文件大小
4.计算分片大小Math.max(minSize, Math.min(maxSize, blockSize)),默认情况下为BlockSize=128MB

5.获取文件的逻辑分片信息,并写入Master的分片规划文件中(这里得到的是逻辑上的分片,记录的是每个分片在文件中的起止位置)

为Mapper提供输入数据
读取给定的split的数据,解析成一个个的key/value对,供mapper使用。由createRecordReader(split, context)方法完成:
1.定位split:获取文件块的Reader对象,同步Reader对象的文件指针指向split的起始位置。为了能识别一条完整的记录,应该添加一些同步标示,TextInputFormat的标示是换行符;SequenceFileInputFormat的标示是每隔若干条key/value对会添加固定长度的同步字符串(syncMark)。为了解决InputSplit中第一条或者最后一条可能夸InputSplit的情况,RecordReader规定每个InputSplit的第一条不完整记录划给前一个InputSplit。

2.解析key/value:通过Reader.next(key,value)方法,将文件中的下一个键值对赋给变量key和value.

通过以上过程,就得到了Map函数的入参key/value.
在这里插入图片描述

Map

  • 由用户编写的程序,输入为key/value对,输出为key/value对的集合(0个-多个)

Shuffle(横跨map端和reduce端)

Map端

  • partition:对map输出的key/value对进行分区,确定该键值对应该交由哪个Reduce Worker处理,通过分区函数(例如hash(key)%R)划分成R(Reduce的个数)个区域
  • spill(溢写):Map函数输出的键值对以及对应的partition需要,但缓冲区的容量有限,当超过阈值(0.8,即缓冲区已使用容量>0.8*缓冲区容量)时会触发spill操作,将缓冲区的数据写入Local Disk,spill操作由单独的线程完成。
  • sort:spill操作会触发sort,会对缓冲区中即将被写入磁盘的数据按key进行排序,排序是mapreduce模型的默认行为,也是对序列化的字节做的排序。排序规则:字典排序。
  • combiner:如果client设置过Combiner,则combiner会将有相同key的key/value对的valueList通过combiner的方法处理,减少溢写到磁盘的数据量。(运行在单个Mapper节点上,合并的是单个Mapper的输出)
  • merge:溢写生成的临时文件的个数随着map输出结果的数据量变大而增多,当整个map task完成,内存中的数据也全部溢写到磁盘的一个溢写文件。也就是说,不论任何情况下,溢写过程生成的溢写文件至少有一个,但是最终的文件只能有一个,需要将这些溢写文件归并到一起,称为merge。merge是将所有的溢写文件归并到一个文件,结合上面所描述的combiner的作用范围,归并得到的文件内键值对有可能拥有相同的key,这个过程如果client设置过Combiner,也会合并相同的key值的键值对{“keyA”:5+8+2,…},如果没有,merge得到的就是键值集合,如{“keyA”: [5, 8, 2],…}
  • 本地磁盘上这些键值对(中间数据)的位置将被回传给Master,由Master通知Reduce Worker所需处理的文件位置

reduce端

  • Copy:Master通知Reduce Worker所需处理的文件位置,Reduce Worker通过RPC/HTTP?读取存于Map Workers本地磁盘上的文件到内存
  • Merge:当Reduce Worker读取完所有的数据到内存后,将数据按照key值排序,得到key:[value1,value2,…]这种形式的数据。merge有三种形式:1)内存到内存 2)内存到磁盘 3)磁盘到磁盘,当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map端类似,这也是溢写的过程,这个过程中如果你设置有Combiner,也会启用,然后在磁盘中生成众多的溢写文件。第二种merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的那个文件。

Reduce

  • 由用户编写的程序,输入为Shuffle过程的输出,用户的reduce程序迭代每一个key:[value1,value2,…]对,将处理的结果输出到HDFS指定目录下,一个reducer输出一个文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值