前言
在前几章中,我们已经对MapReduce以及YARN有了初步的认识,并能够编写一些常见的MapReduce程序。此外,还学习了MapReduce任务的执行流程(任务提交、任务执行、容错、Shuffle等)等。在实际场景中,我们往往希望任务运行的更快一些,效率更高一些,这时候就需要对框架或作业进行一些配置优化了。
MapReduce常用配置
我们首先来看下MapReduce常见的配置,这些配置基本上都可以在提交作业时通过-D key=value
的方式进行制定。
内存相关
属性名称 | 说明 |
---|---|
mapreduce.map.memory.mb | 设置map容器所用的内存容量,默认是1024 |
mapreduce.reduce.memory.mb | 设置reduce容器所用的内存容量,默认是1024 |
mapred.child.java.opts | JVM选项,用于启动运行map和reduce任务的容器进程。除了用于设置内存,该属性还包括JVM参数设置 |
mapreduce.map.java.opts | JVM选项,针对运行map任务的子进程 |
mapreduce.reduce.java.opts | JVM选择,针对运行reduce任务的子进程 |
这几个参数可能会有些让人混淆,我们举个例子来说明。例如,假设mapred.child.java.opts被设置为-Xmx800m
,mapreduce.map.memory.mb为默认值1024MB,当map任务启动时,NodeManager会为该任务分配一个1024MB的容器(在该任务运行期间,NodeManager的内存池也会相应降低1024MB),并启动配置为最大堆为800MB的任务JVM。注意,JVM进程的内存开销将比该堆的规模要大,开销依赖于所使用的本地库、永久生成空间等因素。需要注意的是,JVM进程所使用的物理内存必须不超出分配给它的内存大小(1024MB)。如果一个容器使用的内存超过所分配的内存,就会被NodeManager中止,并标记为失败。
CPU设置
属性名称 | 说明 |
---|---|
mapreduce.map.cpu.vcores | 设置map任务所使用的CPU核心数,默认为1 |
mapreduce.reduce.cpu.vcores | 设置reduce任务所使用的CPU核心数,默认为1 |
Shuffle相关
属性名称 | 说明 |
---|---|
mapreduce.task.io.sort.mb | 设置map任务输出时环形缓冲区大小,默认为100 |
mapreduce.map.sort.spill.percent | 设置缓冲区数据溢写阈值,默认为0.80,即80% |
mapreduce.task.io.sort.factor | map任务的溢写文件每次最多能合并多少流,默认为10 |
mapreduce.map.combine.minspills | 运行combiner所需的最少溢出文件数 |
mapreduce.map.output.compress | map任务输出是否进行压缩,默认值是false |
mapreduce.map.output.compress.codec | map任务输出的压缩格式 |
mapreduce.reduce.shuffle.parallelcopies | reduce任务用于获取map任务输出内容的线程数,默认为5 |
mapreduce.reduce.shuffle.input.buffer.percent | 在shuffle的复制阶段,分配给map输出的缓冲区占堆空间的百分比,默认为0.70,即70% |
mapreduce.reduce.shuffle.merge.percent | map输出缓冲区的阈值使用比例,用于启动合并输出和磁盘一些的过程,默认为0.66,即66% |
mapreduce.reduce.merge.inmem.threshold | 启动合并输出和磁盘溢写过程的map输出的阈值数,0或更小的数意味着没有阈值限制。默认为1000 |
mapreduce.reduce.input.buffer.percent | 在reduce过程中,在内存中保存map输出的空间占整个堆空间的比例。reduce阶段开始时,内存的map输出大小不能大于这个值。默认情况下,在reduce任务开始之前,所有map输出都合并到磁盘上,以便为reduce提供尽可能多的内存。然而,如果reduce需要的内存较少,可以增加此值来最小化访问磁盘的次数,默认为0.0 |
其他设置
属性名称 | 说明 |
---|---|
mapreduce.map.maxattempts | 设置map任务的最大重试次数,默认为4 |
mapreduce.reduce.maxattempts | 设置reduce任务的最大重试次数,默认为4 |
mapreduce.job.ubertask.enable | 是否启用Uber任务,默认为false |
mapreduce.job.ubertask.maxmaps | Uber任务最多的map数量,默认为10 |
mapreduce.job.uber.task.maxreduces | Uber任务虽多的reduce数量,默认为1 |
mapreduce.job.ubertask.maxbytes | Uber任务的最大输入大小,默认是一个数据块的大小 |
mapreduce.task.timeout | map或reduce的任务超时时间,默认为10分钟 |
mapreduce.map.failures.maxpercent | map任务允许任务失败的最大百分比,默认为0 |
mapreduce.reduce.failures.maxpercent | reduce任务允许任务失败的最大百分比,默认为0 |
mapreduce.map.speculative | 是否开启map任务推测执行,默认为true |
mapreduce.reduce.speculative | 是否开启reduce任务推测执行,默认为true |
YARN常用配置
属性名称 | 说明 |
---|---|
yarn.nodemanager.resource.memory-mb | NodeManager运行的容器可以分配到的物理内存容量,默认值为8192MB |
yarn.nodemanager.resource.cpu-vcores | NodeManager运行的容器可以分配到的CPU核心数,默认为8 |
yarn.nodemanager.vmem-pmem-ratio | 容器所占的虚拟内存和物理内存之比。该值指示了虚拟内存的使用可以超过所分配内存的量 |
yarn.scheduler.minimum-allocation-mb | 为容器分配的最小内存,默认为1024MB |
yarn.scheduler.maximum-allocation-mb | 为容器分配的最大内存,默认为8192MB |
yarn.scheduler.minimum-allocation-vcores | 为容器分配的最小CPU核数,默认为1 |
yarn.scheduler.maximum-allocation-vcores | 为容器分配的最大CPU核数,默认为4 |
小结
本章主要介绍了MapReduce与YARN的一些常见配置参数,有内存相关、CPU相关、Shuffle相关、容错相关等。这些参数在特定的场景下非常有用,但是使用参数的前提是必须理解为什么要这样配置,原理是什么,才能够做到了然于胸。