0.20.2 作业内存控制策略分析(2)

2. TaskTracker作业内存使用控制

2.1 TaskTracker控制task内存使用方法

TaskTracker从单个task内存使用量和所有task整体内存使用量上进行内存控制。

(1) 单个task控制

满足两个两个条件之一时,则任务该task超过了内存相知,直接杀死:

[1] 某个时刻满足:currentMemUsage > (2*mapred.cluster.max.map.memory.mb),这个条件主要是考虑到调用fork()瞬间,内存会变为父进程的两倍。

或者

[2] 相邻时间间隔内(默认是5s)两次检测到内存使用量超过mapred.cluster.max.map.memory.mb

(2) 总体控制

除了从单个task上控制内存使用,还是总体上控制。TaskTracker会周期性计算当前正在运行的task所占用的总内存数,如果超过可用内存总数,则选择适当task杀掉,直到内存使用量降到安全线以下。

[1] 定义两个变量

maxMemoryAllowedForAllTasks:为该TaskTracker所有可用内存

maxMemoryAllowedForAllTasks = maxCurrentMapTasks * mapSlotMemorySizeOnTT + maxCurrentReduceTasks * reduceSlotSizeMemoryOnTT;

memoryStillInUsage:该TaskTracker上正在运行的task占有的内存总量

[2] 变量解释

maxCurrentMapTasks为该TaskTracker上配置的map slot个数(由mapred.tasktracker.map.tasks.maximum指定),maxCurrentReduceTasks类似。

mapSlotMemorySizeOnTT即为mapred.cluster.map.memory.mb,reduceSlotSizeMemoryOnTT类似

[3] 判断标准

如果memoryStillInUsage > maxMemoryAllowedForAllTasks,则选择task杀掉,选择策略是:总是选择最近启动的task,将其杀掉,直到memoryStillInUsage <= maxMemoryAllowedForAllTasks

2.2 TaskTracker上相关类

(1) TaskMemoryManagerThread:后台线程,管理某个TaskTracker上所有task内存使用情况,如果有task超出内存使用,则将其杀掉。位于TaskMemoryManagerThread.java中

(2) ProcfsBasedProcessTree:从linux虚拟文件系统/proc/中获取ProcessTree,主要是进程之间的树关系。 位于ProcfsBasedProcessTree.java中,且该类仅适用于linux操作系统。

(3) LinuxMemoryCalculatorPlugin:计算TaskTracker上资源使用情况,包括进程所用内存,cpu资源量,cpu数目等。位于LinuxMemoryCalculatorPlugin.java中,且该类仅适用于linux操作系统。

(4) TaskTracker:启动TaskMemoryManagerThread线程,并把LinuxMemoryCalculatorPlugin计算得到的资源情况通过HeartBeat发送给JobTracker。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/619ca1ab991261d77b599b79539758bf.html