Hadoop中MapReduce深入理解和优化以及Yarn的介绍

什么是MapReduce

你想数出一摞牌中有多少张黑桃。直观方式是一张一张检查并且数出有多少张是黑桃。
MapReduce方法则是:
1.给在座的所有玩家中分配这摞牌
2.让每个玩家数自己手中的牌有几张是黑桃,然后把这个数目汇报给你
3.你把所有玩家告诉你的数字加起来,得到最后的结论

MapReduce概述

MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.
MapReduce是分布式运行的,由两个阶段组成:Map和Reduce,Map阶段是一个独立的程序,有很多个节点同时运行,每个节点处理一部分数据。Reduce阶段是一个独立的程序,有很多个节点同时运行,每个节点处理一部分数据【在这先把reduce理解为一个单独的聚合程序即可】。
MapReduce框架都有默认实现,用户只需要覆盖map()和reduce()两个函数,即可实现分布式计算,非常简单。
这两个函数的形参和返回值都是<key、value>,使用的时候一定要注意构造<k,v>。

MapReduce原理

shuffle过程

MR执行过程-shuffle过程

MR执行过程-map阶段

map任务处理
1.1 框架使用InputFormat类的子类把输入文件(夹)划分为很多InputSplit,默认,每个HDFS的block对应一个InputSplit。通过RecordReader类,把每个InputSplit解析成一个个<k1,v1>。默认,框架对每个InputSplit中的每一行,解析成一个<k1,v1>。
1.2 框架调用Mapper类中的map(...)函数,map函数的形参是<k1,v1>对,输出是<k2,v2>对。一个InputSplit对应一个map task。程序员可以覆盖map函数,实现自己的逻辑。
1.3
(假设reduce存在)框架对map输出的<k2,v2>进行分区。不同的分区中的<k2,v2>由不同的reduce task处理。默认只有1个分区。
 (假设reduce不存在)框架对map结果直接输出到HDFS中。
1.4 (假设reduce存在)框架对每个分区中的数据,按照k2进行排序、分组。分组指的是相同k2的v2分成一个组。注意:分组不会减少<k2,v2>数量。
1.5 (假设reduce存在,可选)在map节点,框架可以执行reduce归约。
1.6 (假设reduce存在)框架会对map task输出的<k2,v2>写入到linux 的磁盘文件中。
至此,整个map阶段结束

MR执行过程-reduce阶段

reduce任务处理
2.1 框架对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。这个过程称作shuffle。
2.2 框架对reduce端接收的[map任务输出的]相同分区的<k2,v2>数据进行合并、排序、分组。
2.3 框架调用Reducer类中的reduce方法,reduce方法的形参是<k2,{v2...}>,输出是<k3,v3>。一个<k2,{v2...}>调用一次reduce函数。程序员可以覆盖reduce函数,实现自己的逻辑。
2.4 框架把reduce的输出保存到HDFS中。
至此,整个reduce阶段结束。
例子:实现WordCountApp

shuffle过程

1.每个map有一个环形内存缓冲区,用于存储map的输出。默认大小100MB(io.sort.mb属性),一旦达到阀值0.8(io.sort.spill.percent),一个后台线程把内容溢写到(spilt)磁盘的指定目录(mapred.local.dir)下的一个新建文件中。
2.写磁盘前,要partition,sort。如果有combiner,combine排序后数据。
3.等最后记录写完,合并全部文件为一个分区且排序的文件。

1.Reducer通过Http方式得到输出文件的特定分区的数据。
2.排序阶段合并map输出。然后走Reduce阶段。
3.reduce执行完之后,写入到HDFS中。

MapReduce默认处理类

InputFormat

  抽象类,只是定义了两个方法。

FileInputFormat

  FileInputFormat是所有以文件作为数据源的InputFormat实现的基类,

  FileInputFormat保存作为job输入的所有文件,并实现了对输入文件计算splits的方法。至于获得记录的方法是有不同的子类——TextInputFormat进行实现的。

TextInputFormat

  是默认的处理类,处理普通文本文件

  文件中每一行作为一个记录,他将每一行在文件中的起始偏移量作为key,每一行的内容作为value

  默认以\n或回车键作为一行记录

RecordReader

每一个InputSplit都有一个RecordReader,作用是把InputSplit中的数据解析成Record,即<k1,v1>。

在TextInputFormat中的RecordReader是LineRecordReader,每一行解析成一个<k1,v1>。其中,k1表示偏移量,v1表示行文本内容

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分钟,否则效率低

MapReduce的优化

Map端

1、增大环形缓冲区的大小

2、增大环形缓冲区的溢写比例

3、减少对溢写文件的merge次数

4、采用combiner进行提前合并。减少IO传输

Reduce端

1、合理设置map和reduce的数量

2、让Map和reduce共存,就是map运行到一定程度reduce也开始运行

3、规避使用reduce

4、增加每个reduce去map中拿数据的并行数

5、集群性能可以的提前下,增大reduce端存储数据的内存大小

IO传输

1、数据压缩,减少网络IO的时间,,安装snappy和LAOP压缩编码器

压缩:

map输入端考虑数据量大小和切片,BZIP和LZO(支持切片但必须建索引)

map输出端考虑速度,使用snappy,LZO

reduce输出端作为下一个MR输入,需要考虑切片,使用压缩率较大的gzip

整体

增大NodeManager内存

控制分配给MapTask内存上限

控制分配reduceTask内存上限

控制MApTask对内存大小

控制ReduceTask堆内存大小

提高ReduceTask的CPU核数

增加每个Container容器的CPU核数核内存大小

介绍一下Yarn

Yarn他是一个资源调度平台,负责为运算程序提供服务器预算资源,相当于是一个分布式的操作系统平台,而比如像MapReduce,Spark,Flink等运算程序这些都可以算是操作系统上的应用程序。为什么他可以支持那么多呢,因为Yarn和用户程序是完全解耦,就是说我可以运行各种类型的运算程序,我只负责提供运算资源的调度,至于用户提交的程序的运行机制,我一概不知,简单点就是在Yarn上运行,只要符合我规范的资源请求机制就可以了。在Yarn里面有主节点ResourceManager,从节点NodeManager,ApplicationMaster

ResourceManager负责所有资源的监控,分配和管理

AppMaster负责每一个具体的应用程序的调度和协调

NodeManager负责每个节点的维护

Yarn的工作机制

例如 一个客户端的MR任务提交到集群中运行,会先向ResourceManager申请一个App,RM会将应用程序的资源路径返回给客户端,该程序会将运行所需要的的资源提交到HDFS上,资源提交完毕后,申请运行MRAppMaster,RM将用户的请求初始化一个task。其中一个NodeManager领取到task任务,创建container产生MRAppMaster,接着container从HDFS上拷贝资源到本地,MRAppmaster向RM申请运行maptask容器,RM将运行maptask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。MR向两个接受任务的NodeManager发送程序启动脚本。NodeManager分别启动maptask,maptask对数据分区排序。MRAppmaster向RM申请2个容器,运行reduce task,reduce task向maptask获取相应分区的数据,程序运行结束后,MR会向RM注销自己。

Yarn调度器

FIFO:支持单队列,先进先出,生产环境不会用

容量调度器:支持多队列,保证先进入的先执行

公平调度器:支持多队列,保证每个任务公平享有队列资源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值