@Macux
2018-01-18T08:54:50.000000Z
字数 2119
阅读 1757
Hadoop
Hadoop MapReduce 性能调优的 核心 是让 Hadoop 集群资源均衡,而不是简单地调整几个参数。
PS:Hadoop 的参数一共有180多个,当然不是调整几个那么容易! - -
Hadoop MapReduce 的资源分为以下几类:
- 计算资源
- 内存资源
- 网络带宽资源
- I/O存储资源
将以下三个参数值调小:
mapred.max.split.size
mapred.min.split.size.per.rack
mapred.min.split.size.per.node
Mobvista集群,这三个参数的默认值是1GB。
降低为128MB,即128000000
整个Map的速度会变快。
背景描述
- 在 Map 阶段,map 任运行期间,会产生中间数据输出并保存在默认为 100MB(io.sort.mb)的内存缓冲区中。此缓冲区是预留内存的一块,而预留内存是 Map JVM 堆空间的一部分。一旦达到占用阈值(io.sort.spill.percent),缓冲区的内容就会被写到本地磁盘,这就是溢写(spill)。
- 为了存储溢写记录的元数据(包括文件名称、大小、位置、属性、创建时间、修改时间等等),每条记录的元数据长度为 16 字节。
- Hadoop 框架使用 io.sort.mb 分配内存的 5%(由 io.sort.record.percent 参数指定),也就是 5MB,分配给元数据,95MB 分配给缓冲区使用。
判断是否存在多余的溢写:
![]()
(1)、比较 Map output records(map 的输出记录)和 Spill Records(溢写记录)这两个计数器。
(2)、如果 Spill Records > Map output records 表明发生了多余的溢写。
优化过程:
(1)、确定缓冲区所需的内存空间,需要计算溢写记录和元数据分别所占空间大小。
Record length = Map output bytes / Map output records = 68022178 / 472293 = 144bytes
Spilled Records Size = Spilled Records * Record length = 144 * 472293 = 68022178 = 64M
Metadata Size = Metadata length * Spilled Records = 16 * 472293 = 7556688 = 7M
(2)、最优参数值确定:
io.sort.record.percent = 16 / (16 + 144) = 0.1
io.sort.mb = Metadata size + Spilled Records size = 64 + 7 = 71M
背景描述:
在 Reduce 阶段内,map 任务和 reduce 任务间数据传输造成的大规模网络流量。
优化过程:
(1)、把 mapred.job.reduce.input.buffer.percent 设为 0.8,缓冲区可以利用 80%,reducer 输入数据可以借此保存在内存中。默认是 0.0,表示 map 的输出合并到本地磁盘而非内存。
(2)、在 shuffle 阶段最大化内存分配以存储 map 输出,可以把 mapred.job.shuffle.input.buffer.percent 的值增加到 0.9,以使用 90% 的内存堆而不是 70% 的默认值。
背景描述
启用 map 任务的输出压缩可以有效减少写入存储系统的中间数据量,可以使 shuffle 阶段和写入阶段加速磁盘写操作,从而减少数据传输的总时间,但同时会带来额外的 CPU 开销。
当输入数据量很大而且容易拆分时(比如文本文件),才应该启用压缩,启用方式:
mapred.compress.map.output=true
背景描述
在 mapper 任务产生的输出非常大时,有必要增加 shuffle 阶段获取 map 输出的并行传输数目。
优化过程:
增加 mapred.reduce.parallel.copies 的值,增加网络流量,加速 map 输出的复制过程。
建议使用以下两种方法计算 Mapper 数 和 Reducer 数
mapper 数 = (CPU 核数 - 1) * 1.75
reducer 数 = 1.75 * (节点数 * mapred.reduce.parallel.copies)
mapper 数 = (CPU 核数 - 1) * 1.75
reducer 数 = (CPU 核数 - 1) * (0.95~1.75)