大数据之六 hadoop MapReduce原理

MapReduce简介

MapReduce是hadoop四大组件之一(HDFS,MapReduce,YARN和Comment),是一种分布式计算编程模型,用于解决海量数据的计算问题。

MapReduce思想原理

MapReduce采用分而治之的思想,将大文件切割成片,然后由多个map task并行处理,处理完成后交由reduce再做合并,最后输出结果

MapReduce执行过程

这里我们以经典例子WordCount(词频分析)来进行说明

切割

首先将大文件切割成片(片的大小默认与block等同,由于中文使用utf8存储占3个字节,所以切割时具体大小可能会有所波动),这里我们假设切割成了两个split切片,开启两个map task和两个reduce task。

map

那么接下来,一个map task负责处理一个切片,首先从split切片中读取数据,设定按行读取,读出来为一个<K1,V1>对,这里的K1默认为偏移量,如下图,读出的数据即为<0,“hello world”> <13,“hello hadoop”>,注意每行有个换行符。

读出来的数据将进入map进行处理,在map处理中,数据会依照需求转换为新的<k2,v2>对,这里因为我们要做词频统计,所以将v1分割成单个单词,新的k2使用单词本身,而value定为1,表示其出现了一次,如下图,新的<k2,v2>即为<hello,1> <world,1><hello,1> <hadoop,1>。
map
到这里map处理就完成了,接下来是shuffle write,将数据写入到本地磁盘(而不是HDFS,因为这只是中间数据,使用完后会直接删除)

shuffle write - 分区

在map处理完成之后,我们先将数据以<k2,v2>对的形式写到一个100M的buffer(一个环形内存缓冲器,阈值0.8)中,在写入之前会先对其进行分区处理,分区默认由HashPartitioner来执行(根据实际job我们可以自定义分区器),规则是k2的hash值与reduce task的个数取模,hash(k2)%reduce.num,这样这些数据就会被分为reduce.num个分区。此时数据由3部分组成:分区号,<k2,v2>

这里有2个reduce task,所以会有两个分区0分区和1分区,最后所有0分区的数据会送到同一个reduce task上进行处理,所有1分区的数据会送到另一个reduce task上处理。

shuffle write - 溢写

分区完成后写入buffer,随着数据不断写入,当写满80M时,这80M内存会被封锁,然后对其中数据进行排序,分组和combiner(小聚合)。

排序主要是按照分区号和key值进行。这里key值是字符串,所以按照ASII码排序,根据实际job需求我们可以自定义排序方式。排完序数据为<hadoop,1> <hello,1> <hello,1> <world,1>

分组指的是相同key的value放到一个集合中,分完组后数据为<hadoop,{1}> <hello,{1,1}> <world,{1}>

分组和排序都是为了提高后面reduce处理时的分组效率

combiner是可选的,默认不执行,因为并不是所有的job都适用combiner。combiner的作用是对map端的输出先做一次合并(迷你reduce),以减少在map和reduce节点之间的数据传输量,提高网络IO性能。combiner后的数据为<hadoop,1> <hello,2> <world,1>

以上步骤完成后将数据溢写到磁盘,完成期间数据写入剩余的20M中,防止阻塞。

shuffle write - 归并

从buffer溢写出来的文件皆是小文件,其内部已经按照分区号分好区且每个分区内数据有序,为了之后reduce方便处理,我们将所有小文件归并成一个大文件,归并时使用归并排序,确保大文件也是有序的
shuffle write

shuffle read

在reduce执行之前,是shuffle read阶段。

首先reduce task询问map任务是否已经完成,若完成,reduce task所在的节点去map端读取数据,即上面最终形成的大文件(这里可以看出map task和reduce task最好在同一节点上,这样可以将网络IO变成磁盘IO,效率更高)。因为上面的文件是分好区的,所以对应的reduce task只需读对应分区的数据即可,如reduce task0只读大文件中0号分区的数据。

将数据读取到内存中,同样内存达到阈值就会溢写,溢写前会做排序处理,这里按key值排序就可以了。溢写后形成一些小文件,当数据全部读取完成后,将小文件归并排序成一个大文件。
shuffle read - reduce

reduce

reduce的核心思想:将“相同”key值数据为一组调用一次reduce方法

reduce对大文件进行分组,可根据实际情况自定义分组条件,这里以相同key值的<k2,v2>为一组。因为前面所做的排序和分组,这里的分组就可以更快速简单的完成,然后按组读取文件,一组数据调用一次reduce方法,产生结果写入HDFS上的output文件中

至此,MapReduce内部的执行过程就结束了。下一篇我们来看一下MapReduce的架构实现

可上九天揽月,可下五洋捉鳖,谈笑凯歌还。世上无难事,只要肯登攀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值