微博机器学习研发核心数据计算负责人,高级零碎工程师曹富强为大家带来 Flink 实时计算在微博的利用介绍。内容包含:
1、微博介绍
2、数据计算平台介绍
3、Flink 在数据计算平台的典型利用
<p style=”text-align:center”> GitHub 地址
https://github.com/apache/flink
欢送大家给 Flink 点赞送 star~</p>
一、微博介绍
本次给大家带来的分享是 Flink 实时计算在微博的利用。微博是中国当先的社交媒体平台,目前的日沉闷用户是 2.41 亿,月沉闷用户是 5.5 亿,其中移动用户占比超过了 94%。
二、数据计算平台介绍
1. 数据计算平台详情
下图为数据计算平台的架构图。
- 首先是调度,这块基于 K8s 和 Yarn 别离部署了实时数据处理的 Flink、Storm,以及用于离线解决的 SQL 服务。
- 在集群之上,咱们部署了微博的 AI 平台,通过这个平台去对作业、数据、资源、样本等进行治理。
-
在平台之上咱们构建了一些服务,通过服务化的形式去反对各个业务方。
1. 实时计算这边的服务次要包含数据同步、内容去重、多模态内容了解、实时特色生成、实时样本拼接、流式模型训练,这些是跟业务关系比拟严密的服务。另外,还反对 Flink 实时计算和 Storm 实时计算,这些是比拟通用的根底计算框架。
2. 离线这部分,联合 Hive 的 SQL,SparkSQL 构建一个 SQL 计算服务,目前曾经反对了微博外部绝大多数的业务方。 - 数据的输入是采纳数仓、特色工程这些数据中台的组建,对外提供数据输入。整体上来说,目前咱们在线跑的实时计算的作业将近 1000 多个,离线作业超过了 5000 多个,每天解决的数据量超过了 3 PB。
2. 数据计算
上面两张图是数据计算,其中一个是实时计算,另外一个是离线计算。
- 实时计算次要包含实时的特色生成,多媒体特色生成和实时样本生成,这些跟业务关系比拟严密。另外,也提供一些根底的 flink 实时计算和 storm 实时计算。
- 离线计算次要包含 SQL 计算。次要包含 SQL 的即席查问、数据生成、数据查问和表治理。表治理次要就是数仓的治理,包含表的元数据的治理,表的应用权限,还有表的上下游的血缘关系。
3. 实时特色
如下图所示,咱们基于 Flink 和 Storm 构建了一个实时特色生成的服务。整体上来说,它会分为作业详情、输出源特色生成、输入和资源配置。用户依照咱们当时定义好的接口去开发特色生成的 UDF 就能够。其余的像输出、特色写入,都是平台主动提供的,用户只须要在页面上配置就好。另外,平台会提供输出数据源的监控、作业的异样监控、特色写入监控、特色读取监控等,这些都是主动生成的。
4. 流批一体
上面介绍咱们基于 FlinkSQL 构建的批流一体。首先,咱们会对立元数据,将实时日志跟离线日志通过元数据管理平台去对立。对立之后,用户在提交作业的时候,咱们会有一个对立的调度层。调度这一块,是依据作业的类型,作业的特点,目前集群的负载的状况,将作业调度到不同的集群下来。
目前调度层反对的计算引擎次要就是 HiveSQL,SparkSQL 跟 FlinkSQL。Hive 和 Spark 的 SQL 次要用于批量计算,FlinkSQL 是做批流混跑。整个后果会输入到数据仓库中,提供给业务方应用。批流一体这块大略有 4 个关键点:
- 第一,批流代码对立,进步开发效率。
- 第二,批流元数据对立。对立治理,保障元数据统一。
- 第三,批流程序混跑,节俭资源。
- 第四,批流对立调度,进步集群利用率。
5. 数据仓库
- 针对离线仓库,咱们把数据分成了三层,一个是原始日志,另外一个是中间层,还有一个是数据服务层。两头是元数据的对立,下边是实时数仓。
- 针对实时数仓,咱们通过 FlinkSQL 对这些原始日志做流式的一个 ETL,再通过一个流式汇总将最终的数据后果写到数据的服务层,同时也会把它存储到各种实时存储,比方 ES、Hbase、Redis、ClickHouse 中去。咱们能够通过实时存储对外提供数据的查问。还提供数据进一步数据计算的能力。也就是说,建设实时数仓次要是去解决离线特色生成的周期长的问题。另外就是应用 FlinkSQL 去解决 streaming 作业开发周期比拟长的问题。其中的一个关键点还是离线数仓跟实时数仓的元数据的治理。
三、Flink 在数据计算平台的典型利用
1. 流式机器学习
首先介绍流式机器学习的几个特点,最大的特点就是实时化。这块分为特色的实时化和模型的实时化。
- 特色实时化次要是为了更及时的去反馈用户行为,更细粒度的去刻画用户。
- 模型实时化是要依据线上样本实时训练模型,及时反映对象的线上变动状况。
■ 微博流式机器学习的特点:
- 样本的规模大,目前的实时样本能达到百万级别的 qps。
- 模型的规模大。模型训练参数这块,整个框架会反对千亿级别的训练规模。
- 对作业的稳定性要求比拟高。
- 样本的实时性要求高。
- 模型的实时性高。
- 平台业务需要多。
■ 流式机器学习有几个比拟难的问题:
- 一个就是全链路,端到端的链路是比拟长的。比如说,一个流式机器学习的流程会从日志收集开始,到特色生成,再到样本生成,而后到模型训练,最终到服务上线,整个流程十分长。任何一个环节有问题,都会影响到最终的用户体验。所以咱们针对每一个环节都部署了一套比较完善的全链路的监控零碎,并且有比拟丰盛的监控指标。
- 另外一个是它的数据规模大,包含海量的用户日志,样本规模和模型规模。咱们调研了罕用的实时计算框架,最终抉择了 Flink 去解决这个问题。
■ 散失机器学习流程:
- 首先是离线训练,咱们拿到离线日志,去离线的生成样本之后,通过 Flink 去读取样本,而后去做离线训练。训练实现之后把这些训练的后果参数保留在离线的参数服务器中。这个后果会作为模型服务的 Base 模型,用于实时的冷启动。
- 而后是实时的流式机器学习的流程。咱们会去拉取实时的日志,比如说微博的公布内容,互动日志等。拉取这些日志之后,应用 Flink 去生成它的样本,而后做实时的训练。训练实现之后会把训练的参数保留在一个实时的参数服务器中,而后会定期的从实时的参数服务器同步到实时的参数服务器中。
- 最初是模型服务这一块,它会从参数服务中拉取到模型对应的那些参数,去举荐用户特色,或者说物料的特色。通过模型对用户和物料相干的特色、行为打分,而后排序服务会调取打分的后果,加上一些举荐的策略,去选出它认为最适宜用户的这一条物料,并反馈给用户。用户在客户端产生一些互动行为之后,又收回新的在线申请,产生新的日志。所以整个流式学习的流程是一个闭环的流程。
另外,
- 离线的样本的延时和模型的更新是天级或者小时级,而流式则达到了小时级或者分钟级;
- 离线模型训练的计算压力是比拟集中的,而实时的计算压力比拟扩散。
■ 样本
这里简略介绍一下咱们流式机器学习样本的倒退历程。2018 年 10 月,咱们上线了第一个流式样本作业,是通过 Storm 和内部存储 Redis 去做的。2019 年 5 月,咱们应用新的实时计算框架 Flink,采纳 union+timer 计划代替 window 计算来实现多个数据流的 join 操作。2019 年 10 月,上线了一个 xx 样本作业,单个作业的 qps 达到了几十万。在往年 4 月份,把样本生成流程平台化。到往年 6 月份,平台化做了一个迭代,反对样本的落盘,包含样本库,还有样本的各种监控指标的欠缺。
流式机器学习所谓的样本生成,其实就是多个数据流依照雷同的 key 做一个拼接。比如说,咱们有三个数据流,数据荡涤后的后果存储为 <k , v>, k 是聚合的 key,v 是样本中须要的值。数据 union 后做 KeyBy 聚合,聚合后将数据存储在内存区域 value state 中。如下图所示:
- 如果 k1 不存在,则注册 timer,再存到 state 中。
- 如果 k1 存在,就从 state 中把它给拿进去,更新之后再存进去。到最初它的 timer 到期之后,就会将这条数据输入,并且从 state 中革除掉。
■ 样本平台
咱们把整个样本拼接的过程做了一个平台化的操作,分成了 5 个模块,包含输出、数据荡涤、样本拼接、样本的格式化和输入。基于平台化开发,用户只须要关怀业务逻辑局部即可。须要用户开发的有:
- 对应输出数据的数据荡涤逻辑。
- 样本输入前的数据格式化逻辑。
其余的在 UI 上配置即可实现,具体有:
- 样本拼接的工夫窗口。
- 窗口内对字段的聚合操作。
资源由平台方审核并配置。另外,整个平台提供根底的一些监控,包含输出数据的监控、样本指标的监控、作业异样监控、样本输出量的监控。
■ 流式机器学习我的项目的样本 UI
下图为流式机器学习我的项目的样本。右边是样本生成的作业配置,左边是样本库。样本库次要是做样本的治理展现,包含样本的阐明权限,样本的共享状况等等。
■ 散失机器学习的利用
最初介绍一下流式机器学习利用的成果。目前咱们反对实时样本拼接,QPS 达到百万级别。反对流式模型训练,能够同时反对几百个模型训练,模型实时性反对小时级 / 分钟级 模型更新。流式学习全流程容灾,反对全链路主动监控。近期在做的一个事件是流式的深度学习,减少实时模型的表达能力。还有强化学习这一块,摸索一些新的利用场景。
2. 多模态内容了解
■ 简介
多模态就是应用机器学习的一些办法去实现或者了解多元模态信息的能力或者技术。微博的这块次要包含图片、视频、音频、文本。
- 图片这块包含,物体辨认打标签、OCR、人脸、明星、颜值、智能裁剪。
- 视频这块包含版权检测、logo 辨认。
- 音频这块有,语音转文本、音频的标签。
- 文本次要包含文本的分词、文本的时效性、文本的分类标签。
举个例子,咱们一开始做视频分类的时候只用到了视频抽帧后的那些帧,也就是图片。起初第二次优化的时候,退出了音频相干的货色,还有视频对应的博文相干的货色,相当于把音频、图片、文本,多模态的交融思考,更精准的去生成这个视频的分类标签。
■ 平台
下图为多模态内容了解的平台架构。两头这部分是 Flink 实时计算,实时的接管图片流、视频流、发博流这些数据,而后通过模型插件调用下边的根底服务,深度学习模型服务。调用服务之后,会返回内容特色。而后咱们把特色存储到特色工程,通过数据中台对外提供给各个业务方。整个作业运行过程中全链路监控报警,异常情况第一工夫响应。平台主动提供日志收集,指标统计,CASE 追踪等性能。两头这一块应用 zk 做服务发现,解决实时计算和深度学习模型之间服务状态同步的问题。另外,除了状态同步,也会有一些负载平衡的策略。最下边就是应用数据 - 对账零碎,进一步提高数据处理成功率。
■ UI
多模态内容了解的 UI,次要包含作业信息、输出源信息、模型信息、输入信息、资源配置。这块通过配置化的开发,去进步开发效率。而后会主动生成模型调用的一些监控指标,包含模型调用的成功率和耗时。当作业提交之后,会主动生成一个用于指标统计的作业。
3. 内容去重服务
■ 背景
在举荐场景下,如果给用户始终推反复的内容,是很影响用户体验的。基于这个思考,联合 Flink 实时流计算平台、分布式向量检索系统和深度学习模型服务构建的一套内容去重服务平台, 具备低提早、高稳定性、高召回率的特点。目前反对多个业务方,稳定性达到 99.9+%。
■ 架构
下图为内容去重服务的架构图。最下边是多媒体的模型训练。这块做离线的训练。比如说咱们会拿到一些样本数据,而后去做样本解决,样本解决完之后把样本存到样本库中去。当我须要做模型训练的时候,我从样本库中去拉取样本,而后做模型训练,训练好的后果会保留到模型库中去。
内容去重这里次要用到的模型是向量生成模型。包含图片的向量、文本的向量、视频的向量。
当咱们把训练好的模型验证没有问题之后,会把这个模型保留到模型库中。模型库保留了模型的一些根底信息,包含模型的运行环境、版本。而后须要把模型部署上线,部署的过程须要从模型库中拉取模型,同时须要晓得这个模型的运行的一些技术环境。
模型部署好之后,咱们会通过 Flink 实时的从物料库中读取物料,而后调用多媒体预估服务去生成这些物料对应的向量。而后会把这些向量保留在 Weiss 库中,它是微博自研的一个向量召回检索系统。存到 Weiss 库中之后会对这条物料做向量召回的过程,召回跟这条物料类似的一批物料。在精排比对这块,会从所有的召回后果中加上肯定的策略,选出最类似的那一条。而后把最类似的这一条跟以后物料聚合到一起,造成一个内容 ID。最初业务去用的时候,也是通过物料对应的内容 ID 做去重。
■ 利用
内容去重的利用场景,次要业务场景有三个:
- 第一,反对视频版权 – 盗版视频辨认 – 稳定性 99.99%,盗版识别率 99.99%。
- 第二,反对全站微博视频去重 – 举荐场景利用 – 稳定性 99.99%,解决提早秒级。
- 第三,举荐流物料去重 – 稳定性 99%,解决提早秒级,准确率达到 90%
■ 最初
咱们通过将 Flink 实时流计算框架跟业务场景相结合,在平台化、服务化方面做了很大的工作,在开发效率、稳定性方面也做了很多优化。咱们通过模块化设计和平台化开发,进步开发效率。目前实时数据计算平台自带全链路监控,数据指标统计和 debug case 追踪(日志回看)零碎。另外,基于 FlinkSQL 在批流一体这块目前也有肯定的利用。这些都是 Flink 给咱们带来的一些新的变动,咱们会继续一直的摸索 Flink 在微博中更大的利用空间。