您的位置:首页 > 运维架构

好记性不如烂笔头---hadoop配置调优

2018-01-02 11:17 274 查看
       以下属性以作业为单位,默认值适合于常规作业。

       map端的调优属性

属性             

类型      

默认值

 

io.sort.mb      

int         

100

排序map输出时所使用的的内存缓冲区的大小,以兆字节为单位

 

io.sort.spill.percent       

float       

0.80

map输出内存缓冲和用来开始磁盘溢出写过程的记录边界索引,这两者使用比例的阈值

 

io.sort.factor                

int         

10

排序文件时,一次最多合并的流数。这个属性也在reduce中用,将此值增加到100是很常见的。

 

min.num.spills.for.combine  

int         

3

如果指定了combiner,运行combiner所需的最少溢出文件数

 

mapred.compress.map.output       

Boolean         

false

压缩map输出

 
mapred.map.output.compression.cede

Class name

org.apache.hadoop.io.compress.DefaultCodec

用于map输出的压缩编解码器

 

tasktracker.http.threads         

int         

40

每个tasktracker的工作线程数,用于将map输出到reduce,ps.这是集群范围的设置,不能由单个作业设置。在MapReduce2中不适用

 

       配置调优的总的原则是给shuffle过程尽量多提供内存空间,同时也要确保map函数和reduce函数能得到足够的内存来运行,因此,我们编写map函数和reduce函数时应该尽量少用内存,它们不应该无限使用内存。

       运行map任务和reduce任务的JVM,其内存大小由mapred.child.java.opts属性设置,任务节点上的内存大小应该尽量大。

       在map端,可以通过避免多次溢出写磁盘来获得最佳性能,一次是最佳情况。如果能估算map输出的大小,就可以合理的设置io.sort.*.属性来尽可能减少溢出写的次数。

       在reduce端,中间数据全部驻留在内存时,就能获得最佳性能,在默认情况下,这是不可能发生的,因为所有内存一般都预留给reduce函数。如果reduce函数的内存需求不大,把mapred.inmem.merge.threshold设置为0,把mapred.job.reduce.input.buffer.percent设置为1.0或者一个更低的值,就可以提升性能。

       reduce端的调优属性

属性             

类型      

默认值

 

mapred.reduce.parallel.copies

int

5

用于把map输出复制到reducer的线程数

 

mapred.reduce.copy.backoff

int

300

在声明失败之前,reducer获取一个map输出所花的最大时间,以秒为单位。如果失败(根据指数后退),reducer可以在此时间内尝试重传

 

io.sort.factor

int

10

排序文件时一次最多合并的流的数量,这个属性也在map端使用

 

mapred.job.shuffle.input.buffer.percent

float

0.70

在shuffle的复制阶段,分配给map输出的缓冲区占堆空间的百分比

 

mapred.job.shuffle.merge.percent

float

0.66

map输出缓冲区(由mapred.job.shuffle.input.buffer.percent定义)的阈值使用比例,用于启动合并输出和磁盘溢出写过程

 

mapred.inmem.merge.threshold

int

1000

启动合并输出和磁盘溢出写过程的map输出的阈值数。0或更小的数意味着没有阈值限制,溢出写行为由mapred.job.shuffle.merge.percent单独控制

 

mapred.job.reduce.input.buffer.percnt

float

0.0

在reduce过程中,在内存中保存map输出的空间占整个堆空间的比例。reduce阶段开始时,内存中的map输出大小不能大于这个值。默认情况下,在reduce任务开始之前,所有map输出都合并到磁盘上,以便为reducer提供尽可能多的内存。然而,如果reducer需要的内存较少,可以增加此值来最小化访问磁盘的次数

 

       更常见的情况是,hadoop默认使用4KB的缓冲区,这是很低的,因此应该在集群中增加这个值(通过设置io.file.buffer.size,在core-site.xml文件中,设置为128KB)。

mapred.job.reuse.jvm.num.task

int

1

在一个tasktracker上,对于给定的作业的每个JVM上可以运行的任务最大数。-1表示无限制,即同一个JVM可以被该作业的所有任务使用。JobConf中的setNumTasksToExecutePerJvm()方法也可以用于设置这个属性。

hadoop在自己的Java虚拟机上运行任务,以区别于其他正在运行的任务。为每个任务启动一个新的JVM约1秒钟,对于运行时间在1分钟左右的作业而言,这个额外消耗是微不足道的。但是,有大量短任务的作业或初始化时间长的作业,它们启用JVM重用,就可以体现出性能上的优势。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hadoop