mapreduce深入

mapreduce深入,第1张

mapreduce深入 mapreduce深入 课程目录

1.MapReduce概述及原理

2.InputFormat

3.OutputFormat

4.MapReduce切片解析

5.MapReduce的shuffle原理

6.MapReduce的序列化

7.MapReduce的伉化

一、MapReduce概述及原理 1.什么是MapReduce

➢你想数出一摞牌中有多少张黑桃。直观方式是一-张一张检查并且数出有多少张是黑桃。

➢MapReduce方法则是:

  1. 给在座的所有玩家中分配这摞牌
  2. 让每个玩家数自己手中的牌有几张是黑桃,然后把这个数目汇报给你
  3. 你把所有玩家告诉你的数字加起来,得到最后的结论
2.概述

➢MapReduce是一种分布式计算模型,由Google提出, 主要用于搜索领域,解决海量数据的计算问题.

➢MapReduce是分布式运行的,由两个阶段组成: Map和Reduce,Map阶段是一一个独立的程序,有很多个节点同时运行,每个节点处理一部分数据。Reduce阶段是一一个独立的程序,有很多个节点同时运行,每个节点处理一部分数据[在这先把reduce理解为一个单独的聚合程序即可]。

➢MapReduce框架都有默认实现,用户只需要覆盖map()和reduce()两个函数,即可实现分布式计算,非常简单。

➢这两个函数的形参和返回值都是,使用的时候一定要注意构造

3.mapreduce的工作原理

默认情况下split和block的大小都是128M,1.1

split是mapreduce切分的

block是hdfs切分的

可以把他们两个看成一样的东西。

k进入reduce阶段,如何确定进入到哪一个reduce,如何保证相同的k进入到同一个reduce?

对每一个k先做一个计算,k.hashCode()得到int类型的数据(通话,重地)

k.hashCode()%reduce节点个数= 具体的节点位置。

中间有个shuffle,下面着重说。
最后在汇总到hdfs中。
4.shuffle过程

a.hdfs自动切分,mapreduce切分获取数据,每一个切片对应一个map task

b. 生成map task

c. 内存环形缓冲区,默认大小100M,溢出比例达到阀值0.8溢写到磁盘,或者map task计算完毕。

d. 分区排序(自然排序)溢写到磁盘

f.在磁盘上面进行分区合并。

g. 发送。

h. 多个map tesk处理数据,可能有相同的数据分发到同一个reduce,这里的数据来源有可能在内存有可能在磁盘,首先做了一个数据合并。数据合并之后发送到reduce。

i. 同一个k进入同一个reduce。

j. 合并,发送到hdfs
5.MR执行过程-map阶段
➢map任务处理
➢1.1框架使用InputFormat类的子类把输入文件(夹)划分为很多InputSplit,默认,每个HDFS的block对应一个InputSplit。通过RecordReader类, 把每个InputSplit解析成一个个。 默认,框架对每个InputSplit中的每一行,解析成一个。

➢1.2框架调用Mapper类中的map..)函数,map函数的形参是对, 输出是对应一个
InputSplit对应一个map task。程序员可以覆盖map函数,实现自己的逻辑。

➢1.3
➢(假设reduce存在)框架对map输出的< k2,v2>进行分区。不同的分区中的< k2,v2>由不同的reduce task处理。默认只有1个分区。
➢(假设reduce不存在)框架对map结果直接输出到HDFS中。

➢1.4 (假设reduce存在)框架对每个分区中的数据,按照k2进行排序、分组。分组指的是相同k2的v2分成一一个组。注意:分组不会减少数量

➢1.5 (假设reduce存在,可选)在map节点,框架可以执行reduce归约。

➢1.6 (假设reduce存在)框架会对map task输出的写入到linux的磁盘文件中。
➢至此,整个map阶段结束
6.MR执行过程-reduce阶段
➢reduce任务处理
➢2.1框架对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。这个过程称作shuffle。

➢2.2 框架对reduce端接收的[map任务输出的]相同分区的数据进行合并、排序、分组。

➢2.3框架调用Reducer类中的reduce方法,reduce方 法的形参是,输出是。一个调用 一次reduce函数。程序员可以覆盖reduce函数,实现自己的逻辑。

➢2.4框架把reduce的输出保存到HDFS中。
➢至此,整个reduce阶段结束。
➢例子:实现WordCountApp
7.shuffle过程
●1.每个map有一个环形内存缓冲区,用于存储map的输出。默认大小100MB (io.sort.mb属性) ,一旦达到阀值0.8(io.sot.spill.percent) ,一 个后台线程把内容溢写到(spilt)磁盘的指定目录(mapred.local.dir) 下的一个新建文件中。

●2.写磁盘前,要partition,sort。 如果有combiner, combine排序后数据。

●3.等最后记录写完,合并全部文件为一个分区且排序的文件。

●1.Reducer通过Http方式得到输出文件的特定分区的数据。
●2.排序阶段合并map输出。然后走Reduce阶段。
●3.reduce执行完之后,写入到HDFS中。
8.MapReduce默认输入处理类
➢InputFormat
➢抽象类,只是定义了两个方法。
➢FilelnputFormat
➢FileInputFormat是所有以文件作为数据源的InputFormat实现的基类,
FileInputFormat保存作为job输入的所有文件,并实现了对输入文件计算splits的方法。至于获得记录的方法是有不同的子类一。
TextInputFormat进行实现的。
➢TextInputFormat
➢是默认的处理类,处理普通文本文件
➢文件中每一-行作为一一个记录,他将每一-行在文件中的起始偏移量作为key,每一行的内容作为value
➢默认以n或回车键作为一-行记录
9.RecordReader
➢每一个InputSplit都有一个RecordReader, 作用是把InputSplit中的数据解析成Record,即。

在TextInputFormat中的RecordReaderLineRecordReader。每一行解析成一个。其中,k1表示偏移量,v1表示行文本内容
10.InputSplit
在执行mapreduce之前,原始数据被分割成若干split,每个split作为一个map任务的输入。当Hadoop处理很多小文件(文件大小小于hdfs block大小)的时候,由于FileInputFormat不会对小文件进行划分,所以每一个小文件都会被当做一个split并分配一 个map任务, 会有大量的
map task运行,导致效率底下。

例如:一-个1G的文件,会被划分成8个128MB的split, 并分配8个map任务处理,而10000个100kb的文件会被10000个map任务处理Map任务的数量。

➢一个InputSplit对应一个Map task
➢InputSplit的大小是由Math.max(minSize, Math.min(maxSize,blockSize))决定
➢单节 点建议运行10- -100个map task
map task执行时长不建议低于1分钟,否则效率低
特殊: - -个输入文件大小为140M,会有几个map task?
➢FileInputFormat类中的getSplits

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5676928.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存