码迷,mamicode.com
首页 > 其他好文 > 详细

Job Service代码重构遐想

时间:2016-01-14 23:51:39      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

最近有大概半个月的时间可以重构下代码,刚好可以重新整理下Job Service相关的代码。前段时间由于忙于完成Job Service所有功能以及完成对Auto Job的支持以正常上线,使得有些地方的代码写得不是特别优雅。主要集中在以下一些地方:

 

DAG状态的转移

目前DAG状态分为3层,分别为ApplicationStatus、TaskStatus、InstanceStatus。每个层次都有以下几种状态,Waiting、Running、Finished、Stopped、Failed。并且DAG有如下几种事件会导致状态转移:TA_RUNNING、TA_FAILED、TA_FINISHED、OP_STOP、OP_START、TK_EXPIRED,除了这些之后可能会增加新的事件。

因此,DAG的状态转移是Job Service模块中比较复杂的。目前的处理方式比较原始,使用大量的switch......case,这样使得代码可维护性特别差。尤其是新增加了对Auto Job的支持,而且Auto Job会根据状态的转移而涉及到一系列对Cluster的操作,包括CreateCluster、DeleteCluster、ResetClusterInstance、KillClusterInstance。这样使得大量涉及Cluster的操作也包括在大量switch......case语句中。使得这块的代码重构迫在眉睫。

目前的想法是使用Yarn的StateMachine + Dispatcher + EventHandler方式重构下DAG状态机。

Auto Cluster生命周期的管理

目前对于Auto Cluster有一个专门的ClusterManager对象去维护。ClusterManager对象会在创建的时候或者有Task Finished的时候,创建所有入度为0并且是Auto Cluster的结点;在有结点终结(包括Stopped、Finished、Failed等状态)的时候会Delete Auto Cluster;根据Instance是重启还是结束选择Reset还是Kill Instance。这样使得Auto Cluster的管理随着DAG状态转移而特别分散,特别难以维护。

对于Auto Cluster生命周期管理,也是使用StateMachine模式。

类关系以及职责的明确

一直感觉目前的类相互间的依赖关系有点混乱,比如:

DAGApplication包含DAGStatus、DAGTokenManager、DAGDescription、ClusterManager等类对象。

DAGStatus依赖DAGDescription,并且Create的时候把DAGDescription作为入参。

DAGTokenManager依赖于DAGDescription、DAGStatus。

ClusterManager依赖DAGDescription、DAGStatus。

这些类之间关系非常复杂,导致出现问题特别难排查。

有点想根据Yarn RMAppImpl以及apache tez中的DAG相关代码把这部分代码重构下,但是目前还没有特别具体的计划。只能先把状态机部分代码重构完再说吧!

Job Service代码重构遐想

标签:

原文地址:http://www.cnblogs.com/bitCoin/p/5131937.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!