12.4 Facebook Corona
Corona[1]是Facebook于2012年11月开源的下一代MapReduce框架。它的设计目标与YARN类似,在Facebook团队的博文[2]中如此描述Corona的设计目标:
❑更好的可扩展性和集群资源利用率。
❑更小的短作业运行延迟。
❑支持在线版本更新。
❑基于真实资源需求进行任务调度。
与YARN最大的不同是,Corona暂时未考虑对多计算框架的支持,也就是说,Corona的目标限定在MapReduce一种计算框架中(尽管在源代码中将Corona和MapReduce代码分开存放到不同的jar包中,但它们还是耦合在一起的)。
接下来将重点介绍Corona的基本框架和工作原理。
12.4.1 Facebook Corona基本框架
与YARN一样,Corona也采用了master/slave结构。它们的基本思想也是一致的,即将JobTracker拆分成了两个独立的服务:全局的资源管理器ClusterManager和每个应用程序特有的CoronaJobTracker。其中,ClusterManager负责整个系统的资源管理和分配,而CoronaJobTracker则负责单个应用程序的管理。
1.Corona的基本组成结构
(1)ClusterManager(CM)
类似于YARN中的ResourceManager,负责系统资源分配和调度。ClusterManager掌握着各个节点的资源使用情况,并将资源分配给各个应用程序(采用的调度器为Fair Scheduler)。此外,考虑到在新架构中,ClusterManager本身出故障的可能性非常低,它的高可用性通常仅用于在线升级,因此,Corona在ClusterManager高可用性方面设计的非常简单:仅支持人工触发命令将ClusterManager状态信息保存到一个镜像文件中,并在升级结束后将其从该文件中恢复。
(2)CoronaJobTracker(CJT)
类似于YARN中的ApplicationMaster,用于MapReduce应用程序的监控和容错。在Corona中,CoronaJobTracker可以运行在三个模式下。
❑同进程模式:运行在客户端中,该模式能大大降低小作业运行延迟。
❑转发模式:将来自客户端的请求转发给位于远程模式下的CoronaJobTracker。
❑远程模式:运行在某个CoronaTaskTracker上,它最重要的任务是为作业申请资源和监控作业的运行过程,直到它运行结束。
与MRv 1中的JobTracker不同,每个CoronaJobTracker只负责管理一个作业。
(3)CoronaTaskTracker(CTT)
功能类似于YARN中的NodeManager,它的实现重用了MRv 1中TaskTracker的很多代码(实际上,CoronaTaskTracker类继承了MRv 1的TaskTracker类):一方面,它通过心跳将节点资源使用情况汇报给ClusterManager;另一方面,它与CoronaJobTracker通信,以获取待运行的任务和汇报正运行任务的状态。
(4)ProxyJobTracker
ProxyJobTracker是一种离线查看作业运行信息的工具。当一个作业正在运行时,用户可通过CoronaJobTracker提供的Web服务查看作业的当前运行情况;而一旦作业运行完成或者节点处于离线状态时,用户则可通过ProxyJobTracker查看作业的详细运行信息,比如作业的各个任务执行情况、作业Metrics、作业Counter等。
2.Corona的RPC协议与序列化框架
Hadoop Corona是基于Hadoop 0.20版本实现的,所以Hadoop 0.20中的RPC协议在Corona中仍被采用,包括客户端与JobTracker通信协议JobSubmissionProtocol、TaskTracker与JobTracker通信协议InterTrackerProtocol和Task与TaskTracker之间的通信协议TaskUmbilicalProtocol[3]。这几个协议在第4章均有介绍,在此不再赘述。除了在MRv 1中已存在的这些协议,Corona又增加了一些其他协议,如图12-11所示。
❑ClusterManagerService:它是采用Thrift RPC实现的协议,主要用于CoronaJobTracker、CoronaTaskTracker与ClusterManager通信。它定义了CoronaJobTracker申请和释放资源、CoronaTaskTracker汇报心跳等RPC接口。
❑SessionDriverService:该协议也是采用Thrift RPC实现的。ClusterManager通过该协议主动将信息(如新分配的资源、待释放的资源等)推送给CoronaJobTracker(而不是让CoronaJobTracker轮询获取这些信息)以降低延迟。
❑CoronaTaskTrackerProtocol:该协议是采用Hadoop自带的RPC框架实现的。CoronaJobTracker可通过该协议主动将命令(如启动新任务、杀死任务等命令)推送给CoronaTaskTracker以降低延迟(而不是像MRv 1那样,TaskTracker通过心跳周期性拉取JobTracker命令)。
❑InterCoronaJobTrackerProtocol:该协议是采用Hadoop自带的RPC框架实现的,远程模式下的CoronaJobTracker刚启动时,将通过该协议向客户端(父CoronaJobTracker)汇报它所在节点的host和端口号,此后它还会周期性向客户端汇报心跳,以探测父CoronaJobTracker是否活着,一旦发现父CoronaJobTracker失败,则直接退出。
图 12-11 Corona中的RPC协议
[1]源代码见:https://github.com/facebook/hadoop-20/tree/master/src/contrib/corona
[2]Under the Hood:Scheduling MapReduce jobs more efficiently with Corona
[3]在Corona中,Reduce Task可以直接与CoronaJobTracker通信,以获取已经运行完成的Map Task列表,而不必通过CoronaTaskTracker间接获取。