MapReduce性能优化

shuffle过程参数调优

Map端的调优属性
io.sort.mb int 100 排序Map输出是所使用内存缓冲区的大小,以MB为单位
io.sort.record.percent float 0.05 用作存储Map输出记录边界的io.sort.mb的比例,剩余的空间存储Map输出记录本身
io.sort.spill.percent float 0.8 Map输出内存缓冲和用来开始磁盘溢出写过程的记录边界索引,是两者使用比例的阀值
io.sort.factor boolean false 排序文件时,一次最后合并的流数,这个属性也在Reduce端使用,将阀值增加到100是很常用的
mapred.compress.map.output 压缩Map的输出
mapred.map.out.compression.codec class org.apache.hadoop.io.compress.DefaultCodec 用于Map输出的压码编码解码
min.num.spills.for.combinar int 3 运行Combinar所需要的最小溢出写文件数
tasktracker.http.threads int 40 每个TaskTracker工作的线程数,用于将Map输出到Reduce这是集群范围的设置,不能有单个作业来设置

Reduce端的调优属性
mapred.reduce.parallel.copies int 5 每个Reduce并行下载Map结果的最大线程数
mapred.reduce.copy.backoff int 300 Reduce下载线程最大等待时间(in sec)
io.sort.factor int 10 同上
mapred.job.shuffle.input.buffer.percent float 0.7 用来缓存Shuffle数据的reduce task heap百分比
mapred.job.shuffle.merge.percent float 0.66 缓存的内存中多少百分比后开始做merge操作
mapred.job.reduce.input.buffer.percent float 0.0 sort完成后Reduce计算阶段用来缓存数据的百分比

Shuffle调优的总原则就是给Shuffle过程尽量多地提供内存空间,然后有一个平衡的问题,要确保map函数和reduce函数能够得到足够的内存来运行
运行Map任务和Reduce任务的JVM,其内存大小由参数mapred.child.java.opts来设置,任务节点上面的内存大小应尽量大

任务的执行##

推测执行
对于相同的输入数据,我们可以并行多次处理以利用不同的机器的负载能力
因为作业中大多数的任务都已经完成了,Hadoop平台会在几个空闲的节点上调度执行剩余任务的复制
当任务完成时,它会向JobTracker通告,任何一个首先完成的复制任务将成为权威复制,如果其他复制任务还在推测性执行,Hadoop会告诉TaskTracker去终止这些任务并丢弃它们的输出,接着Reduce会从首先完成的Mapper那里获取输入数据
推测性执行默认是启用的,设置JobConf中的mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution为false,用来禁止map和Reduce的推测性执行

>**任务JVM重用**
                      mapred.job.reuse.jvm.num.tasks的默认值为1,即每一个Task都新启动一个JVM来运行,而当值为-1时,表示JVM可以无限制重用
                      当值为-1时,TaskTracker也是先判断当前节点是否有空闲的slot剩余,如果没有空闲的slot槽位,才会判断当前分配的slot槽位中的JVM是否已经将当前的Task任务运行完,如果Task已经运行完,才会复用当前JVM(当前只针对同一个Job的Task才会进入JVM的复用)
            
 >**跳过坏的记录**
                      数据的一些记录不符合规范,处理时抛出异常,MapReduce可以将这次记录标为坏记录,重启任务时会跳过该记录
                      默认情况下该属性是关闭的,通过mapred.map.max.attemps和mapred.reduce.max.attemps两个参数进行设置

作业调度器

Hadoop作业调度器采用的是插件机制,即作业调度器是动态加载的 、可插拔的、同时第三方可以开发自己的作业调度器替代Hadoop默认的调度器。目前,Hadoop作业调度器主要有以下三个:
1.先进先出调度器(FIFO Scheduler)
默认的调度器,所有用户的作业都被提交到一个队列中,然后由JobTracker先按照作业的优先级高低,再按照作业提交时间的先后顺序选择将被执行的作业
缺点:忽略了不同作业的需求差异
2.容量调度器(Capacity Scheduler)
容量调度器的每个队列中采用的调度策略是FIFO算法
容量调度器默认情况下不支持优先级,但是可以在配置文件中开启此选项 ,如果支持优先级,调度算法就是带有优先级的FIFO
容量调度器不支持优先级抢占,一旦一个作业开始执行,在执行完成之前它的资源不会被高优先级作业所抢占
容量调度器对队列中同一用户提交的作业能够获得的资源百分比进行限制,以避免同属于一个用户的作业独占资源的情况
3.公平调度器(Fair Scheduler)
公平调度器的设计思想是,尽可能保证所有的作业都能够获得等量的资源份额。
系统中只有一个作业执行时,它将独占集群所有的资源,有其他作业被提交时就会有TaskTracker被释放并分配给新提交的作业,以保证所有的作业都能够获得大体相同的计算资源
最低保障资源份额机制?
用户提交的作业将会放进一个能够公平共享资源的池中,每个作业池设定了一个最低资源保障,当一个池中包含Job时,它至少可以获得minimum share的资源
默认情况下,每个作业池中选择将要执行作业的策略是FIFO策略,先按照优先级高低排序,然后按照提交时间排序
默认情况下,公平调度器会为每个用户建立一个单独的pool,所有的用户能够获得等量的资源份额而无论提交了多少作业,而每个pool中,各个作业将平分分配所在池的资源

    原文作者:Bloo_m
    原文地址: https://www.jianshu.com/p/065879992fb5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞