百度垂类离线计算系统发展历程( 四 )

  • 编排能力:将原来业务手动编排的函数能力扩展成为需求声明式自动编排的能力 。
  • 服务处理:极致高效的服务处理能力,支持多种不同业务开发者的高效开发效率,将整体的计算从行计算转向列计算,提高整体的计算复用 。
  • 控制能力:将原来自动伸缩的能力扩展成为智能控制能力,做到问题的自动识别、自动分发、自动分析 和 自动处理 。
  • 整体架构的设计核心理念大致是多层抽象、分层复用 。
    3.4.3 核心设计
    当前阶段的核心设计已经呈现出完整的四层架构的抽象能力:
    百度垂类离线计算系统发展历程

    文章插图
    应用层:业务直接可见的相关服务,包括业务从开始数据接入到服务运行的全周期各阶段各种应用 。
    逻辑层:也可以称之为编排层,负责将原始的业务需求表达转化成为线上真实运行的服务,业务通过Codeless 平台化选择勾选自己的功能集合,以及对应数据映射关系进行提交,将用户提供的功能 & 数据的绑定关系转化为业务的自定义的功能 以及映射关系 。
    服务层:计算系统的核心,业务实际计算运行在这层,主要包含计算引擎 和服务架构两部分 。向上承接逻辑层的编排结果运行服务,向下提供基础信号作为控制层的输入 。
    控制层:包含智能调度和智能控制两部分:智能控制主要是通过自动接受业务指标数据进行智能控制保证服务稳定,而智能调度是除了根据数据流量进行进行自动伸缩以外还可以根据业务服务关系进行流量复用,减少业务的重复计算 。
    下面我们针对部分核心系统(如上图蓝色部分)的设计作展开说明 。
    需求表达逻辑
    百度垂类离线计算系统发展历程

    文章插图
    需求逻辑的表达的核心就是如何把用户原始的功能需求转化成真是线上服务的算子、配置、关系的表达 。用户最原始的输入包含两部分:
    业务数据:业务数据需要功能的最小单位进行切割,后续算子进行配置转化以及服务绑定的列式计算 。这里说的有点绕口,其实本质上就是把业务数据的原始Proto或者数据Schema注册一下就可以 。
    功能集合:功能集合既可以用户直接使用的系统提供的默认模版的功能集合 也可以是用户通过平台自定义的集合,值的注意的是每个功能都都有其指定的传入参数,比如图片计算,需要传入图片URL,向量计算需要传入原始数据 & 向量参数等等 。功能完成后也会有对应的输出结果业务可以指定 。
    获取完成用户的原始输入后,架构通过两层逻辑映射的方式,将原始用户需求转化成为线上服务部署信息:
    需求表达服务:用户的原始需求转化为功能模版的组合 。这个阶段会根据用户配置,将原始算子和数据进行绑定,原始用户抽象的需求实例化成带数据的算子集合 。
    需求编排服务:通过业务算子的本身的依赖关系和数据依赖的血缘关系进行表达组合,将带数据的算子构建出N个有向无环图 。
    整体需求表达都可以通过Codeless方式表达,通过描述功能集合??数据集合描述方式,加之两层逻辑映射的转化,这样就可以将原始用户声明式需求直接转化线上服务关系和系统配置,并且服务的算子的拓扑关系完全可以通过业务的数据关系表达自动化推导出来,实现了95%以上的功能可以完全自动化配置实现,当然有个别服务无法低成本转化表达的,也提供了人工接口 。
    计算引擎实现
    计算引擎层的核心组件大致分成两部分,图计算引擎 & 多语言算子的执行引擎。
    百度垂类离线计算系统发展历程

    文章插图
    图计算引擎:主要控制的业务拓扑的表达关系,通过有向无环图来表达 。
    算子执行引擎:主要控制业务真实业务函数的执行,不同语言有不同的函数实现,例如Python、GoLang、C/C++都有自己的执行引擎 。
    下面针对两部分进行仔细说明
    线程管理:每个业务算子默认都是多线程的分发模式(如果业务算子只支持单线程,可以把线程数设置成1) 。
    分发模式:数据消费分发模式默认是轮询分发,固定KEY分发(实现保序)以及按消费能力分发 。
    数据压缩:这个默认支持常见数据压缩方法,是可选的吞吐优化手段,支持LZ4、Gzip、Snappy等常见压缩算法 。
    百度垂类离线计算系统发展历程

    文章插图