优化(1)资源相关参数:
以下参数是在自己的 MapReduce 应用程序中配置就可以生效
配置 | 说明 |
---|---|
mapreduce.map.memory.mb: | 一个 Map Task 可使用的内存上限(单位:MB),默认为 1024。如果 Map Task 实际使用的资源量超过该值,则会被强制杀死。 |
mapreduce.reduce.memory.mb: | 一个 Reduce Task 可使用的资源上限(单位:MB),默认为 1024。如果 Reduce Task 实际使用的资源量超过该值,则会被强制杀死。 |
mapreduce.map.cpu.vcores: | 每个 Maptask 可用的最多 cpu core 数目, 默认值: 1 |
mapreduce.reduce.cpu.vcores: | 每个 Reducetask 可用最多 cpu core 数目默认值: 1 |
mapreduce.map.java.opts: | Map Task 的 JVM 参数,|map任务为例,Container其实就是在执行一个脚本文件,而脚本文件中,会执行一个 Java 的子进程,这个子进程就是真正的 Map Task,mapreduce.map.java.opts 其实就是启动 JVM 虚拟机时,传递给虚拟机的启动参数,而默认值 -Xmx200m 表示这个 Java 程序可以使用的最大堆内存数,一旦超过这个大小,JVM 就会抛出 Out of Memory 异常,并终止进程。而 mapreduce.map.memory.mb 设置的是 Container 的内存上限,这个参数由 NodeManager 读取并进行控制,当 Container 的内存大小超过了这个参数值,NodeManager 会负责 kill 掉 Container。在参数 yarn.nodemanager.vmem-pmem-ratio 中, NodeManager 监控 Container 内存(包括虚拟内存和物理内存)及 kill 掉 Container 的过程。也就是说,mapreduce.map.java.opts一定要小于mapreduce.map.memory.mb 以下的mapreduce.reduce.java.opts同理. 你可以在此配置默认的 java heap size 等参数, 例如:“-Xmx1024m -verbose:gc -Xloggc:/tmp/@taskid@.gc” (@taskid@会被 Hadoop 框架自动换为相应的 taskid), 默认值: “” |
mapreduce.reduce.java.opts: | Reduce Task 的 JVM 参数,你可以在此配置默认的 java heap size 等参数, 例如:“-Xmx1024m -verbose:gc -Xloggc:/tmp/@taskid@.gc”, 默认值: “” |
以下参数需在 yarn 启动之前就配置在服务器的配置文件中, 才能生效
配置 | 说明 |
---|---|
yarn.scheduler.minimum-allocation-mb | RM 中每个容器请求的最小配置,以 MB 为单位,默认 1024。 |
yarn.scheduler.maximum-allocation-mb | RM 中每个容器请求的最大分配,以 MB 为单位,默认 8192。 |
yarn.scheduler.minimum-allocation-vcores | 1 |
yarn.scheduler.maximum-allocation-vcores | 32 |
yarn.nodemanager.resource.memory-mb | 表示该节点上YARN可使用的物理内存总量,默认是 8192(MB),注意,如果你的节点内存资源不够 8GB,则需要调减小这个值,而 YARN不会智能的探测节点的物理内存总量。 |
shuffle 性能优化的关键参数,应在 yarn 启动之前就配置好
配置 | 说明 |
---|---|
mapreduce.task.io.sort.mb 100 | shuffle 的环形缓冲区大小,默认 100m |
mapreduce.map.sort.spill.percent | 0.8 环形缓冲区溢出的阈值,默认 80% |
优化(2)容错相关参数:
配置 | 说明 |
---|---|
mapreduce.map.maxattempts: | 每个 Map Task 最大重试次数,一旦重试参数超过该值,则认为 Map Task 运行失败,默认值:4。 |
mapreduce.reduce.maxattempts: | 每个Reduce Task最大重试次数,一旦重试参数超过该值,则认为 Map Task 运行失败,默认值:4。 |
mapreduce.map.failures.maxpercent: | 当失败的 Map Task 失败比例超过该值,整个作业则失败,默认值为 0. 如果你的应用程序允许丢弃部分输入数据,则该该值设为一个大于 0 的值,比如 5,表示如果有低于 5%的 Map Task 失败(如果一个 Map Task 重试次数超过mapreduce.map.maxattempts,则认为这个 Map Task 失败,其对应的输入数据将不会产生任何结果),整个作业扔认为成功。 |
mapreduce.reduce.failures.maxpercent: | 当失败的 Reduce Task 失败比例超过该值为,整个作业则失败,默认值为 0. |
mapreduce.task.timeout: | 如果一个task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该 task 处于 block 状态,可能是临时卡住,也许永远会卡住。为了防止因为用户程序永远 block 不退出,则强制设置了一个超时时间(单位毫秒),默认是600000,值为 0 将禁用超时。 |
优化(3)效率跟稳定性参数(任务的推测执行):
Straggle(掉队者)是指那些跑的很慢但最终会成功完成的任务。一个掉队的Map任务会阻止Reduce任务开始执行。
Hadoop不能自动纠正掉队任务,但是可以识别那些跑的比较慢的任务,然后它会产生另一个等效的任务作为备份,并使用首先完成的那个任务的结果,此时另外一个任务则会被要求停止执行。这种技术称为推测执行(speculative execution)。
默认使用推测执行。
配置 | 说明 |
---|---|
mapreduce.map.speculative | 控制Map任务的推测执行(默认true) |
mapreduce.reduce.speculative | 控制Reduce任务的推测执行(默认true) |
mapreduce.job.speculative.speculativecap | 推测执行功能的任务能够占总任务数量的比例(默认0.1,范围0~1) |
mapreduce.job.speculative.slownodethreshold | 判断某个TaskTracker是否适合启动某个task的speculative task(默认1) |
mapreduce.job.speculative.slowtaskthreshold | 判断某个task是否可以启动speculative task(默认1) |
mapreduce.input.fileinputformat.split.minsize | FileInputFormat做切片时最小切片大小,默认 1。 |
mapreduce.input.fileinputformat.split.maxsize | FileInputFormat做切片时最大切片大小 |
相关链接: