一种基于预调度的任务分配方法
技术领域
本发明属于计算机技术领域,具体涉及一种云计算环境下Hadoop在运行过程中的基于预调度的任务分配方法。
背景技术
Hadoop是由Apache开源组织开发的一个高可靠性和高可扩展性的存储与分布式并行计算平台,最早是作为开源搜索引擎项目Nutch的基础平台而开发的,之后从Nutch项目中独立出来,成为典型的开源云计算平台之一,其核心实现了用于分布式计算的Map Reduce计算框架和用于分布式存储的HDFS(Hadoop Distributed File System)文件系统。
Map Reduce计算框架的实现主要包括两部分:Jobtracker和Task Tracker。Jobtracker作为中心节点对子节点Task Tracker进行任务分配,默认情况下每台计算机包含一个Task Tracker进程。Jobtracker和Task Tracker之间通过心跳方式进行通信。Task Tracker会进入一种循环运行状态,向Jobtracker定期发送心跳报告。Job Tracker根据Task Tracker当前的负载和资源情况,对其分配任务并通过心跳信息返回。每一个Task Tracker都有固定数量的资源(slot),用以执行任务。Task Tracker在接收到Jobtracker中的任务指令后,会将待调度任务加入Task Launcher的待执行任务队列,由Task Launcher按照时间顺序依次执行队列中的任务。
从上述流程可以看出,在现有的Hadoop中,Tasktracker需要周期性的通过心跳向Jobtracker索要任务(task)。在这种模式下,即使Tasktracker上出现了空闲资源(slot)时,依然要等这个周期结束时才能通过心跳通知Jobtracker。最坏情况下Tasktracker甚至可能要等待一个心跳周期。而在hadoop的默认设定中,当集群节点数量不超过300时,心跳默认为3秒。当集群数目超过300时,每增加一百台节点,心跳增加1秒。可见,原hadoop系统的心跳-分配任务的模式对资源的浪费是比较严重的。
发明内容
本发明的目的在于解决由于周期性的心跳通信模式产生的延时,使得子节点上两次心跳间产生的资源无法被及时利用的问题,提出了基于预调度的任务分配方法,通过为子节点预先分配任务以防止其出现资源闲置,从而提高了集群整体的资源利用率和性能。
为达到上述目的,本发明采用的技术方案如下:
1)启动主节点Job Tracker,开始主循环并启动IPC Handler监听和处理子节点的心跳信息;
2)IPC Handler循环判断是否有子节点发来心跳信息,若没有则返回步骤1);
若有心跳信息到来则判断该子节点之前是否执行了预调度任务,若没有执行预调度任务则转步骤3),若执行了预调度任务则查看前次预调度任务是否成功,若失败则记录该失败任务的子节点编号,成功则从预调度任务队列和待调度任务队列删除已完成的任务;
3)判断该子节点的负载是否较轻,若该子节点负载较轻,则为其在待调度任务队列中寻找符合下列条件的预调度任务,即当一个任务满足:
①该任务处于可运行的状态;
②该任务未在此子节点上失败过;
③该任务满足数据本地性;
这三个条件时,选中该任务并将其加入预调度任务列表,Job Tracker将预调度任务和其他待执行任务一起加入心跳信息中,否则,按普通任务指令进行;
否则,返回步骤1);
4)Job Tracker将心跳信息返回子节点。
所述的判断该子节点的负载是否较轻,是根据预先分配任务即其数量占总体任务的比例由用户自行配置,默认是5%,同时在当前尚未运行的任务集合中去掉该任务的信息,将其加入预分配任务列表。
所述的子节点(Task Tracker)端与主节点(Job Tracker)端相关的部件包括以下几个部分:
1)主节点(Job Tracker)端相关的部件为IPC Handler,用于处理子节点的心跳请求和任务预分配流程;
2)子节点(Task Tracker)端的部件为:
①Task Launcher:即任务执行部件,其从待执行任务队列(Task Queue)中取出待执行任务,放入相应的资源槽(slot)中执行该任务;
②Task Pre Scheduler:即预调度线程,负责在满足预调度的条件下,将预先存储在预调度任务队列(Task Pre Schedule Queue)中的任务取出,放入待执行队列,执行预调度。
所述的子节点(Task Tracker)从主节点(Job Tracker)接收到心跳信号后,将其中的任务指令存入待执行任务队列(Task Queue)并通知消费者(Task Launcher)。Task Launcher则按照时间顺序依次执行Task Queue队列中的任务;
如果出现了Task Queue队列为空且此时离下一次心跳周期还有较长时间,系统中又有空闲资源的情况下,会启动预调度线程Task Pre Scheduler,将先前预分配的任务放入Task Queue队列并通知Task Launcher线程开始工作。
所述的子节点Task Tracker接收预分配的任务后按下列步骤进行:
1)Task Tracker启动后开始主循环,同时启动任务的执行线程Task Launcher;
2)Task Tracker的主循环接收到主节点返回的心跳信息,该返回的心跳信息中包含着分配的任务指令,如果心跳信息中包含预调度指令则保存该预调度任务,启动预调度线程Task Pre Scheduler,并对Task Pre Scheduler进行计时,如果超时,将预调度失败结果存入心跳信息后执行步骤5),否则继续执行步骤3);
3)Task Pre Scheduler会持续的判断当前是否满足如下条件:
①Task Launcher的待执行任务池是否为空;
②此时距离下一次心跳开始的时间是否足够长;
③当前是否有空闲资源;
如果条件均满足则Task Pre Scheduler就会将先前保存的预调度任务加入Task Launcher的待执行任务池中并通知Task Launcher开始执行;
否则返回Task Tracker主循环;
4)当该任务完成后,Task Tracker销毁Task Pre Scheduler线程,保存任务的执行结果;
5)Task Tracker通过心跳信息通知Job Tracker,预调度流程结束。
主节点(Job Tracker)接收到子节点(Task Tracker)发出的心跳信息(心跳信息中包含子节点的负载等信息)后,对负载较轻的子节点,预先分配任务(其数量占总体任务的比例可由用户自行配置,默认是5%),同时在当前尚未运行的任务集合中去掉该任务的信息,将其加入预分配任务列表。
子节点(Task Tracker)收到主节点返回的心跳信息(返回的心跳信息中包含着分配的任务指令)后,将其存入任务池,而后为每个预先分配的任务寻找合适的时机进行执行并将结果返回主节点。如果在限定时间内还未执行,则该任务的预调度过程失败,并通过心跳将结果返回主节点。
Job Tracker收到心跳后,如果是已完成预调度,则在预调度任务队列中删除该任务,否则重新寻找适合预调度的节点和任务。
本发明的有益效果是:
针对Hadoop原模型中心跳周期使得两次心跳间资源无法及时利用的问题,通过提前给子节点分配任务,使得子节点在当前任务已经运行完毕时,可以从预分配的任务池中获取任务执行,无需等待下一次心跳到来。这种方法不仅能够提高系统的资源利用率,而且改进了系统的性能。
附图说明
图1是主节点Job Tracker的任务预分配流程图;
图2是预调度流程中,子节点(Task Tracker)端与主节点(Job Tracker)端相关的部件结构图;
图3是子节点Task Tracker接收预分配的任务后的处理流程图;
具体实施方式
下面结合附图对本发明作详细描述。
基于预调度的任务分配策略,其具体实现步骤如下:
图1给出了主节点(Job Tracker)端预调度的流程。
(1)主节点(Job Tracker)启动,开始主循环并启动IPC Handler监听和处理子节点的心跳信息。
2)IPC Handler循环判断是否有子节点发来心跳信息,若没有则返回步骤1);
若有心跳信息到来则判断该子节点之前是否执行了预调度任务,若没有执行预调度任务则转步骤3),若执行了预调度任务则查看前次预调度任务是否成功,若失败则记录该任务失败的子节点编号,成功则从预调度任务队列和待调度任务队列删除该任务;
3)判断该子节点的负载是否较轻,若该子节点负载较轻(根据预先分配任务即其数量占总体任务的比例由用户自行配置,默认是5%,同时在当前尚未运行的任务集合中去掉该任务的信息,将其加入预分配任务列表)则为其在待调度任务队列中寻找符合下列条件的预调度任务,即当一个任务满足:
①该任务处于可运行的状态;
②该任务未在此子节点上失败过;
③该任务满足数据本地性;
这两个条件时,选中该任务并将其加入预调度任务列表,Job Tracker将预调度任务和其他待执行任务一起加入心跳信息中,否则,按普通任务指令进行;
否则,返回步骤1);
4)Job Tracker将心跳信息返回子节点。
图2给出了预调度流程中,子节点(Task Tracker)端与主节点(Job Tracker)端相关的部件结构。主要包括以下几个部分:
(1)主节点(Job Tracker)端相关的部件主要为IPC Handler,用于处理子节点的心跳请求和图1中的任务预分配流程。
(2)子节点(Task Tracker)端的主要部件为:
①Task Launcher:即任务执行部件,其从待执行任务队列(Task Queue)中取出待执行任务,放入相应的资源槽(slot)中执行该任务。
②Task Pre Scheduler:即预调度线程,负责在满足预调度的条件下,将预先存储在预调度任务队列(Task Pre Schedule Queue)中的任务取出,放入待执行队列,执行预调度功能。
原子节点的任务启动的模式是“生产者-消费者”模式。即子节点(Task Tracker)从主节点(Job Tracker)接收到心跳信号后,将其中的任务指令存入待执行任务队列(Task Queue)并通知消费者(Task Launcher)。Task Launcher则按照时间顺序依次执行Task Queue队列中的任务。这里本发明所做的工作是类似增加了一个仓库的功能,用以存储少量备用任务,如果出现了Task Queue队列为空且此时离下一次心跳周期还有较长时间,系统中又有空闲资源的情况下,会启动预调度线程Task Pre Scheduler,将先前预分配的任务放入Task Queue队列并通知Task Launcher线程开始工作。
图3给出了Task Tracker端的预调度流程图,描述如下:
1)Task Tracker启动后开始主循环,同时启动任务的执行线程Task Launcher;
2)Task Tracker的主循环接收到主节点返回的心跳信息,该返回的心跳信息中包含着分配的任务指令,如果心跳信息中包含预调度指令则保存该预调度任务,启动预调度线程Task Pre Scheduler,并对Task Pre Scheduler进行计时,如果超时,将预调度失败结果存入心跳信息后执行步骤5),否则继续执行步骤3);
3)Task Pre Scheduler会持续的判断当前是否满足如下条件:
①Task Launcher的待执行任务池是否为空;
②此时距离下一次心跳开始的时间是否足够长;
③当前是否有空闲资源;
如果条件均满足则Task Pre Scheduler就会将先前保存的预调度任务加入Task Launcher的待执行任务池中并通知Task Launcher开始执行;
否则返回Task Tracker主循环;
4)当该任务完成后,Task Tracker销毁Task Pre Scheduler线程,保存任务的执行结果;
5)Task Tracker通过心跳信息通知Job Tracker,预调度流程结束。