HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

赋能直播行业精细化运营,斗鱼基于 Apache Doris 的应用实践

  • 2023-04-07
    北京
  • 本文字数:4289 字

    阅读完需:约 14 分钟

赋能直播行业精细化运营,斗鱼基于 Apache Doris 的应用实践

鱼是一家弹幕式直播分享网站,为用户提供视频直播和赛事直播服务。随着斗鱼直播、视频等业务的高速发展,用户增长和营收两大主营业务线对精细化运营的需求越发地迫切,各个细分业务场景对用户的差异化分析诉求也越发的强烈。为更好满足业务需求,斗鱼在 2022 年引入了 Apache Doris 构建了一套比较相对完整的实时数仓架构,并在该基础上成功构建了标签平台以及多维分析平台,在此期间积累了一些建设及实践经验通过本文分享给大家。


作者韩同阳斗鱼资深大数据工程师、OLAP 平台负责人


斗鱼是一家弹幕式直播分享网站,为用户提供视频直播和赛事直播服务。斗鱼以游戏直播为主,也涵盖了娱乐、综艺、体育、户外等多种直播内容。随着斗鱼直播、视频等业务的高速发展,用户增长和营收两大主营业务线对精细化运营的需求越发地迫切,各个细分业务场景对用户的差异化分析诉求也越发的强烈,例如增长业务线需要在各个活动(赛事、专题、拉新、招募等)中针对不同人群进行差异化投放,营收业务线需要根据差异化投放的效果及时调整投放策略。



根据业务场景的诉求和精细化运营的要求,我们从金字塔自下而上来看,需求大致可以分为以下几点:


  • 分析需求更加复杂、精细化,不再满足简单的聚合分析;数据时效性要求更高,不满足于 T+1 的分析效率,期望实现近实时、实时的分析效率。

  • 业务场景多,细分业务场景既存在独立性、又存在交叉性,例如:针对某款游戏进行专题活动投放(主播、用户),进行人群圈选、AB 实验等,需要标签/用户画像平台支持。

  • 多维数据分析的诉求强烈,需要精细化运营的数据产品支持。


为更好解决上述需求,我们的初步目标是:


  • 构建离线/实时数仓,斗鱼的离线数仓体系已成熟,希望此基础上构建一套实时数仓体系;

  • 基于离线/实时数仓构建通用的标签中台(用户画像平台),为业务场景提供人群圈选、AB 实验等服务;

  • 在标签平台的基础上构建适用于特定业务场景的多维分析和精细化运营的数据产品。


在目标驱动下,斗鱼在原有架构的基础上进行升级改造、引入 Apache Doris 构建了实时数仓体系,并在该基础上成功构建了标签平台以及多维分析平台,在此期间积累了一些建设及实践经验通过本文分享给大家。

原有实时数仓架构

斗鱼从 2018 年开始探索实时数仓的建设,并尝试在某些垂直业务领域应用,但受制于人力的配置及流计算组件发展的成熟度,直到 2020 年第一版实时数据架构才构建完成,架构图如下图所示:



原有实时数仓架构是一个典型的 Lambda 架构,上方链路为离线数仓架构,下方链路为实时数据仓架构。鉴于当时离线数仓体系已经非常成熟,使用 Lambda 架构足够支撑实时分析需求,但随着业务的高速发展和数据需求的不断提升,原有架构凸显出几个问题


  • 在实际的流式作业开发中,缺乏对实时数据源的管理,在极端情况下接近于烟囱式接入实时数据流,无法关注数据是否有重复接入,也无法辨别数据是否可以复用。

  • 离线、实时数仓完全割裂,实时数仓没有进行数仓分层,无法像离线数仓按层复用,只能面向业务定制化开发。

  • 数据仓库数据服务于业务平台需要多次中转,且涉及到多个技术组件,ToB 应用亟需引入 OLAP 引擎缓解压力。

  • 计算引擎和存储引擎涉及技术栈多,学习成本和运维难度也很大,无法进行合理有效管理。

新实时数仓架构

技术选型

带着以上的问题,我们希望引入一款成熟的、在业内有大规模落地经验的 OLAP 引擎来帮助我们解决原有架构的痛点。我们希望该 OLAP 引擎不仅要具备传统 OLAP 的优势(即 Data Analytics),还能更好地支持数据服务(Data Serving)场景,比如标签数据需要明细级的查询、实时业务数据需要支持点更新、高并发以及大数据量的复杂 Join 。除此之外,我们希望该 OLAP 引擎可以便捷、低成本的的集成到 Lambda 架构下的离线/实时数仓架构中。立足于此,我们在技术选型时对比了市面上的几款 OLAP 引擎,如下图所示



根据对选型的要求,我们发现 Apache Doris 可以很好地满足当前业务场景及诉求,同时也兼顾了低成本的要求,因此决定引入 Doris 进行升级尝试

架构设计

我们在 2022 年引入了 Apache Doris ,并基于 Apache Doris 构建了一套比较相对完整的实时数仓架构,如下图所示。



总的来说,引入 Doris 后为整体架构带来几大变化:


  • 统一了计算平台(玄武计算),底层引擎支持 Flink、Spark 等组件,接入层支持统一 SQL 和 JAR 包接入。

  • 引入 Doris 后,我们将实时数仓分为 ODS、DWD、DWS、ADS 层,部分中间层实时数据直接使用 Doris 进行存储;

  • 构建了基于 Doris 的 HOLAP 多维分析平台,直接服务于业务;简化了原来需要通过 Hive 进行预计算的加工链路,逐步替换使用难度和运维难度相对较高的 ClickHouse;

  • 下游应用的数据存储从之前的 MySQL 和 HBase 更换为 Doris,可以在数据集市和大宽表的数据服务场景下直接查询 Doris。

  • 支持混合 IDC(自建和云厂商)。

Overwrite 语义实现

Apache Doris 支持原子替换表和分区,我们在计算平台(玄武平台)整合 Doris Spark Connector 时进行了定制,且在 Connector 配置参数上进行扩展、增加了“Overwrite”模式。


当 Spark 作业提交后会调用 Doris 的接口,获取表的 Schema 信息和分区信息。


  • 如果为非分区表:先创建目标表对应的临时表,将数据导入到临时表中,导入后进行原子替换,如导入失败则清理临时表;

  • 如果是动态分区表:先创建目标分区对应的临时分区,将数据导入临时分区,导入后进行原子替换,如导入失败则清理临时分区;

  • 如果是非动态分区:需要扩展 Doris Spark Connector 参数配置分区表达式,配完成后先创建正式目标分区、再创建其临时分区,将数据导入到临时分区中,导入后进行原子替换,如导入失败则清理临时分区。

架构收益

通过架构升级及二次开发,我们获得了 3 个明显的收益:


  • 构建了规范、完善、计算统一的实时数仓平台

  • 构建了统一混合 OLAP 平台,既支持 MOLAP,又支持 ROLAP,大部分多维分析需求均由该平台实现。

  • 面对大批量数据导入的场景,任务吞入率和成功率提升了 50%。

Doris 在标签中台的应用

标签中台(也称用户画像平台)是斗鱼进行精准运营的重要平台之一,承担了各业务线人群圈选、规则匹配、A/B 实验、活动投放等需求。接下来看下 Doris 在标签中台是如何应用的。

原标签中台架构


上图为斗鱼原来的标签中台架构,离线标签在数仓中加工完成后合入宽表,将最终数据写入 HBase 中,实时标签使用 Flink 加工,加工完直接写入到 HBase 中。


终端 APP 在使用标签中台时,主要解决两种业务需求:


  • 人群圈选,即通过标签和规则找到符合条件的人。

  • 规则匹配,即当有一个用户,找出该用户在指定的业务场景下符合哪些已配置的规则,也可以理解是“人群圈选“的逆方向。


在应对这两种场需求中,原标签中台架构出现了两个问题:


  • 实时标签链路:Flink 计算长周期实时指标时稳定性较差且耗费资源较高,任务挂掉之后由于数据周期较长,导致 Checkpoint 恢复很慢;

  • 人群圈选:Spark 人群圈选效率较低,特别是在实时标签的时效性上。

新标签中台架构


引入 Apache Doris 之后,我们对标签中台架构的进行了改进,主要改进集中在实时链路和标签数据存储这两个部分:


  • 实时标签链路:仍然是通过实时数据源到 Kafka 中,通过 Flink 进行实时加工;不同的是,我们将一部分加工逻辑迁移到 Doris 中进行计算,长周期实时指标的计算从单一的 Flink 计算转移到了 Flink + Doris 中进行;

  • 标签数据存储:从 HBase 改成了 Doris,利用 Doris 聚合模型的部分更新特性,将离线标签和实时标签加工完之后直接写入到 Doris 中。

1. 离线/实时标签混合圈人


  • 简化存储:原存储在 HBase 中的大宽表,改为在 Doris 中分区存储,其中离线标签 T+1 更新,实时标签 T 更新、T+1 采用离线数据覆盖矫正。

  • 查询简化:面对人群圈选场景,无需利用 Spark 引擎,可直接在标签中台查询服务层,将圈选规则配置解析成 SQL 在 Doris 中执行、并获得最终的人群,大大提高了人群圈选的效率。面对规则匹配场景,使用 Redis 缓存 Doris 中的热点数据,以降低响应时间。

2. 长周期实时标签计算原链路

长周期实时标签:计算实时标签时所需的数据周期较长,部分标签还需要采用历史数据(离线)合并实时数据流一起进行计算的场景。


使用前:



从原来的计算链路中可知,计算长周期的实时标签时会涉及到维度补充、历史数据 Merge,在经过几步加工最终将数据写入到 HBase 中。


在实际使用中发现,在这个过程中 Merge 离线聚合的数据会使链路变得很复杂,往往一个实时标签需要多个任务参与才能完成计算;另外聚合逻辑复杂的实时标签一般需要多次聚合计算,任意一个中间聚合资源分配不够或者不合理,都有可能出现反压或资源浪费的问题,从而使整个任务调试起来特别困难,同时链路过长运维管理也很麻烦,稳定性也比较低。


使用后:



我们在长周期指标计算实时链路中加入了 Apache Doris,在 Flink 中只做维度补充和轻度加工汇总,只关注短的实时数据流,对于需要 Merge 的离线数据,Merge 的计算逻辑转移到 Doris 中进行计算,另外 Doris 中的轻度汇总/明细数据有助于问题排查,同时任务稳定性也能提升。

使用收益

目前标签中台底层有近 4 亿+条用户标签,每个用户标签 300+,已有 1W+ 用户规则人群,每天定时更新的人群数量达到 5K+。标签中台引入 Apache Doris 之后,单个人群平均圈选时间实现了分钟级到秒级的跨越,实时标签任务稳定性有所提高,实时标签任务的产出时间相较于之前约有 40% 的提升,资源使用成本大大降低。

Doris 在多维数据分析平台的应用

除以上所述应用及收益之外,Apache Doris 也助力内部多维数据分析平台——斗鱼 360 取得了较大的发展,受益于 Apache Doris 的 Rollup、物化视图以及向量化执行引擎,使原来需要预计算的场景可以直接导入明细数据到 Doris 中,简化了业务数据开发流程,提升了分析效率;Doris 兼容 MySQL 协议,并具有独立简单的分布式架构,使得业务开发人员入门使用也更容易,缩短了业务开发周期,有效降低了开发成本;同时我们原来基于 ClickHouse 的查询目前也全部切换到了 Doris 中进行。


目前我们用于多维分析场景的 Doris 集群共有两个,节点规模约 120 个,存储数据量达 90~100 TB,每天增量写入到 Doris 的数据约 900GB,其中查询 QPS 在 120 左右,Apache Doris 应对起来毫不费力,轻松自如。


因文章篇幅限制,该部分应用不再赘述,后续有机会与大家进行详细分享。

未来展望

未来随着 Apache Doris 在斗鱼更广泛业务场景的落地,我们将在可视化运维、问题快速定位排查等方面进行更多实践和深耕。我们关注到, Apache Doris 1.2.0 版本已经对 Multi Catalog 功能进行了支持,我们也计划对其进行探索、解锁更多使用场景,同时也期待即将发布 Apache Doris 2.x 版本的行列混存功能,更好的支持 Data Serving 场景。

2023-04-07 17:294632
用户头像
李冬梅 加V:busulishang4668

发布了 945 篇内容, 共 537.9 次阅读, 收获喜欢 1105 次。

关注

评论

发布
暂无评论
发现更多内容

肝!Spring JDBC持久化层框架“全家桶”教程

热爱java的分享家

Java 架构 程序人生 编程语言 架构师

dart系列之:元世界pubspec.yaml文件详解

程序那些事

flutter dart 程序那些事 11月日更

Python代码阅读(第59篇):根据value查询字典key值

Felix

Python 编程 阅读代码 字典 Python初学者

如何用EasyRecovery恢复中毒U盘中丢失的文件

淋雨

EasyRecovery

使用 Node.js 消费SAP Cloud for Customer上的Web service

汪子熙

node.js SAP C4C 11月日更

AI界的革命!终于可以自动标注了!

百度开发者中心

AI 自动标注工具

SOLID原则之 单一职责原则

面向对象的猫

SOLID

“太白”团队加入OpenInfra Labs,联合社区成员共同完善多云管理技术

制作 Flask 程序容器镜像

wong

Python flask k8s Dockerfile

这个无敌设计,可以解析并运算任意数学表达式

Tom弹架构

Java 架构 设计模式

解决文件存储难题 openGauss隆重推出段页式特性

openGauss

Hadoop实战篇-集群版(2)

进击的梦清

大数据 hadoop zookeeper

盲盒开发盲盒系统开发定制

CSS奇技淫巧之滤镜(二)drop-shadow

Augus

CSS 11月日更

有一说一,阿里内部SpringBoot王者晋级之路全彩小册开源,让我开了眼

热爱java的分享家

Java 架构 面试 程序人生 编程语言

HBase shell get命令从二进制还原真实值

WindFlying

为何飞书成了先进企业的标配?

ToB行业头条

一网打尽!音乐高手都在使用的打谱软件不藏私推荐!

懒得勤快

45岁程序员发求职贴:精通各种技术体系,却连个面试机会都没有…

Java高级开发

Java 程序员 面试 职场

基于MySQL binlog日志,实现Elasticsearch近实时同步实践

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

论文解读丨LayoutLM: 面向文档理解的文本与版面预训练

华为云开发者联盟

CV 预训练 LayoutLM模型 无标注 文档理解

低代码——不应该只是玩具

行云创新

云原生 低代码 开发 高效

快速剪辑-助力度咔智能剪辑提效实践

百度Geek说

架构 后端

987页的Java面试宝典,看完才发现,应届生求职也没那么难

热爱java的分享家

Java 架构 面试 程序人生 编程语言

从0到10彻底搞懂信息流【投放系统】

水泽山林

系统架构 推荐系统 智能投放 内容平台

关于openGauss账本数据库:你想知道的这里都有

openGauss

Ustore在openGauss闪亮登场,重构openGauss数据存储的灵魂

openGauss

ABAP 和 Java 的单元测试 Unit Test

汪子熙

Java abap 11月日更 JavaSAP

华为云GaussDB NoSQL云原生多模数据库的超融合实践

华为云数据库小助手

GaussDB 华为云数据库 GaussDB NoSQL

我就获取个时间,机器就down了

安第斯智能云

Linux 后端

盲盒app开发盲盒小程序开发

赋能直播行业精细化运营,斗鱼基于 Apache Doris 的应用实践_文化 & 方法_SelectDB_InfoQ精选文章