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。