学习记录-MR

MapReduce 运行原理

Map Side

1.从磁盘读取数据并分片

默认一个block对应一个分片,对应一个map task

2.map task处理

map业务处理

3.输出数据到缓冲区

map 输出的数据并不是直接写入磁盘的,而是会预先存储在一个预定义的buffer中

4.分区、排序分组

对map的输出结果进行分区,按照key进行排序和分组

5.规约(combainer)

相当于本地端的reduce

6.合并写入磁盘

将最终的数据进行merge之后输出到磁盘中,等待shuffle

Reduce Side

1.从map端拉取数据
2.对数据进行合并(1,2两个步骤为shuffle过程)
3.对数据进行排序
4.进行reduce操作
5.输出到磁盘

最简单的调优方式

  • 设置Combiner

对map结果进行了一次reduce操作,减少了map的输出结果和reduce的远程拷贝数据量,使得Map task和 Reduce task的执行时间缩短

  • 选择合理的Writable类型

比如,要处理整型类型数据时,输出类型IntWritable就比Text高效(需要转换)
如果输出整数的大部分可以用一个或者两个字节保存,可直接采用VIntWritable,VLongWritable,采用变长整型的编码方式,减少数据输出量。

  • 作业级别调优
    • 增加输入文件副本数,减少数据网络传输时间。(酌情设置)
  • Map side tuning
    • InputFormat

    map的第一步,从磁盘读取数据并切片。当读取海量的小文件时,会启动大量的map task,效率非常慢,可以通过CombineInputFormat 自定义分片策略对小文件进行合并,从而减少map task的数量,减少map 时间,此外:

    1. mapred.min.split.size:Input Split的最小值 默认值1
    2. mapred.max.split.size:Input Split的最大值
    3. dfs.block.size:HDFS 中一个block大小,默认值128MB。

当mapred.min.split.size小于dfs.block.size的时候,一个block会被分为多个分片,也就是对应多个map task。

当mapred.min.split.size大于dfs.block.size的时候,一个分片可能对应多个block,也就是一个map task读取多个block数据。
集群的网络、IO等性能很好的时候,建议调高dfs.block.size。
根据数据源的特性,主要调整mapred.min.split.size来控制map task的数量

    • Buffer(map 输出结果)

设置Buffer话可以减少map任务的IO开销,从而提高性能。

首先将map结果输出到buffer,当缓存的使用量超过80%的时候,开始溢出到磁盘(splll),buffer默认100M,可以通过io.sort.mb设置。

但是如果将io.sort.mb调的非常大的时候,对机器的配置要求就非常高,因为占用内存过大,所以需要根据情况进行配置。

map并不是等buffer写满才spill,通过io.sort.spill.percent可以调整。这个会影响spill的频繁程度,进而影响map task

    • Merge(spill合并,防止出现大量小文件)

该阶段是map产生spill之后,对spill进行处理的过程,通过对其进行配置也可以达到优化IO开销的目的。

merge过程是并行处理spill的,每次并行多少个spill是由参数io.sort.factor指定的,默认为10个

如果产生的spill非常多,merge的时候每次只能处理10个spill,那么还是会造成频繁的IO处理

适当的调大每次并行处理的spill数有利于减少merge数因此可以影响map的性能

但是如果调整的数值过大,并行处理spill的进程过多会对机器造成很大压力

    • Combine(根据自定义函数合并结果)

我们知道如果map side设置了Combiner,那么会根据设定的函数对map输出的数据进行一次类reduce的预处理

但是和分组、排序分组不一样的是,combine发生的阶段可能是在merge之前,也可能是在merge之后

这个时机可以由一个参数控制:min.num.spill.for.combine,默认值为3 当job中设定了combiner,并且spill数最少有3个的时候,那么combiner函数就会在merge产生结果文件之前运行

例如,产生的spill非常多,虽然我们可以通过merge阶段的io.sort.factor进行优化配置,但是在此之前我们还可以通过先执行combine对结果进行处理之后再对数据进行merge 这样一来,到merge阶段的数据量将会进一步减少,IO开销也会被降到最低

    • 输出中间数据到磁盘

其实无论是spill的时候,还是最后merge产生的结果文件,都是可以压缩的,控制输出是否使用压缩的参数是mapred.compress.map.output,值为true或者false.启用压缩之后,会牺牲CPU的一些计算资源,但是可以节省IO开销,非常适合IO密集型的作业(如果是CPU密集型的作业不建议设置)
设置压缩的时候,我们可以选择不同的压缩算法 Hadoop默认提供了GzipCodec,LzoCodec,BZip2Codec,LzmaCodec等压缩格式
通常来说,想要达到比较平衡的cpu和磁盘压缩比,LzoCodec比较合适,但也要取决于job的具体情况
如果想要自行选择中间结果的压缩算法,可以设置配置参数:
mapred.map.output.compression.codec=org.apache.hadoop.io.compress.DefaultCodec
//或者其他用户自行选择的压缩方式

map side tuning 总结

==map端的性能瓶颈都是频繁的IO操作造成的==,所有的优化也都是针对IO进行的,而优化的瓶颈又很大程度上被机器的配置等外部因素所限制

选项类型默认值描述
mapred.min.split.sizeint1Input Split的最小值
mapred.max.split.sizeint.Input Split的最大值
io.sort.mbint100map缓冲区大小
io.sort.spill.percentfloat0.8缓冲区阈值
io.sort.factorint10并行处理spill的个数
min.num.spill.for.combineint3最少有多少个spill的时候combine在merge之前进行
mapred.compress.map.outputbooleanfalsemap中间数据是否采用压缩
mapred.map.output.compression.codecString.压缩算法

Reduce side tuning

Shuffle

1.Copy

每一个job都会将map输出结果根据reduce(n)分成n个partition。所以,为了节省时间,==在第一个map结束后,所有reduce就开始尝试从完成的map中下载该reduce对应的partition==

在这个shuffle过程中,由于map的数量通常是很多个的,而每个map中又都有可能包含每个reduce所需要的数据

所以对于每个reduce来说,去各个map中拿数据也是并行的,可以通过mapred.reduce.parallel.copies这个参数来调整,默认为5

当map数量很多的时候,就可以适当调大这个值,减少shuffle过程使用的时间 还有一种情况是:reduce从map中拿数据的时候,有可能因为中间结果丢失、网络等其他原因导致map任务失败

而reduce不会因为map失败就永无止境的等待下去,它会尝试去别的地方获得自己的数据(这段时间失败的map可能会被重跑) 所以设置reduce获取数据的超时时间可以避免一些因为网络不好导致无法获得数据的情况

mapred.reduce.copy.backoff,默认300s,一般情况下不用调整这个值,因为生产环境的网络都是很流畅的

2.Merge

由于reduce是并行将map结果下载到本地,所以也是需要进行merge的,所以io.sort.factor的配置选项同样会影响reduce进行merge时的行为

和map一样,reduce下载过来的数据也是存入一个buffer中而不是马上写入磁盘的,所以我们同样可以控制这个值来减少IO开销 控制该值的参数为: mapred.job.shuffle.input.buffer.percent,默认0.7,这是一个百分比,意思是reduce的可用内存中拿出70%作为buffer存放数据

reduce的可用内存通过mapred.child.Java.opts来设置,比如置为-Xmx1024m,该参数是同时设定map和reduce task的可用内存,一般为map buffer大小的两倍左右

设置了reduce端的buffer大小,我们同样可以通过一个参数来控制buffer中的数据达到一个阈值的时候开始往磁盘写数据:mapred.job.shuffle.merge.percent,默认为0.66

Sort

sort的过程一般非常短,因为是边copy边merge边sort的,后面就直接进入真正的reduce计算阶段了

Reduce

之前我们说过reduc端的buffer,默认情况下,数据达到一个阈值的时候,buffer中的数据就会写入磁盘,然后reduce会从磁盘中获得所有的数据

也就是说,buffer和reduce是没有直接关联的,中间多个一个写磁盘->读磁盘的过程,既然有这个弊端,那么就可以通过参数来配置使得buffer中的一部分数据可以直接输送到reduce,从而减少IO开销:==mapred.job.reduce.input.buffer.percent==,默认为0.0

当值大于0的时候,会保留指定比例的内存读buffer中的数据直接拿给reduce使用 这样一来,设置buffer需要内存,读取数据需要内存,reduce计算也要内存,所以要根据作业的运行情况进行调整

Reduce side tuning总结

和map阶段差不多,reduce节点的调优也是主要集中在加大内存使用量,减少IO,增大并行数

reduce调优主要参数:

选项类型默认值描述
mapred.reduce.parallel.copiesint5每个reduce去map中拿数据的并行数
mapred.reduce.copy.backoffint300获取map数据最大超时时间
mapred.job.shuffle.input.buffer.percentfloat0.7buffer大小占reduce可用内存的比例
mapred.child.java.optsString.-Xmx1024m设置reduce可用内存为1g
mapred.job.shuffle.merge.percentfloat0.66buffer中的数据达到多少比例开始写入磁盘
mapred.job.reduce.input.buffer.percentfloat0.0指定多少比例的内存用来存放buffer中的数据

MapReduce tuning总结

Map Task和Reduce Task调优的一个原则就是

减少数据的传输量
尽量使用内存
减少磁盘IO的次数
增大任务并行数
除此之外还有根据自己集群及网络的实际情况来调优

Map task和Reduce task的启动数

1.mapper数量

每个作业启动的mapper由输入的分片数决定,每个节点启动的mapper数应该是在10-100之间,且最好每个map的执行时间至少一分钟 如果输入的文件巨大,会产生无数个mapper的情况,应该使用mapred.tasktracker.map.tasks.maximum参数确定每个tasktracker能够启动的最大mapper数,默认只有2 以免同时启动过多的mapper

2.reducer数量

reducer的启动数量官方建议是0.95或者1.75节点数每个节点的container数 使用0.95的时候reduce只需要一轮就可以完成 使用1.75的时候完成较快的reducer会进行第二轮计算,并进行负载均衡

增加reducer的数量会增加集群的负担,但是会得到较好的负载均衡结果和减低失败成本

一些详细的参数:

选项类型默认值描述
mapred.reduce.tasksint1reduce task数量
mapred.tasktracker.map.tasks.maximumint2每个节点上能够启动map task的最大数量
mapred.tasktracker.reduce.tasks.maximumint2每个节点上能够启动reduce task的最大数量
mapred.reduce.slowstart.completed.mapsfloat0.05map阶段完成5%的时候开始进行reduce计算

map和reduce task是同时启动的,很长一段时间是并存的,共存的时间取决于mapred.reduce.slowstart.completed.maps的设置,如果设置为0.6.那么reduce将在map完成60%后进入运行态

如果设置的map和reduce参数都很大,势必造成map和reduce争抢资源,造成有些进程饥饿,超时出错,最大的可能就是socket.timeout的出错

reduce是在33%的时候完成shuffle过程,所以==确保reduce进行到33%的时候map任务全部完成==,可以通过观察任务界面的完成度进行调整。当reduce到达33%的时候,map恰好达到100%设置最佳的比例,可以让map先完成,但是不要让reduce等待计算资源

转载于:https://juejin.im/post/5cece62ce51d45109725fdf6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mr-Jet是一款功能强大的用户手册应用,它提供了一系列的实用功能,帮助用户更好地使用和管理各类手册。 首先,Mr-Jet提供了便捷的手册搜索功能。用户可以通过关键词搜索手册内容,快速找到想要的信息。不仅可以搜索手册标题和简介,还可以搜索手册内的具体内容,极大地提高了查找效率。 其次,Mr-Jet支持用户自动更新手册。用户可以选择手册自动更新,这样在手册内容有更新时可以第一时间获取最新的内容。这对于经常需要查看最新信息的用户非常方便,不再需要手动去寻找更新版本。 再次,Mr-Jet还提供了手册的离线缓存功能。用户可以选择将手册缓存在本地,即使在没有网络连接的情况下也能够随时查看手册内容。这对于用户在出差或者没有网络的情况下依然需要查看手册的需求非常有帮助。 此外,Mr-Jet还支持用户书签功能。用户可以随时将重要的页面添加到书签中,方便快速定位和查找。同时,书签也可以通过云同步到其他设备上,用户在其他设备上也能方便快捷地查看已保存的书签。 最后,Mr-Jet还提供了便捷的手册管理功能。用户可以对手册进行分类管理,创建文件夹,方便整理和查找手册。同时,用户还可以通过Mr-Jet进行手册的导出和分享,在需要的时候将手册发送给他人。 总之,Mr-Jet用户手册应用在功能上非常强大、实用。它的手册搜索、自动更新、离线缓存、书签和手册管理等功能,能够满足用户在使用和管理手册过程中的各种需求,提供更好的用户体验。 ### 回答2: Mr-Jet用户手册(功能篇) Mr-Jet是一款功能强大的智能助手,通过提供各种实用功能,帮助用户高效地完成各种任务。下面是Mr-Jet用户手册功能篇的详细介绍: 1. 语音助手功能:Mr-Jet可以准确识别用户的语音指令,并根据用户的需求,提供相应的信息和服务。用户只需语音命令,便可轻松查询天气、新闻、股票信息等。 2. 日历和提醒功能:用户可将日程安排添加到Mr-Jet的日历中,并设置提醒功能,确保不会错过任何重要的事项。Mr-Jet会在预设时间发出提醒,并提供相应的操作指引。 3. 导航和地图功能:用户可通过Mr-Jet查询地图和导航信息,轻松规划出行路线。Mr-Jet提供实时的交通情况和导航提示,帮助用户选择最佳的行驶路线。 4. 翻译功能:Mr-Jet集成了强大的翻译引擎,用户可通过语音或文字输入进行翻译。无论是日常沟通还是在旅行中遇到语言障碍,Mr-Jet都能够帮助用户理解和交流。 5. 智能购物功能:用户可通过Mr-Jet查找和购买各类商品。只需输入关键词或语音提问,Mr-Jet会为用户提供相关商品的信息和购买链接。方便快捷的购物流程让用户省时省力。 6. 语音记事本功能:用户可通过Mr-Jet的语音记事本功能,随时记录重要的想法和任务。Mr-Jet会将用户的语音转为文字,并保存在用户的个人云端空间中,用户可随时查阅和管理。 总之,Mr-Jet作为一款功能强大的智能助手,为用户提供了多种实用的功能。无论是日常生活中的各类需求,还是在工作和学习中的辅助工具,Mr-Jet都能够提供便捷的解决方案,帮助用户高效地完成各项任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值