Hadoop Job Scheduler 作业调度器
作业的调度器
Hadoop Job Scheduler 作业调度器,常见的有三种:
默认调度算法FIFO 队列策略
计算能力调度算法Capacity Scheduler(Yahoo 开发)(容量调度器)
公平份额调度算法Fair Scheduler(Facebook开发)
作业的调度
调度器:
默认调度算法
·所有用户的作业都被提交到一个队列中,然后由JobTracker先按照作业的优先级高低,再按照作业提交时间的先后顺序选择将被执行的作业。
·优点:调度算法简单,JobTracker工作负担轻。·缺点:忽略了不同作业的需求差异。例如如果类似对海量数据进行统计分析的作业长期占据计算资源,那么在其后提交的交互型作业有可能迟迟得不到处理,从而影响到用户的体验。
FIFO(first in first out)(早期版本使用)
·Capacity Scheduler能有效地对hadoop集群的内存资源进行管理,以支持内存密集型应用。 作业对内存资源需求高时,调度算法将把该作业的相关任务分配到内存资源充足的task tracker上。 ·在作业选择过程中,Capacity Scheduler会检查空闲task tracker上的内存资源是否满足作业要求。task tracker上的空闲资源(内存)数量值可以通过task tracker的内存资源总量减去当前已经使用的内存数量得到,而后者包含在task tracker向job tracker发送的周期性心跳信息中。 ·关于内存调度的相关参数可以通过配置文件来设置。
按照作业提交的顺序,使用FIFO(先进先出)调度算法来运算作业.
典型情况下,每个作业都会使用整个集群,因此作业必须等待,知道轮到自己运行.
随后,假如设置作业优先级的功能,可以通过设置mapred.job.priority属性或者
JobClient的setJobPriority()方法来设置优先级.(very_high,high,normal,low,very_low)
然而,在FIFO算法中,优先级并不支持抢占,所以高优先级的作业仍然会被那些低优先级的作业所阻塞.
在hadoopk中,MapReduce的调度器可以选择,默认的调度器是原始的基于队列的FIFO调度器,
还得有两个多用户调度器(Fair[公平] Scheduler和Capacity[能力,地位资格] Scheduler)
Fair Scheduler
Fair Scheduler调度中,只有一个作业执行时,它将独占集群所有资源。有其他作业被提交时就会有TaskTracker被释放并分配给新提交的作业,以保证所有的作业都能够获得大体相同的计算资源。
·作业池
·用户提交的作业将会放进一个能够公平共享资源的pool(池)中。
·每个作业池设定了一个最低资源保障(a guaranteed minimum share),当一个池中包含job时,它至少可以获得minimum share的资源——最低保障资源份额机制。
·池中的作业获得一定份额的资源。
·可以通过配置文件限制每个池中的作业数量。
·缺省情况下,每个作业池中选择将要执行的作业的策略是FIFO策略,先按照优先级高低排序,然后再按照提交时间排序。
作业和作业池的权值weight
·缺省情况下,Fair Scheduler会为每一个用户建立一个单独的pool。所有用户能够获得等量的资源份额而无论他提交了多少作业,而每个pool中,各个作业将平分分配给所在池的资源。
·实际应用中,无论是作业池还是作业,都被赋予一定的权值,并以此为依据获得相应比例的资源。这种情况下,作业池和作业在资源分配时不是严格的平均分配,但这有利于根据作业的重要程度及实际需求合理分配资源.
·Deficit(赤字,不足) ·Fair Scheduler为每个作业定义了一个deficit(赤字)指标。 ·Deficit是一个作业在理想情况下的获得的计算资源和实际中获得的计算资源之间的差距。差距越小越好,也减轻task tracker的负担! ·Fair Scheduler会每隔几百毫秒观察每个作业中有多少任务已经在这个时间间隔内执行,并将结果与它应得的资源份额比较,以更新该作业的deficit值。一旦有空闲的task tracker出现,首先分配给当前具有最高deficit值的作业。 ·例外——如果系统中存在着尚未获得最低资源保障的作业池,那么该池中的作业将会优先调度,而选择池中的作业需要根据它们的deficit来决定。这样做是为了尽可能满足作业池最低保障资源份额的机制。
公平调度器的目标是让每个用户公平的共享集群能力.这种方式根据作业的大小,在合理的时间内完成.
作业都被放在作业池中,默认情况,每个用户都有自己的作业池.可以用map和reduce的任务槽来制定
作业池的最小容量,也可以设置每个池的权重. fair支持抢占,所以,如果一个池在特定的一段时间内
未得到公平的资源共享,它会终止运行池中得到过多资源的任务,以便把任务槽让给运行资源不足的池.
公平调度器:
公平调度是一种赋予作业(job)资源的方法,它的目的是让所有的作业随着时间的推移,
都能平均的获取等同的共享资源.
1.公平调度器按资源池 (pool) 来组织作业, 并把资源公平的分到这些资源池里。
2.公平调度器允许赋给资源池保证 (guaranteed) 最小共享资源.
3.公平调度器还可以限制每用户和每资源池的并发运行作业数量。
安装:
fair Scheduler是一个后续模块,要使用它,需要将其jar文件放在hadoop的类路径.
方法一:把fairscheduler.jar拷贝到hadoop_home/lib中
方法二:修改hadoop-env.sh中的hadoop-classpath,加入公平调度器的jar包
最后需要在mapred-site.xml设置下列属性,让hadoop使用公平调度器.
<property>
<name>mapred.jobtracker.taskScheduler</name>
<value>org.apache.hadoop.mapred.FairScheduler</value>
</property>
验证:重启集群后,可以通过JobTracker的web用户界面中的 http://<jobtrackerURL>/scheduler
检查公平调度器是否正在运行, 可以看到一个"job scheduler administration"页面.就OK了.
Capacity Scheduler计算能力调度算法(容量调度器)
·由雅虎提出的作业调度算法
·Capacity Scheduler中可以定义多个作业队列(multiple queues),作业提交时将直接放入到一个队列中,每个队列中采用的调度策略是FIFO算法。
·每个队列都可以通过配置获得一定数量的task tracker资源用于处理map/reduce操作,调度算法将按照配置文件为队列分配相应的计算资源量。·该调度默认情况下不支持优先级,但是可以在配置文件中开启此选项,如果支持优先级,调度算法就是带有优先级的FIFO。·不支持优先级抢占,一旦一个作业开始执行,在执行完之前它的资源不会被高优先级作业所抢占。·对队列中同一用户提交的作业能够获得的资源百分比进行了限制以使同属于一用户的作业不能出现独占资源的情况。
集群由很多队列组成,每个队列有一个分配的能力.在每个队列内部,作业根据FIFO方式(优先级)进行调度.
本质上,Capacity Scheduler允许用户或组织为每个用户或者组织模拟一个独立的使用FIFO的集群.
压缩
文件压缩的好处:
1.可以减少存储文件所需要的磁盘空间.
2.可以加速数据在网络和磁盘上的传输.
压缩格式 工具 算法 文件扩展名 是否包含多文件 是否可切分 java实现 原生实现
DEFLATE N/A DEFLATE .deflate 否 否 是 是
Gzip gzip deflate .gz 否 否 是 是
bzip2 bzip2 bzip2 .bz2 否 是 是 否
LZO Lzop LZO .lzo 否 否 否 是