mapreduce优化总结

mapreduce优化总结

mr的执行过程

1、客户端会根据待处理数据的信息,形成任务分配规则:
block块 1-128 决定map数量
split切片 1-128 决定maptask数量

2、首先客户端submit一个mr任务给yarn(job.xml、jar包、切片信息),yarn的resourceManager会指定一个nodemanager分配一个容器来启动applicationMaster(每一个job都会有一个applicationmaster)。applicationmr会计算出map数量以及maptask数量

3、然后此时fileInputformate 类的会用recordReader的read方法来读取文件中的数据(k,v)

4、读取的kv值会入maptask中,map(k,v)会对数据进行处理,然后context.write(k,v)会写入outputController()

5、outputController会将数据写入环形缓冲区,在环形缓冲区中,kv对会进行分区排序的一个过程,当数据达到环形缓冲区的80%(默认是80% 环形缓冲区大小100m)就会发生溢写操作。当溢写文件过多是就会发生合并,合并的过程中就会调用partition方法进行分区以及排序,最后入reduceTask的时候会进行一个归并排序分组(shuffle过程就会发生2次快排一次归并排序)

6、分组之后会入reducetask,reduce(k,v)会对输入数据进行逻辑处理,最后context.write(k,v)输出,outputformat的recordWRITE类的write方法会输出到hdfs中。

根据mr执行流程的优化策略
根据以上流程mr的优化主要在于maptask切片以及shuffle阶段

  1. 首先我从源数据避免大量小文件,提前将小文件merge成合适大小的文件

  2. 设置虚拟存储切片 driver中 CombineTextInfuputFormat.setMaxInputSplitSize(),防止小文件成为一个maptask
    应该block决定了map的数量,但是split决定了maptask的数量,但是split是针对单个文件的,比如两个文件一个是129,一个是127m,按照默认参数这两个文件会被分成三个切片一个128,1,127。这样会有三个maptask,会让shuffle阶段产生小文件,也会浪费不必要的资源。设置虚拟存储切片可以避免这类事情,但是虚拟存储切片设定的值还需根据yarn界面调优。

  3. 减少环形缓冲区的溢写次数,减少溢写次数也是为了减少环形缓冲区的小文件输出
    主要是调整io.sort.mb环形缓冲区大小,默认是100m,sort.spill.percent环形缓冲区溢写百分比 默认是当数据超出环形缓冲区的80%就会发生溢写操作,适当的调整这个大小以及占比会减小小文件。

  4. 减少合并的次数
    调整io.sort.factor参数,这个参数主要是控制merge文件数量,增加数量可以适当减少合并的次数

  5. 可以适当在map和reducer的过程中combine,
    combine继承的是reduce,combin执行的位置就是在环形缓冲区之后以及归并操作之后,也就是在maptask出口执行,以及reduce进口,不涉及maptask或者reducetask间的操作,可以减少io。

  6. 在没有自定义排序的必要时,排序规则尽量不要修改 尽量使用shuffle自己的排序规则

  7. 设置合适的reduceTask数量
    这里reducetask的数量第一次和先粗略的计算一下:假设键值对大小为10g,每一个reducetask内存为2g 可以10/(2*0.7)=8
    就是至少给每个reducetask预留30%的内存。

  8. 为具体的任务设置合适的Continer大小,无论是MapTask还是ReduceTask,只要是cpu密集型的,其所使用的Continer就应该由较多的cpu和合适的内存所组成。同样的,如果任务是IO密集型的,其所使用的Continer就应该改由合适的cpu和较大的内存所组成。这个一般不全局调节。

  9. 使用文件压缩方式传输数据,减少io
    常用的有gzip:hadoop自带的,压缩率高,但是不支持split
    bzip2:hadoop自带的,压缩率极高,但是解压压缩慢。在处理存档的日志或者使用率较低的文件可以使用该压缩方式,支持split。
    lzo:压缩率合理,支持split,但是需要安装,压缩率比gzip低,但是文件越大,越推荐lzo。
    snappy:高压缩速度和高压缩率,不支持split,需要安装。

  10. 参数调优

  mapreduce.map.memory.mb
一个MapTask可使用的资源上限(单位:MB),默认为1024。如果MapTask实际使用的资源量超过该值,则会被强制杀死。
mapreduce.reduce.memory.mb
一个ReduceTask可使用的资源上限(单位:MB),默认为1024。如果ReduceTask实际使用的资源量超过该值,则会被强制杀死。
mapreduce.map.cpu.vcores
每个MapTask可使用的最多cpu core数目,默认值: 1
mapreduce.reduce.cpu.vcores
每个ReduceTask可使用的最多cpu core数目,默认值: 1
mapreduce.reduce.shuffle.parallelcopies
每个Reduce去Map中取数据的并行数。默认值是5
mapreduce.reduce.shuffle.merge.percent
Buffer中的数据达到多少比例开始写入磁盘。默认值0.66
mapreduce.reduce.shuffle.input.buffer.percent
Buffer大小占Reduce可用内存的比例。默认值0.7
mapreduce.reduce.input.buffer.percent
指定多少比例的内存用来存放Buffer中的数据,默认值是0.0

容错参数调优

--mapreduce.map.maxattempts
每个Map Task最大重试次数,一旦重试参数超过该值,则认为Map Task运行失败,默认值:4。
--mapreduce.reduce.maxattempts
每个Reduce Task最大重试次数,一旦重试参数超过该值,则认为Map Task运行失败,默认值:4。
--mapreduce.task.timeout
 Task超时时间,经常需要设置的一个参数,该参数表达的意思为:如果一个Task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该Task处于Block状态,可能是卡住了,也许永远会卡住,为了防止因为用户程序永远Block住不退出,则强制设置了一个该超时时间(单位毫秒),默认是600000。如果你的程序对每条输入数据的处理时间过长(比如会访问数据库,通过网络拉取数据等),建议将该参数调大,该参数过小常出现的错误提示是“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值