一、实时计算的痛点二、Saber的平台演进三、结合AI的案例实践四、未来的发展与思考
各个业务部门进行业务研发时都有实时计算的需求。早期,在没有平台体系做支撑时开发工作难度较大,由于不同业务部门的语言种类和体系不同,导致管理和维护非常困难。其次,bilibili有很多关于用户增长、渠道投放的分析等BI分析任务。而且还需要对实时数仓的实时数据进行清洗。此外,bilibili作为一个内容导向的视频网站,AI推荐场景下的实时计算需求也比较强烈。
为解决上述问题,bilibili希望根据以下三点要求构建基于ApacheFlink的流式计算平台。
涵盖场景:bilibili流式计算平台主要涵盖四个方面的场景。
实时平台由实时传输和实时计算两部分组成,平台底层统一管理元数据、血缘、权限以及作业运维等。实时传输主要负责将数据传入到大数据体系中。实时计算基于BSQL提供各种应用场景支持。
如下图所示,实时传输有APP日志、数据库Binlog、服务端日志或系统日志。bilibili内部的Lancer系统解决数据落地到Kafka或HDFS。计算体系主要围绕Saber构建一套BSQL,底层基于YARN进行调度管理。
上层核心基于Flink构建运行池。再向上一层满足多种维表场景,包括MySQL、Redis、HBase。状态(State)部分在RocksDB基础上,还扩展了MapDB、Redis。Flink需要IO密集是很麻烦的问题,因为Flink的资源调度体系内有内存和CPU,但IO单位未做统一管理。当某一个作业对IO有强烈的需求时,需要分配很多以CPU或内存为单位的资源,且未必能够很好的满足IO的扩展。所以本质上bilibili现阶段是将IO密集的资源的State转移到Redis上做缓解。数据经过BSQL计算完成之后传输到实时数仓,如Kafka、HBase、ES或MySQL、TiDB。最终到AI或BI、报表以及日志中心。
(1)开发架构图:如下图左侧所示。最上层是Saber-Streamer,主要进行作业提交以及API管理。下一层是BSQL层,主要进行SQL的扩展和解析,包括自定义算子和个性算子。再下层是运行时态,下面是引擎层。运行时态主要管理引擎层作业的上下层。bilibili早期使用的引擎是SparkStreaming,后期扩展了Flink,在开发架构中预留了一部分引擎层的扩展。最下层是状态存储层,右侧为指标监控模块。
在上述抽象过程中规范语义化标准。即最后输入、输出给定规范标准,底层通过Json表达方式提交作业。在没有界面的情况下,也可以直接通过Json方式拉起作业。
构建一套基于Saber-BSQL、Flink引擎的数据计算Pipeline,极大简化Instance流的构建。其核心需要解决以下三个问题:StreamingJoinStreaming(流式SJoin),StreamingJoinTable(维表DJoin),Real-timeFeature(实时特征)。
进行SQL语义扩展主要有两个关键点。SQL语义的定义顶层通过Calcite扩展JoinType。首先将SQL展开成SQL树。SQL树的一个节点为left(global)$timewindowand$timedelayjoin。抽取出该子树,自定义逻辑转换规则。在此定义了StreamingJoinRute,将该子树转换为新的节点。通过Flink提供的异步IO能力,将异步子树转换为StreamingTable,并将其注册到Flink环境中。通过以上过程支持SQL表达。
另外,维表性能要求很高。因为AI场景会进行很多实验,例如某一个特征比较好,就会开很多模型、调整不同参数进行实验。单作业下实验组越多,QPS越高,RT要求越高。不同维表存储介质有差异,对稳定性有显著影响。调研中有两种场景。当量比较小,可以使用Redis存储,稳定性较好。当量很大,使用Redis成本高,但HBaseCP架构无法保证稳定性。
下图为HBase双集群架构。右侧是离线,以天为单位,通过调度框架拉起一个DAG进行计算。DAG的输出经过两层串行的HBase的Sink,串行可以保证数据先写完A再写B。运行时态中通过Flink、AsyncIO方式,通过两层HystrixClient。第一层HystrixClient主要对第二层HystrixClientHBase的RT通信质量进行收集,根据RT通信质量将流量动态分发到两套HBase集群中。在A集群稳定性很好时,流量都在A集群跑。当A集群出现抖动,会根据失败率动态切换一定配比流量到B集群。
整个体系解决了AI模型训练预生成数据给模型的Pipeline。展现和点击通过BSQL方案实现Joiner。实时特征数据通过BSQL进行计算,离线数据通过离线调度解决。维表的Join会通过BSQL构成Pipeline,从而给机器学习团队Instances流,训练模型,产出模型。
越来越多人使用平台时,基础运维是最为关键的。Saber平台将会完善SQLIDE开发,如提供更丰富的版本管理、上下线、任务调试、资源管理、基础操作等。同时将丰富化作业运维。包括SLA、上线审批、优先级、各类系统监控指标、用户自定义指标告警、作业OP操作等。
Saber应用能力将会向AI方向不断演进。例如模型训练的工程化方面,将引入实验维度概念,通过实验拉起SQLPipeline。同时将为做模型训练的同学统一流、批SQL复用。并且进行模型实验效果、评估、预警等。实时特征的工程化方面,将会支持多特征复合计算,涵盖特征计算、存储、查询等多个场景。