mapreduce的调度算法和job调优
调度算法: mapreduce当有很多的作业在执行的时候,是按照什么顺序去执行的?
调度算法顺序需要关注:
1.提高作业的吞吐量.
2.要考虑优先级.
三种调度器:如果作业跑不完,并且机器资源利用率比较低,这时候就可以考虑这些东西
1.FifoScheduler,默认的调度算法,先进先出的方式处理应用,只有一个队列可提交应用,没有应用优先级可以配置.
2.CapacityScheduler,容量调度器.多队列的,依靠作业,如果需求资源少了,优先级就会高一些,需求资源多了,优先级就会低一些.
3.FairScheduler:公平调度器,多队列的,多用户共享资源.程序在运行的时候可以在客户端设置优先级,也可以设置抢占.
最简单的使用方法:
1.配置FairScheduler:
修改配置文件mapred-site.xml,然后重启集群即可
更多配置在:conf/fair-scheduler.xml
<property>
<name>mapred.jobtracker.tasktracker</name>
<!-- <value>org.apache.hadoop.mapred.JobQueueTaskScheduler</value> -->
<value>org.apache.hadoop.mapred.FairSchedler</value>
</property>
2.配置CapacityScheduler:
修改配置文件mapred-site.xml,容量调度器是多队列的,需要指定的,有一个默认的,default
更多配置在:conf/capacity-scheduler.xml
<property>
<name>mapred.jobtracker.tasktracker</name>
<value>org.apache.hadoop.mapred.CapacityTaskScheduler</value>
</property>
<property>
<name>mapred.queue.names</name>
<value>default</value>
</property>
mapredece的job进行调优: 关注配置文件mapred-default.xml,作业的调优跟具体的环境有关
从两个方面考虑,一个是map阶段,一个是reduce阶段
一个文件起一个map任务,如果存在大量的小数据,会有大量的任务运行,会造成资源的浪费,可以使用SequenceFile.我们的map任务和reduce任务本身都是java进程,我们在启动map任务和reduce任务的话,实际是在启用java进程,就会耗费大量的资源.将大量的小文件交给一个map来处理,可以自定义CombineFileInputFormat.
小文本合成一个大文件来运行效率其实是不相当的,五个不同机器上的小文件用一个map来处理,势必产生网络的传输.这时候也会占用很多的时间,但是这个相比每一个文件占用一个map来说处理时间要少一些.最好的办法就是不要在hdfs中放大量的小文件.
推测执行:作业的运行的时候,如果有的比较慢,程序就会担心那个任务是不是比较慢,会影响整个作业的运行呀,那么再起一个相同任务去运行.也就是说对于同一份数据源有两个任务同时在运行,谁先结束就使用谁的,谁先结束就是用谁的,没有结束的杀死.
推测执行在整个集群上应该要关闭,特定需要的作业单独开启,一般可以省下5%-10%的集群资源.
mapred.map.task.speculative.execution=true;
mapred.reduce.task.speculative.execution=false ;
资源不紧张的时候可以开启.
开启JVM重用:
开启进程就等于新开一个jvm,为了节省资源,开启虚拟机的重用,可以不用关闭虚拟机,在这里边再起map,再起reduce就可以了,这叫开启jvm的重用.
mapred.job.resue.jvm.tasks=-1;
增加InputSplit的大小:
mapred.min.split.size=268435456
因为一个InputSplit代表一个map任务,InputSplit的数量少了,那么map任务就少了,执行占用的资源就少了,如果把InputSplit增大之后,一个map处理的资源也会多.InputSplit数量少了,但是map执行的数据多了.我们的map任务执行的InputSplit的话,意味着我们的map的任务已经开启了进程,初始化已经完成了,省下的就是重用这个进程,增大InputSplit之后,数据量就会加大,那么这个时候,一个map可以处理更多的数据,吞吐量就上来了.
增大map输出的缓存.
io.sort.mb=300
map会产生输出,输出会送给reduce,reduce再把map任务的输出拿走之前,map要在内存中存放,当我们的map在内存中装不下的话,就会放到磁盘,100兆就会装不小.map往磁盘的每一次写都是一次IO的操作.资源的IO也是一个重量级的操作,所以就建议一次多写点东西,map的输出
增加合并spill文件的数量:
spill来自于:map任务的输出会先放到内存中,内存中装不小会先往磁盘上写,内存中装不下往磁盘上写的过程叫做spill,数据量如果很大的话,是需要spill很多次的,在磁盘就会产生这种 很多的小文件,这种很多的小文件,让reduce往这取可不行,那么map端就会把磁盘上的这种小文件合并到一起,合成一个文件.合成的过程就是合并,磁盘的这个操作和往写磁盘是一个道理,这如果说一次合并的多的话,合并的次数就会少,磁盘合并会耗费内存,也是会耗费cpu的,所以前边有map端操作,这还有spill操作,还有合并操作,那么应该把更多资源留给map,而不是留给后边的spill,这些过程又是不可少的,所以就只能使这样的过程占用的资源尽量少,也就是说运行的时间尽量短.一次性输出到磁盘多一些,合并的时候,一次合并多一些.
map端输出压缩,推荐LZO压缩算法:
mapred.compress.,ap.output=true ;
mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;
增大shuffle复制线程数:
mapred.reduce.parallel=15;
map端输出送到reduce端的这个过程叫做shuffle,shuffle的时候是reduce端发起请求,map端通过http复制过去,在复制的时候并发的线程数多了,意味着同时拷贝多份,换句话说就是吞吐量上去了.增加shuffle执行速度,减小shuffle运行的时间.并发量上去了,意味着网络占用磁盘带宽就高了,这种情况下,网络一般是没问题的,因为在内网并发线程数上去了,影响不是太大,所以这个东西是需要提高的.
设置单个节点map,reduce执行数量,默认值是2
把任务是改多了,意味着可以单机并行执行多个任务.会对内存占用增加.
mapred.tasktracker.map.tasks.maxnum=2;
mapred.tasktracker.reduce.tasks.maxnum=2;
mapreduce的调度算法和job调优的更多相关文章
- FIFO调度算法和LRU算法
一.理论 FIFO:先进先出调度算法 LRU:最近最久未使用调度算法 两者都是缓存调度算法,经常用作内存的页面置换算法. 打一个比方,帮助你理解.你有很多的书,比如说10000本.由于你的书实在太多了 ...
- [大牛翻译系列]Hadoop(8)MapReduce 性能调优:性能测量(Measuring)
6.1 测量MapReduce和环境的性能指标 性能调优的基础系统的性能指标和实验数据.依据这些指标和数据,才能找到系统的性能瓶颈.性能指标和实验数据要通过一系列的工具和过程才能得到. 这部分里,将介 ...
- [大牛翻译系列]Hadoop(11)MapReduce 性能调优:诊断一般性能瓶颈
6.2.4 任务一般性能问题 这部分将介绍那些对map和reduce任务都有影响的性能问题. 技术37 作业竞争和调度器限制 即便map任务和reduce任务都进行了调优,但整个作业仍然会因为环境原因 ...
- hadoop MapReduce - 从作业、任务(task)、管理员角度调优
Hadoop为用户作业提供了多种可配置的参数,以允许用户根据作业特点调整这些参数值使作业运行效率达到最优. 一 应用程序编写规范 1.设置Combiner 对于一大批MapReduce ...
- 大数据技术 - MapReduce的Shuffle及调优
本章内容我们学习一下 MapReduce 中的 Shuffle 过程,Shuffle 发生在 map 输出到 reduce 输入的过程,它的中文解释是 “洗牌”,顾名思义该过程涉及数据的重新分配,主要 ...
- MapReduce调优总结与拓展
本文为<hadoop技术内幕:深入解析MapReduce架构设计与实现原理>一书第9章<Hadoop性能调优>的总结. 图1 Hadoop层次结构图 从管理员角度进行调优 1. ...
- MapReduce编程实战之“调试”和"调优"
本篇内容 在上一篇的"初识"环节,我们已经在本地和Hadoop集群中,成功的执行了几个MapReduce程序,对MapReduce编程,已经有了最初的理解. 在本篇文章中,我们对M ...
- [大牛翻译系列]Hadoop(16)MapReduce 性能调优:优化数据序列化
6.4.6 优化数据序列化 如何存储和传输数据对性能有很大的影响.在这部分将介绍数据序列化的最佳实践,从Hadoop中榨出最大的性能. 压缩压缩是Hadoop优化的重要部分.通过压缩可以减少作业输出数 ...
- [大牛翻译系列]Hadoop(15)MapReduce 性能调优:优化MapReduce的用户JAVA代码
6.4.5 优化MapReduce用户JAVA代码 MapReduce执行代码的方式和普通JAVA应用不同.这是由于MapReduce框架为了能够高效地处理海量数据,需要成百万次调用map和reduc ...
随机推荐
- Java发送Http请求
package com.liuyu.test; import java.io.BufferedReader; import java.io.IOException; import java.io.In ...
- hadoop拾遗(二)---- 文件模式
在单个操作中处理一批文件,这是一个常见的要求.举例来说,处理日志的MapReduce作业可能需要分析一个月内包含在大量目录中的日志文件.在一个表达式中使用通配符来匹配多个文件是比较方便的,无需列举第个 ...
- 最受欢迎的5款PHP框架记录,我居然一个不知道。。。
1. CodeIgniter Framework CodeIgniter 是目前使用最广泛的 PHP 框架.CodeIgniter 是一个简单快速的PHP MVC 框架.EllisLab 的工作人员发 ...
- HDU4389:X mod f(x)(数位DP)
Problem Description Here is a function f(x): int f ( int x ) { if ( x == 0 ) return 0; return f ( x ...
- xmlsechema验证
//创建xmlDocument XmlDocument doc = new XmlDocument(); ...
- Android开发之获取状态栏高度、屏幕的宽和高
转自:http://blog.csdn.net/guolin_blog/article/details/16919859 获取状态栏的高度. private static int statusBarH ...
- C++ 中字符串标准输入的学习及实验
声明:下面实验中[]里面表示要输入里面的符号,[]符号本身并未输入 1.cin>> cin使用空白(空格.制表符.回车)来确定字符串的结束位置. cin会将换行符留在输入输出队列中. #i ...
- bzoj1266: [AHOI2006]上学路线route
最短路+最小割 首先如何使最短路变长?就是要每一条最短路都割一条边. 我们求出每个点到点1和点n的距离,就可以知道哪些边在最短路上(一开始没有想到求到0和n的距离,想用floyd,但是n=500,怕超 ...
- 学习PHP C扩展之面向对象开发方式 (转)
PHP OOP面向对象之C语言开发方式 学习PHP C扩展有一段时间了,PHP手册里大部分讲的PHP的函数开发方式,网上找OOP资料比较少,想起上个月测试redis 的时候,下载PHP扩展redis源 ...
- 开发ffmpeg/live555常见问题错误及解决方法
#include <iostream>using namespace std;extern "C" {#include <libavcodec/avcodec.h ...