hadoop优化总结

主要总结了下自己知道的一些hadoop优化建议。不全,对于操作系统,jvm层面的优化还未提及,待完善。

一 mr执行关键参数

指定yarn运行

mapreduce.framework.name=yarn

mapreduce.job.reduces : reduce个数

关键参数调整(mapred-site.xml)

mapreduce.map.memory.mb : map任务的内存大小

mapreduce.reduce.memory.mb :reduce任务的内存大小

这个大小必须在 一下参数之间(yarn-site.xml)

yarn.scheduler.capacity.minimum-allocation-mb(yarn.scheduler.minimum-allocation-mb) : yarn分配的最小内存大小 默认是1024MB

yarn.scheduler.capacity.maximum-allocation-mb(yarn.scheduler.maximum-allocation-mb) : yarn分配的最大内存大小 默认是10240MB

mapreduce.reduce.java.opts : reduce 任务的启动参数

am进度查看参数(mapred-site.xml)

mapreduce.client.progressmonitor.pollinterval : 客户端间隔时间查询一次

客户端查询任务完成时间(mapred-site.xml)

mapreduce.client.completion.pollinterval : 客户端间隔查询一次

二 各种失败情况

1.任务失败

任务会定时通知到am,若是超过多长时间就会认为时间,参数是 : mapreduce.task.time 默认是10分钟

mapreduce.map.maxattempts : map任务的失败重试次数 超过这个次数 任务失败

mapreduce.reduce.maxattempts : reduce任务的失败重试次数 超过这个次数 任务失败

mapreduce.map.failures.maxpercent : map失败的次数超过这个值,整个job失败

mapreduce.reduce.failures.maxpercent : reduce失败的次数超过这个值,整个job失败

2.am失败

默认情况下,am失败一次就认为整个job失败

yarm.resourcemanager.am.max-retries : am的最大失败次数

当am发生故障失败,rm会把通过nm启动一个新的am ,需要通过一个参数来开启这个功能

yarn.app.mapreduce.am.job.recovery.enable=true

3.nm失败

若是nm失败,就会停止向rm发送心跳信息并被移除可用节点。时间是通过

yarn.resourcemanager.nm.liveness-monitor.expiry-interval-ms来设置,默认是10分钟

若是nm管理的节点中任务失败过高的话,就会被拉黑,拉黑参数是

mapreduce.job.maxtaskfailures.per.tracker 默认是3

4.rm的失败

目前是通过rm的ha来解决这个,数据基于zk存储

三 作业的调度

yarn.resourcemanager.scheduler.class=

公平调度器 : org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler

容量调度器 : org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler

四 shuffle和排序

4.1 map

每个map都会有一个缓冲区 : mapreduce.task.io.sort.mb ,默认是100m

若是这个中容量达到 mapreduce.task.io.sort.spill.percent=0.8的话,那么就会刷新到 mapred.loca.dir中 ,同时数据还会继续写入,若是写慢的话,那么会阻塞直到写磁盘完成。这个过程称为spill

在数据写入磁盘前,会根据reduce个数 将数据划分为各个分区,后台线程按键进行内排序,若是有一个combiner就会在排序后的输出上运行

每次spill都会生出一个文件,在任务完成之前,溢出文件会被合并成一个已分区且已排序的输出文件。通过mapreduce.task.io.sort.factor属性来控制,多少个流合并成一个文件。默认是10

若是磁盘上已经存在三个(min.num.spills.for.combine)溢出文件的话,那么就会运行combiner文件 .若是文件很少的话,那么就没必要使用combiner

在map时候尽量使用压缩,这样可以提升写入磁盘的速率

mapreduce.map.output.compress=true

mapreduce.map.output.compress.codec=com.hadoop.compression.lzo.LzoCodec

4.2 reduce

map任务完成后就是reduce阶段,默认是只要有一个(mapreduce.job.reduce.slowstart.completedmaps)任务完成后就会执行reduce任务。

复制文件的个数是由 ,mapreduce.reduce.shuffle.parallelcopies控制

若是map的输出非常的小的话,那么可以通过mapred.job.shuffle.input.buffer.percent来控制,这个百分比是针对reduce堆空间大小的

若是数据量比较大的话,那么一旦内存缓冲区达到阀值的话(mapred.job.shuffer.merge.percent)或者map输出达到mapred.inmem.merge.threshold,则合并后溢出写到磁盘中

复制完所有的map数据后,就进入了合并文件阶段,排序已经在map阶段做好了

假设有50个map输出,合并因子是通过 mapreduce.task.io.sort.factor来控制的,假设是10,那么存在五个reduce任务,那么就会合并5次。

不过合并的文件书是 4,10,10,10,all

4.3 配置优化

整体原则是尽量给shuffle多的内存。

运行map的jvm参数是通过 mapreduce.map.java.opts来设置

reduce任务的jvm参数是通过 mapreduce.reduce.java.opts来设置

这两个参数一般设置为 container的0.8大小

mapred.job.shuffle.input.buffer.percent:在shuffle的复制阶段,分配给map输出的缓冲区占堆空间的百分比

mapred.job.shuffer.merge.percent:map输出缓冲区的阀值使用比例,用于启动合并输出和磁盘溢出写的过程

关闭推测写

mapred.map.tasks.speculative.execution=false 若是任务变慢的话,决定是否开启推测map

mapred.reduce.tasks.speculative.execution=false 若是reduce任务变慢的话,决定是否开启推测reduce

开启jvm重用: mapred.job.reuse.jvm.num.tasks=1 默认情况下是1

华为的一份性能优化文档:具体优化参数 :http://support.huawei.com/enterprise/docinforeader.action?contentId=DOC1000113254 里面的建议也基本采用的是《hadoop权威指南》中的建议。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注