Flink

从 Spark Streaming 到 Apache Flink

2020-02-20  本文已影响0人  Flink中文社区

摘要:本文由 bilibili 大数据实时平台负责人郑志升分享,基于对 bilibili 实时计算的痛点分析,详细介绍了 bilibili Saber 实时计算平台架构与实践。本次分享主要围绕以下四个方面:

一、实时计算的痛点
二、Saber 的平台演进
三、结合 AI 的案例实践
四、未来的发展与思考

重要:点击「PPT」可下载 Flink Forward Asia 大会全部PPT。

一、实时计算的痛点

1.痛点

各个业务部门进行业务研发时都有实时计算的需求。早期,在没有平台体系做支撑时开发工作难度较大,由于不同业务部门的语言种类和体系不同,导致管理和维护非常困难。其次,bilibili 有很多关于用户增长、渠道投放的分析等 BI 分析任务。而且还需要对实时数仓的实时数据进行清洗。此外,bilibili 作为一个内容导向的视频网站,AI 推荐场景下的实时计算需求也比较强烈。

2.痛点共性

640.jpeg 640-2.jpeg 640-3.jpeg

3.基于 Apache Flink 的流式计算平台

为解决上述问题,bilibili 希望根据以下三点要求构建基于 Apache Flink 的流式计算平台。

640-4.jpeg

涵盖场景:bilibili 流式计算平台主要涵盖四个方面的场景。

640-5.jpeg

二、Saber 的平台演进

1.平台架构

实时平台由实时传输和实时计算两部分组成,平台底层统一管理元数据、血缘、权限以及作业运维等。实时传输主要负责将数据传入到大数据体系中。实时计算基于 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、报表以及日志中心。

640-6.jpeg

2. 开发架构设计

(1)开发架构图:如下图左侧所示。最上层是 Saber-Streamer,主要进行作业提交以及 API 管理。下一层是 BSQL 层,主要进行 SQL 的扩展和解析,包括自定义算子和个性算子。再下层是运行时态,下面是引擎层。运行时态主要管理引擎层作业的上下层。bilibili 早期使用的引擎是 Spark Streaming,后期扩展了 Flink,在开发架构中预留了一部分引擎层的扩展。最下层是状态存储层,右侧为指标监控模块。

(2)平台设计准则:Saber 平台系统设计时团队关注其边界以及规范和准则,有以下四个关键点。第一是对 Streaming workflows 进行抽象。第二是数据规范性,保证 schema 完整。第三是通用的 BSQL 解析层。第四是工程效率。

640-7.jpeg

在上述抽象过程中规范语义化标准。即最后输入、输出给定规范标准,底层通过 Json 表达方式提交作业。在没有界面的情况下,也可以直接通过 Json 方式拉起作业。

640-8.jpeg 640-9.jpeg 640-10.jpeg eb2e01446559af416a93e7e0664a6526.jpg 640-11.jpeg 640-13.jpeg 640-14.jpeg 640-15.jpeg 640-16.jpeg

三、结合 AI 的案例实践

1.AI - 机器学习现状

AI 体系中有 Offline 和 Online 过程。Online(线上训练)根据流量做 A/B 实验,根据不同实验的效果做推荐。同时每个实验需要有相应的模型 push 到线上。AI 的痛点集中在 Offline(离线训练)。Offline 则通过流式方式进行训练。下图是 Offline 流式训练早期情况。用户需要构建流和流的实时 join,从而产出实时 label 流。而流和维表及特征信息的 join 来产出实时 instance 流,但早期相关的工程服务存在着单点问题,服务质量、稳定性带来的维护成本也很高,致使 AI 在早期 Pipeline 的构建下投入非常大。

640-17.jpeg

2.弊端与痛点

3.模型训练的工程化

构建一套基于 Saber-BSQL、Flink 引擎的数据计算 Pipeline,极大简化 Instance 流的构建。其核心需要解决以下三个问题:Streaming Join Streaming(流式 SJoin),Streaming Join Table(维表 DJoin),Real-time Feature(实时特征)。

640-18.jpeg

简单总结其技术痛点,首先,Timer 性能较差,且内存消耗大。第二,Value RocksDB State 在 compact 时会导致流量抖动。类似 HBase,多 level 的 compact 会造成性能抖动和写放大。第三,重启流量过大时,由于 Timer 早期只有内存队列,Window 和 Keystate 恢复周期不可控。从磁盘加载大量数据耗时长,服务 recovery 时间久。

640-19.jpeg 640-20.jpeg 640-21.jpeg 640-22.jpeg 640-23.jpeg

进行 SQL 语义扩展主要有两个关键点。SQL 语义的定义顶层通过 Calcite 扩展 JoinType。首先将 SQL 展开成 SQL 树。SQL 树的一个节点为 left(global)time window andtime delay join。抽取出该子树,自定义逻辑转换规则。在此定义了 StreamingJoinRute,将该子树转换为新的节点。通过 Flink 提供的异步 IO 能力,将异步子树转换为 Streaming Table,并将其注册到 Flink 环境中。通过以上过程支持 SQL 表达。

640-24.jpeg

另外,维表性能要求很高。因为 AI 场景会进行很多实验,例如某一个特征比较好,就会开很多模型、调整不同参数进行实验。单作业下实验组越多,QPS 越高,RT 要求越高。不同维表存储介质有差异,对稳定性有显著影响。调研中有两种场景。当量比较小,可以使用 Redis 存储,稳定性较好。当量很大,使用 Redis 成本高,但 HBase CP 架构无法保证稳定性。

640-25.jpeg 640-26.jpeg 640-27.jpeg

下图为 HBase 双集群架构。右侧是离线,以天为单位,通过调度框架拉起一个 DAG 进行计算。DAG 的输出经过两层串行的 HBase 的 Sink,串行可以保证数据先写完 A 再写 B。运行时态中通过 Flink、AsyncIO 方式,通过两层 HystrixClient。第一层 HystrixClient 主要对第二层 HystrixClient HBase 的 RT 通信质量进行收集,根据 RT 通信质量将流量动态分发到两套 HBase 集群中。在 A 集群稳定性很好时,流量都在 A 集群跑。当 A 集群出现抖动,会根据失败率动态切换一定配比流量到 B 集群。

640-28.jpeg

4.模型训练的实时 Pipeline

整个体系解决了 AI 模型训练预生成数据给模型的 Pipeline。展现和点击通过 BSQL 方案实现 Joiner。实时特征数据通过 BSQL 进行计算,离线数据通过离线调度解决。维表的 Join 会通过 BSQL 构成 Pipeline,从而给机器学习团队 Instances 流,训练模型,产出模型。

640-29.jpeg

四、未来的发展与思考

1.Saber-基础功能完善

越来越多人使用平台时,基础运维是最为关键的。Saber 平台将会完善 SQL IDE 开发,如提供更丰富的版本管理、上下线、任务调试、资源管理、基础操作等。同时将丰富化作业运维。包括 SLA、上线审批、优先级、各类系统监控指标、用户自定义指标告警、作业 OP 操作等。

2.Saber-应用能力提升

Saber 应用能力将会向 AI 方向不断演进。例如模型训练的工程化方面,将引入实验维度概念,通过实验拉起 SQL Pipeline。同时将为做模型训练的同学统一流、批 SQL 复用。并且进行模型实验效果、评估、预警等。实时特征的工程化方面,将会支持多特征复合计算,涵盖特征计算、存储、查询等多个场景。

上一篇下一篇

猜你喜欢

热点阅读