整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

6.4.3. 配置调优

hadoop 小红牛 7℃ 0评论

现在我们已经有比较好的基础来理解如何调优shuffle过程来提高 MapReduce性能。表6-1和表6-2总结了相关设置和默认值,这些设置以作 业为单位(除非有特别说明),默认值适用于常规作业。

6-1. map端的调优属性

属性名称

类型

默认值

说明

io.sort.mb

int

100

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

io.sort.record.percent

float

0.05

用作存储map输出记 录边界的io.sort.mb 的比例。剩余的空间 用来map输出记 录本身。该属性在 1.x之后的版本删除了,因为shuffle代码被提高来更好地执行作业,速过使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.codec

Class name

org.apache.hactoop.io.compress.DefaultCodec

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

tasktracker.http.

threads

int

40

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

 

总的原则是给shuffle过程尽量多提供内存空间。然而,有一个平衡问题,也就是要确保map函数和reduce函数能得到足够的内存来运行。这就是为什么编写map函数和reduce函数时尽量少用内存的原因,它们不应该无限使用内存(例如,应避免在map中堆积数据)

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

map端,可以通过避免多次溢出写磁盘来获得最佳性能,一次是最佳的情况。如果能估算map输出大小,就可以合理地设置ip.sort.*.属性来尽可能减少溢出写的次数。具体而言,如果可以,就要增加io.sort.mb的值。MapReduce计数器(“Spilled records”)计算 在作业运行整个阶段中溢出写磁盘的记录数,这对于调优很有帮助。注 意,这个计数器包括mapreduce两端的溢出写。

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

6-2. 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.iob.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.iob.reduce.input. buffer.percent

float

0.0

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

更常见的情况是,Hadoop使用默认为4 KB的缓冲区,这是很低的,因此 应该在集群中增加这个值(通过设置io.file.buffer.size,详见9.4.5 节)。

20084月,Hadoop在通用TB字节排序基准测试中获胜, 它使用了一个优化方法,即将中间数据保存在reduce端的内存中。

转载请注明:全栈大数据 » 6.4.3. 配置调优

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址