12.4.2 Facebook Corona工作流程

本小节介绍Hadoop Corona的工作流程。与YARN类似,当用户提交一个作业后,Hadoop Corona分两个阶段运行该作业。

第一个阶段是作业提交,实际上就是启动CoronaJobTracker的过程。根据作业大小不同,Corona JobTracker采用不同的启动模式。如果一个作业的Map Task数目小于一定阈值,CoronaJobTracker将直接启动在客户端中,这被称为本地启动模式,如图12-12所示。很显然,该模式可大大降低小作业运行延迟。另外一种是远程启动模式。在该模式下,客户端首先为CoronaJobTracker(向ClusterManager)申请资源,然后在某个CoronaTaskTracker上启动CoronaJobTracker。这种模式将带来一定的运行延迟,本小节将重点介绍该启动模式。

12.4.2 Facebook Corona工作流程 - 图1

图 12-12 Corona中的本地启动模式

第二个阶段是资源申请与任务启动。在该阶段中,CoronaJobTracker不断向ClusterManager申请资源,要求CoronaTaskTracker启动任务,并监控任务的运行过程,直到所有任务运行完成。

接下来,我们重点介绍大作业(Map Task数目大于一定阈值)的提交和运行过程。

1.作业提交

作业提交过程实际上就是启动CoronaJobTracker的过程。为了与MRv 1兼容,Hadoop Corona仍由JobClient提交作业,但里面的代码已修改过。JobClient可选择将作业提交到MRv 1的JobTracker上还是Corona中。如果提交到JobTracker上,则作业运行在MRv 1中;否则,JobClient内部会创建一个CoronaJobTracker对象,然后由CoronaJobTracker(运行在转发模式下)负责提交作业。之后过程如图12-13所示,大致可分别以下几个步骤:

步骤1 CoronaJobTracker内部创建代理对象RemoteJTProxy,由它与ClusterManager和CoronaTaskTracker通信,为CoronaJobTracker(运行在远程模式下)申请资源并启动它。

步骤2 RemoteJTProxy收到启动CoronaJobTracker的请求后,首先需向ClusterManager申请资源。

步骤3 ClusterManager中的资源调度器为CoronaJobTracker分配对应的资源量,并返回给RemoteJTProxy。

步骤4 RemoteJTProxy根据收到的资源描述信息(包括资源所在节点,资源量等信息),与对应的CoronaTaskTracker通信,要求它启动CoronaJobTracker。

步骤5 CoronaTaskTracker成功启动CoronaJobTracker后,告诉RemoteJTProxy,然后再由RemoteJTProxy告诉客户端。

步骤6 客户端得知CoronaJobTracker启动成功后,向RemoteJTProxy提交作业,然后由RemoteJTProxy进一步将作业提交到刚刚启动的CoronaJobTracker上。

至此,一个作业正式提交成功。

12.4.2 Facebook Corona工作流程 - 图2

图 12-13 CoronaJobTracker启动过程

需要注意的是,整个过程涉及两个CoronaJobTracker:第一个运行在转发模式下,负责提交作业和转发客户端的各种请求;第二个运行在远程模式下,负责申请资源和监控作业运行状态。

2.资源申请与任务启动

CoronaJobTracker负责为作业申请资源,并与CoronaTaskTracker通信,要求它运行Task。总之,CoronaJobTracker功能如下。

❑向ClusterManager申请资源。

❑释放资源与资源重用:ClusterManager中的调度器支持资源抢占,可随时命令某个CoronaJobTracker释放资源,另外,CoronaJobTracker可根据需要,自行决定资源是不是重用,即某个任务运行完后,可不必归还给ClusterManager,而是继续分配给其他任务。

❑与CoronaTaskTracker通信,以启动新任务。

❑任务推测执行,可参考6.6节中的具体介绍。

❑任务容错:当任务执行失败后,向ClusterManager重新申请资源,以重新运行该任务。

资源申请与任务启动过程如图12-14所示,主要步骤如下:

步骤1 CoronaJobTracker向ClusterManager发送资源请求。

步骤2 当某个CoronaTaskTracker出现空闲资源后,ClusterManager根据调度策略决定将该资源分配给哪些作业,并将资源描述发送给对应的CoronaJobTracker。

步骤3 CoronaJobTracker收到新分配的资源后,与对应的CoronaTaskTracker通信,要求它启动任务。

CoronaJobTracker会重复以上三个步骤,直到所有任务运行完成。此时,CoronaJobTracker通知ClusterManager释放所占用的资源,并退出。至此,一个作业运行完成。

12.4.2 Facebook Corona工作流程 - 图3

图 12-14 CoronaJobTracker资源申请与任务启动过程