MapReduce原理解析

题记

本文资料来源于拉钩大数据开发高薪训练营。

MapTask运行机制详解

mapTask.png

步骤流程详解:

  1. ⾸先,读取数据组件InputFormat(默认TextInputFormat)会通过getSplits⽅法对输⼊⽬录中⽂
    件进⾏逻辑切⽚规划得到splits,有多少个split就对应启动多少个MapTask。split与block的对应关
    系默认是⼀对⼀。
  2. 将输⼊⽂件切分为splits之后,由RecordReader对象(默认LineRecordReader)进⾏读取,以\n
    作为分隔符,读取⼀⾏数据,返回<key,value>。Key表示每⾏⾸字符偏移值,value表示这⼀⾏
    ⽂本内容。
  3. 读取split返回<key,value>,进⼊⽤户⾃⼰继承的Mapper类中,执⾏⽤户重写的map函数。
    RecordReader读取⼀⾏这⾥调⽤⼀次。
  4. map逻辑完之后,将map的每条结果通过context.write进⾏collect数据收集。在collect中,会先
    对其进⾏分区处理,默认使⽤HashPartitioner。

MapReduce提供Partitioner接⼝,它的作⽤就是根据key或value及reduce的数量来决定当前的这对
输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模。默认的
取模⽅式只是为了平均reduce的处理能⼒,如果⽤户⾃⼰对Partitioner有需求,可以订制并设置到
job上。

  1. 接下来,会将数据写⼊内存,内存中这⽚区域叫做环形缓冲区,缓冲区的作⽤是批量收集map结
    果,减少磁盘IO的影响。我们的key/value对以及Partition的结果都会被写⼊缓冲区。当然写⼊之
    前,key与value值都会被序列化成字节数组。
  • 环形缓冲区其实是⼀个数组,数组中存放着key、value的序列化数据和key、value的元数据信息,
    包括partition、key的起始位置、value的起始位置以及value的⻓度。环形结构是⼀个抽象概念。
  • 缓冲区是有⼤⼩限制,默认是100MB。当map task的输出结果很多时,就可能会撑爆内存,所以
    需要在⼀定条件下将缓冲区中的数据临时写⼊磁盘,然后重新利⽤这块缓冲区。这个从内存往磁盘
    写数据的过程被称为Spill,中⽂可译为溢写。这个溢写是由单ᇿ线程来完成,不影响往缓冲区写
    map结果的线程。溢写线程启动时不应该阻⽌map的结果输出,所以整个缓冲区有个溢写的⽐例
    spill.percent。这个⽐例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill
    percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执⾏溢写过程。Map
    task的输出结果还可以往剩下的20MB内存中写,互不影响。
  1. 当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默认的⾏为!
  • 如果job设置过Combiner,那么现在就是使⽤Combiner的时候了。将有相同key的key/value对的
    value加起来,减少溢写到磁盘的数据量。Combiner会优化MapReduce的中间结果,所以它在整
    个模型中会多次使⽤。
  • 那哪些场景才能使⽤Combiner呢?从这⾥分析,Combiner的输出是Reducer的输⼊,Combiner
    绝不能改变最终的计算结果。Combiner只应该⽤于那种Reduce的输⼊key/value与输出key/value
    类型完全⼀致,且不影响最终结果的场景。⽐如累加,最⼤值等。Combiner的使⽤⼀定得慎重,
    如果⽤好,它对job执⾏效率有帮助,反之会影响reduce的最终结果。
  1. 合并溢写⽂件:每次溢写会在磁盘上⽣成⼀个临时⽂件(写之前判断是否有combiner),如果
    map的输出结果真的很⼤,有多次这样的溢写发⽣,磁盘上相应的就会有多个临时⽂件存在。当
    整个数据处理结束之后开始对磁盘中的临时⽂件进⾏merge合并,因为最终的⽂件只有⼀个,写⼊
    磁盘,并且为这个⽂件提供了⼀个索引⽂件,以记录每个reduce对应数据的偏移量。
    ⾄此map整个阶段结束!!

MapTask并行度

  • MapTask的并行度和map的数据切片数量有关,一个切片对应一个MapTask;
  • 数据切片和分块Block不一样,数据切片是逻辑切分数据,而Block是磁盘上数据的物理切分。

ReduceTask工作机制

ReduceTask

Reduce⼤致分为copy、sort、reduce三个阶段,重点在前两个阶段。copy阶段包含⼀个
eventFetcher来获取已完成的map列表,由Fetcher线程去copy数据,在此过程中会启动两个merge线
程,分别为inMemoryMerger和onDiskMerger,分别将内存中的数据merge到磁盘和将磁盘中的数据
进⾏merge。待数据copy完成之后,copy阶段就完成了,开始进⾏sort阶段,sort阶段主要是执⾏
finalMerge操作,纯粹的sort阶段,完成之后就是reduce阶段,调⽤⽤户定义的reduce函数进⾏处理。

详细步骤

  • Copy阶段,简单地拉取数据。Reduce进程启动⼀些数据copy线程(Fetcher),通过HTTP⽅式请求
    maptask获取属于⾃⼰的⽂件。
  • Merge阶段。这⾥的merge如map端的merge动作,只是数组中存放的是不同map端copy来的数
    值。Copy过来的数据会先放⼊内存缓冲区中,这⾥的缓冲区⼤⼩要⽐map端的更为灵活。merge
    有三种形式:内存到内存;内存到磁盘;磁盘到磁盘。默认情况下第⼀种形式不启⽤。当内存中的
    数据量到达⼀定阈值,就启动内存到磁盘的merge。与map 端类似,这也是溢写的过程,这个过
    程中如果你设置有Combiner,也是会启⽤的,然后在磁盘中⽣成了众多的溢写⽂件。第⼆种
    merge⽅式⼀直在运⾏,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge
    ⽅式⽣成最终的⽂件。
  • 合并排序。把分散的数据合并成⼀个⼤的数据后,还会再对合并后的数据排序。
  • 对排序后的键值对调⽤reduce⽅法,键相等的键值对调⽤⼀次reduce⽅法,每次调⽤会产⽣零个
    或者多个键值对,最后把这些输出的键值对写⼊到HDFS⽂件中。

ReduceTask并行度

ReduceTask的并⾏度同样影响整个Job的执⾏并发度和执⾏效率,但与MapTask的并发数由切⽚数决定
不同,ReduceTask数量的决定是可以直接⼿动设置:

// 默认值是1,⼿动设置为4
job.setNumReduceTasks(4);

注意事项

  1. ReduceTask=0,表示没有Reduce阶段,输出⽂件数和MapTask数量保持⼀致;
  2. ReduceTask数量不设置默认就是⼀个,输出⽂件数量为1个;
  3. 如果数据分布不均匀,可能在Reduce阶段产⽣倾斜;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354