3. JobTracker作业内存使用控制
3.1 JobTracker控制task内存使用方法
JobTracker:如果: mapred.job.map.memory.mb > mapred.cluster.max.map.memory.mb,则直接跑出异常,告诉client提交作业的内存不合法
3.2 JobTracker上相关类方法
initializeTaskMemoryRelatedConfig:初始化内存相关的配置变量
checkMemoryRequirements:判断某个作业内存使用量是否超出限制
4. Capacity Scheduler
Capacity Scheduler较其他Hadoop Scheduler,如FIFO或者Fair Scheduler,最大的好处之一是可以根据作业的内存需求量进行调度。核心思想是:用户提交作业时,指定作业的每个task预期使用内存量,然后根据该内存量计算出对应的slot数,这当该作业的某个task在某个TaskTracker执行时,一次性占用多个slot。
该调度器解决了Hadoop本身设计的一个缺陷,即:作业调度完全按照slot数来,如果有20个slot,则会同时有20个task执行。一般而言,slot对应CPU数,也就是说,调度器完全按照cpu资源调度,并没有考虑到内存,网络IO等资源。
5. 相关的Hadoop patch
Hadoop与task内存等资源控制相关的patch有三个:
(1) MAPREDUCE-1218:TaskTracker通过Heartbeat向jobtracker汇报自己可用的内存和cpu使用率。
(2) MAPREDUCE-220:TaskTracker收集自身每个task的内存和cpu使用量,并通过hearteat汇报给JobTracker
(3) MAPREDUCE-2037:TaskTracker收集自身的内存和cpu负载,并通过HeatBeat告诉JobTracker
另外,其他资源的收集,如网络IO和磁盘IO的收集的必要性和可行性,见:https://issues.apache.org/jira/browse/MAPREDUCE-220。