LabelManager 架构

LabelManager是Linkis中对上层应用提供标签服务的功能模组,运用标签技术管理集群资源分配、服务节点选举、用户权限匹配以及网关路由转发;包含支持各种自定义Label标签的泛化解析处理工具,以及通用的标签匹配评分器。

整体架构示意图

  • LabelBuilder: 承担着标签解析的工作,从输入的标签类型、关键字或者字符数值中解析得到具体的标签实体,有默认的泛化实现类也可做自定义扩展。
  • LabelEntities: 指代标签实体集合,有且包含集群标签,配置标签,引擎标签,节点标签,路由标签,搜索标签等。
  • NodeLabelService: 实例/节点与标签的关联服务接口类,定义对两者关联关系的增删改查以及根据标签匹配实例/节点的接口方法。
  • UserLabelService: 声明用户与标签的关联操作。
  • ResourceLabelService: 声明集群资源与标签的关联操作,涉及到对组合标签的资源管理,清理或设置标签关联的资源数值。
  • NodeLabelScorer: 节点标签评分器,对应不同的标签匹配算法的实现,使用评分表示节点的标签匹配度。

以泛化标签解析类GenericLabelBuilder为例,阐明整体流程:
泛化标签解析流程
标签解析/构建的流程概括包含几步:

  1. 根据输入选择要构建解析的合适标签类。
  2. 根据标签类的定义信息,递归解析泛型结构,得到具体的标签值类型。
  3. 转化输入值对象到标签值类型,运用隐式转化或正反解析框架。
  4. 根据1-3的返回,实例化标签,并根据不同的标签类进行一些后置操作。

为了根据Linkis用户执行请求中附带的标签列表挑选合适的引擎节点,需要对符合的引擎列表做择优,量化为引擎节点的标签匹配度即评分。
在标签定义里,每个标签都有feature特征值,分别为CORE,SUITABLE,PRIORITIZED,OPTIONAL,每个特征值都有一个boost值,相当于权重和激励值, 同时有些特征例CORE和SUITABLE为必须唯一特征即在匹配过程中需做强过滤,且一个节点只能分别关联一个CORE/SUITABLE标签。
根据现有标签,节点,请求附带标签三者之间的关系,可以绘制出如下示意图:
标签打分

自带的默认评分逻辑过程应大体包含以下几点步骤:

  1. 方法的输入应该为两组网络关系列表,分别是Label -> NodeNode -> Label, 其中Node -> Label关系里的Node节点必须具有请求里涉及到所有CORE以及SUITABLE特征的标签,这些节点也称为备选节点。
  2. 第一步遍历计算Node -> Label关系列表,遍历每个节点关联的标签Label,这一步先给标签打分,如果标签不是请求中附带的标签,打分为0, 否则打分为: (基本分/该标签对应特征值在请求中的出现次数) * 对应特征值的激励值,其中基本分默认为1,节点的初始分为相关联的标签打分的总和;其中因为CORE/SUITABLE类型标签为必须唯一标签,出现次数恒定为1。
  3. 得到节点的初始分后,第二步遍历计算Label -> Node关系,由于第一步中忽略了非请求附带标签对评分的作用,但无关标签比重确实会对评分造成影响,对应这类的标签统一打上UNKNOWN的特征,同样该特征也有相对应的激励值; 我们设定无关标签关联的备选节点占总关联节点的比重越高,对评分的影响越显著,以此可以对第一步得出的节点初始分做进一步累加。
  4. 对得到的备选节点的分数做标准差归一化,并排序。