写点什么

腾讯音乐:从 Elasticsearch 到 Apache Doris 内容库升级,统一搜索分析引擎,成本直降 80%

  • 2024-10-25
    北京
  • 本文字数:4837 字

    阅读完需:约 16 分钟

腾讯音乐:从 Elasticsearch 到 Apache Doris 内容库升级,统一搜索分析引擎,成本直降 80%

作者|腾讯音乐内容信息平台部:张俊、罗雷、李继蓬、代凯


为满足更严苛数据分析的需求,腾讯音乐借助 Apache Doris 替代了 Elasticsearch 集群,统一了内容库数据平台的内容搜索和分析引擎。并基于 Doris 倒排索引和全文检索的能力,支持了复杂的自定义标签计算,实现秒级查询响应需求。此外,实现写入性能提升 4 倍、使用成本节省达 80% 的显著成效。


腾讯音乐娱乐拥有丰富的内容曲库,包括录制音乐、现场表演、音频和视频等多种形式。通过技术和数据赋能,腾讯音乐娱乐不断创新产品,为用户提供更优质的体验,提高用户参与度,同时为音乐人和合作伙伴在制作、发行和销售方面提供更大支持。基于公司丰富的音乐内容资产,腾讯音乐将歌曲库、艺人资讯、专辑信息、厂牌信息等大量数据统一存储,形成音乐内容库数据平台,该平台旨在为应用层提供库存盘点、分群画像、指标分析、标签圈选等内容分析服务,高效为业务赋能。


内容库数据平台的数据架构已经从 1.0 版本演进到了 4.0 版本。之前的文章介绍了分析引擎从 ClickHouse 到 Apache Doris 升级实践本文将重点分享内容搜索引擎从 Elasticsearch 到 Apache Doris 的替换,如何通过一个系统同时满足内容搜索和数据分析的需求,并满足复杂的自定义标签计算的支持。最终,实现存储成本降低 80%,写入性能提升 4 倍的显著效益。


业务需求


从业务角度来看,腾讯音乐有两个场景需要搜索能力的支持,分别是内容库的百科搜索及内容库的标签圈选。


  • 内容库百科搜索:分析师和运营人员需要快速查找歌手、歌曲名称以及其他文本信息。这种检索能力不仅要求高效的全文搜索,还需支持多种查询条件,以便用户能够迅速获取所需数据,提升工作效率。

  • 内容库标签圈选:分析师和运营人员会根据特定的标签和条件,筛选出符合要求的内容。这要求系统能够在亿级数据量的情况下,提供秒级的查询响应,以便快速定位和分析相关数据,支持业务决策和策略优化。



Elasticsearch + Doris 混合架构


在 2.0 版本之前,Doris 暂未推出倒排索引能力,检索能力相对较弱。而 Elasticsearch 在全文检索方面具备优势,能够基于倒排索引快速匹配特定关键词或短语、可对所有字段建立索引,在查询时支持任意组合的过滤条件等。


但是,Elasticsearch 聚合统计分析性能较差,不支持 JOIN 等复杂查询,且存储空间占用较高。这些正是 Apache Doris 所擅长的领域,能够高效处理复杂的统计分析和查询任务,并通过高压缩率优化存储效率。


因此,腾讯音乐构建基于 Elasticsearch 与 Doris 的混合架构,Elasticsearch 负责内容的全文检索和标签圈选,而 Apache Doris 专注于 OLAP 分析。借助 Doris 的 ES catalog 外表查询机制,能够直接查询 Elasticsearch 中数据,实现对外查询接口的统一。



但这套混合架构在应用时,也遇到了一些问题:


  • 存储成本较高:Doris 的引入并没有完全解决存储成本高的问题,Elasticsearch 的存储空间占用仍然显著。

  • 写入性能受限:随着数据量的增长,Elasticsearch 集群的写入压力不断加大,全量写入耗时超过 10 个小时,接近业务可承受极限。

  • 混合架构复杂:Elasticsearch 和 Doris 的混合架构增加了系统和技术栈的维护成本,同时冗余的数据存储也带来了额外费用,两套系统也增加了数据不一致的风险。


基于 Apache Doris 的统一架构方案


因此,腾讯音乐考虑是否可以将搜索引擎统一为 Doris,让其全面负责全文检索、标签圈选以及聚合分析的需求。这样考虑的主要原因是 Apache Doris 自 2.0 版本开始支持倒排索引和全文检索,这使其有能力完全替 Elasticsearch 所负责的部分,获得更好的收益


  • 在全文检索方面,Doris 不仅支持普通的等值和范围(=, !=, >, >=, <, <=)查询加速,还支持文本字段的全文检索,包括中英文分词、多关键词检索(MATCH_ANY,MATCH_ALL)、短语检索(MATCH_PHRASE, MATCH_PHRASE_PREFIX,MATCH_PHRASE_REGEXP)、短语词距(slop)、多字段检索(MULTI_MATCH),其性能相较于传统数据库支持的 LIKE 模糊匹配有数量级的提升。

  • 在倒排索引方面,Doris 倒排索引在数据库内核中实现,语法与 SQL 无缝结合,支持多种条件的任意 AND OR NOT 逻辑组合,满足普通过滤以及全文检索组合的复杂需求。如下方示例,WHERE 筛选条件由 5 部分组成,包括全文检索 title MATCH ‘爱’ OR description MATCH_PHRASE ‘热爱’,日期范围过滤 dt BETWEEN ‘2024-09-10 00:00:00’ AND ‘2024-09-10 23:59:59’,数值范围过滤 rating > 4,字符串等值过滤 country = ‘中国’,这些条件通过统一的 SQL 语法无缝组合起来,筛选完之后又按照 actor 进行分组统计,最后对分组统计的 cnt 排序取最高的 100 个结果。


SELECT actor, count() as cnt FROM table1WHERE dt BETWEEN '2024-09-10 00:00:00' AND '2024-09-10 23:59:59'  AND (title MATCH '爱' OR description MATCH_PHRASE '热爱')  AND rating > 4  AND country = '中国'GROUP BY actorORDER BY cnt DESC LIMIT 100;
复制代码


因此,腾讯音乐将 Doris 升级至 2.0 版,将架构从原先的 Elasticsearch + Doris 转变为统一的 Doris 解决方案:



基于 Doris 的统一架构上线后,所带来的收益也非常可观:


  • 成本显著降低:Doris 替代了 Elasticsearch 集群,同时承载了搜索和分析两类负载,使用成本节省达 80%。比如,某个表单日全量数据在 Elasticsearch 中需要 697.7 GB 存储空间,而在 Doris 中仅需 195.4 GB ,存储空间减少了 72%。



  • 写入和查询性能提升:全量数据导入时间从 10 小时以上缩短至 3 小时以内, 写入性能是 Elasticsearch 的 4 倍。此外,Doris 可以支持复杂的自定义标签计算,使不可能变为可能,显著改善了用户体验。

  • 统一系统架构:架构统一到 Doris 后,内部只需维护一套技术栈,极大降低了维护成本,同时也很好避免了两套系统之间的数据一致性问题,确保了数据质量的可靠性。


在架构统一的过程中,涉及到一些关键设计,接下来将相关方案及经验分享给读者。


01 Doris 倒排索引的使用


在存储结构上采用了维度表与事实表的方案:


  • 维度表:使用 Merge-on-Write Unique 模型,用于百科搜索和标签圈选,通过部分列更新进行维度更新。

  • 事实表:使用 Aggregate 模型,用于存储每日的指标数据。由于数据量较大且每天的数据独立,每天需新建一个分区。


参考 Doris 倒排索引的使用文档(https://doris.apache.org/zh-CN/docs/table-design/index/inverted-index),根据 Elasticsearch Mapping 设计了对应的 Doris 的表结构和索引。其中,Elasticsearch 的 Keyword 类型对应 Doris 的 Varchar/String 类型及不分词的倒排索引(USING INVERTED),ES 的 Text 类型对应 Doris 的  Varchar/String 类型及分词倒排索引(USING INVERTED PROPERTIES(“parser” = “english/chinese/unicode”))。


CREATE TABLE `tag_baike_zipper_track_dim_string` (  `dayno` date NOT NULL COMMENT '日期',  `id` int(11) NOT NULL COMMENT 'id',  `a4` varchar(65000) NULL COMMENT 'song_name',  `a43` varchar(65000) NULL COMMENT 'zyqk_singer_id',  INDEX idx_a4 (`a4`) USING INVERTED PROPERTIES("parser" = "unicode", "support_phrase" = "true") COMMENT '',  INDEX idx_a43 (`a43`) USING INVERTED PROPERTIES("parser" = "english") COMMENT '') ENGINE=OLAPUNIQUE KEY(`dayno`, `id`)COMMENT 'OLAP'PARTITION BY RANGE(`dayno`)(PARTITION p99991230 VALUES [('9999-12-30'), ('9999-12-31')))DISTRIBUTED BY HASH(`id`) BUCKETS autoPROPERTIES (...);
复制代码


使用 Doris 倒排索引的前后对比:


使用前:以下方复杂查询为例,在使用 Doris 倒排索引之前,该查询运行较慢、响应级别为分钟级。


-- like (查询复杂性能低):SELECT  * FROM db_tag_pro.tag_track_pro_3  WHERE dayno='2024-08-01' AND  ( concat('#',a4,'#') like '%#若月亮还没来#%' or concat('#',a43,'#') like '%#1000#%')  
-- explode (执行性能差,经常 ERROR 1105 (HY000)):SELECT * FROM ( SELECT tab1.*,a4_single,a43_single FROM ( SELECT * FROM db_tag_pro.tag_track_pro_3 WHERE dayno='2024-08-01' ) tab1 lateral view explode_split(a4, '#') tmp1 as a4_single lateral view explode_split(a43, '#') tmp2 as a43_single ) tab2 where a4_single='若月亮还没来' or a43_single='1000'
复制代码


使用后:使用 Doris 倒排索引之后,查询过程显著简化,运行速度极大提升,响应时间从分钟级缩短至秒级别


  • 对中文采用 unicode 分词,数值采用 english 分词创建倒排索引。

  • 设置 store_row_column,启用行存,优化 select* 查询所有列。


-- 先通过match从维度表搜索查询到idSELECT  id FROM db_tag_pro.tag_baike_zipper_track_dim_string  WHERE( a4 MATCH_PHRASE '若月亮还没来' OR a43 MATCH_ALL '1000' )  AND  dayno ='2024-08-01'
-- 再通过id主键查询事实表得到明细数据SELECT * FROM db_tag_pro.tag_baike_track_pro WHERE id IN ( 563559286 )
复制代码


不仅如此,原来在 Elasticsearch 中由于语句过长而无法查询的复杂自定义标签,在 Doris 内能够更好的支持,Doris 能够处理更长的 SQL 语句。并且在同一个引擎内,可以通过物化视图和 BITMAP 类型轻松对查询后的中间结果进一步优化,避免了不同引擎之间的跨网络同步。


02 业务间资源隔离


为了确保业务侧使用体验和成本可控,我们采用了 Doris 的资源隔离机制进行业务间的资源管理。


  • 第一层:物理隔离(Resource Group)。将集群划分为两个资源组:Core 和 Common,以服务不同重要场景的需求。Core 组专注于内容搜索和标签圈选的核心需求,而 Common 组则处理其他普通需求。通过在节点层面实施物理隔离,可确保核心业务不受其他业务的影响。

  • 第二层:逻辑隔离(Workload Group)。在每个物理隔离内部,通过 Workload Group 对每个 Resource Group 进行逻辑资源的细分。例如,在普通集群中建立多个 Workload Group,并为用户指定默认的 Workload Group,以防止单个用户占满整个集群的资源。



上述资源隔离机制显著提升了系统的稳定性,告警频率从每天 20 多次降低到每月个位数。这不仅保障了业务的可靠性,还减轻了团队运维管理压力,使他们能够将更多时间投入到系统优化中。


业务无感迁移方案


腾讯音乐自研的 SuperSonic 项目内置了 Headless BI 功能,其核心理念是将数据建模、管理和消费进行解耦。通过这种架构,业务分析师只需在 Headless BI 平台上定义指标和标签,而无需关心底层数据源的具体实现。


在业务迁移过程中,业务团队通过 SuperSonic Headless BI 进行。利用转换工具将 DSL 转换为 Elasticsearch SQL 查询,只需切换已定义指标和标签所对应的数据源即可。由于 Headless BI 屏蔽了底层不同数据存储和分析引擎的差异,业务方能够实现无感知的迁移。



Headless BI 架构不仅实现了数据源的无缝迁移,还大大简化了数据管理和查询的复杂性。SuperSonic 将 Chat BI 与 Headless BI 融合,使用户能够实现统一的数据治理,并通过自然语言进行数据分析。经过腾讯音乐的自主研发和实际应用,SuperSonic 平台现已开源,欢迎感兴趣的同仁使用与共同建设。


_GitHub 地址:_https://github.com/tencentmusic/supersonic


结束语


借助 Doris 替代 Elasticsearch 集群,腾讯音乐统一了搜索和分析引擎。基于倒排索引和全文检索的能力,支持复杂的自定义标签计算,满足秒级响应需求。此外,写入性能提升了 4 倍,存储空间减少了 72%,使用成本节省达 80%


未来,腾讯音乐将与 Apache Doris 深度合作,探索更多特性在场景应用中的可能性,包括引入 3.0 版本的存算分离,以进一步降低成本。


今日好文推荐


太古可口可乐:将经验转化为数据,探索行业专有模型


字节澄清大模型遭攻击,实习生嫁祸背刺同事?IBM老员工被无端解雇后举报董事长;年薪40万美元因滥用25美元餐补被裁!| Q资讯


国产编程语言MoonBit发布原生后端,比Java快15倍,拥抱 RISC-V


37signals“下云”计划完美收官:成本节约比当初估算的还要多,5年狂省千万美元


2024-10-25 12:4313057

评论

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

教育机构这一大堆问题都是由教育管理系统解决的

低代码小观

公司管理 教育 企业管理 CRM 管理工具

【ShardingSphere技术专题】「ShardingJDBC」(1)带你一同认识一下ShardingJDBC是什么?(高手勿入)

洛神灬殇

ShardingJDBC ShardingSphere 算法学习笔记指南 10月月更

理论+实例,带你掌握Linux的页目录和页表

华为云开发者联盟

Linux 内存管理 寄存器 页目录 页表

GitHub上首本IntelliJ IDEA操作手册,标星果然百万名不虚传

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

这还不够全?阿里P8架构师耗时八年时间才整理出来这“Java核心知识PDF(Java高岗)

Java 程序员 架构 面试 后端

惊!HUAWEI高工熬夜赶出这本20W字的图解计算机操作系统指南手册,竟被我偶然发现!

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

我凭借这份pdf拿下了蚂蚁金服、字节跳动、小米等大厂的offer

Java 编程 程序员 架构

Java集合核心内容之葵花宝面,搞定90%以上的技术面!建议收藏

程序员小呆

Java 程序员 架构师

深入思考软件工程,开启 DevOps 之旅

BoCloud博云

DevOps cicd 云原生 CI/CD 敏捷交付

面试巨作!13万字!腾讯高工手写JDK源码笔记 带你飙向实战

收到请回复

Java jdk 面试 后端

程序员常用的工具软件推荐

程序员小呆

Java c++ 程序员 架构师 Go 语言

Android 资源溢出崩溃轻松解

字节跳动终端技术

字节跳动 移动开发 Mars 火山引擎 MARS-APMPlus

2021金九银十阿里Java岗7轮技术面经历,险幸上岸

Java 程序员 架构 面试 计算机

网络安全产品之堡垒机应用于金融行业案例讲解

行云管家

云计算 网络安全 等保 堡垒机

Kubernetes 中的应用参数配置案例详析

Zilliz

数据库 Kuber k8s Helm

封神总结!蚂蚁金服+滴滴+美团+拼多多+腾讯15万字Java面试题

收到请回复

Java 程序员 面试 微服务 大厂Offer

JS的深浅复制,原来如此!

华为云开发者联盟

js 序列化 深复制 浅复制

2022年最新Java小白学习路线总结,从零基础跟着学习不掉队(PDF+视频分享篇)

Java 编程 程序员 计算机 java面试

Zookeeper 集群部署的那些事儿

牧小农

zookeeper

律所管理系统能解决律师事务所存在的这些问题

低代码小观

公司管理 企业 企业管理 管理工具 律所

汇纳科技数据科学团队研究商场活动效果并优化的论文被ISR期刊接收

从简历被拒到收割8个大厂offer,我用了3个月成功破茧成蝶

收到请回复

Java 程序员 面试

相约 DTCC 2021 | Tapdata 受邀分享:如何打造面向 TP 业务的数据平台架构

tapdata

和12岁小同志搞创客开发:如何驱动LED点阵模块?

不脱发的程序猿

少儿编程 创客开发 LED点阵模块

会声会影和剪映在音频处理功能上的比较

懒得勤快

马萨卡!阿里大佬珍之若宝的最强高并发pdf,竟然被上传GitHub开源

Java 架构 面试 编程语言

阿里P8手抄本惨遭泄露,并出现病毒式传播,致28人斩获大厂offer

收到请回复

Java 面试 阿里 大厂Offer

极客架构营2期模块5作业

Ping

从互联网“后来者”到“引领者”:这场IPv6大会上,我读懂了中国式创新

脑极体

为什么网络 I/O 会被阻塞?

编程 架构 操作系统 计算机

手把手带你做LiteOS的树莓派移植

华为云开发者联盟

树莓派 系统 LiteOS arm 树莓派移植

腾讯音乐:从 Elasticsearch 到 Apache Doris 内容库升级,统一搜索分析引擎,成本直降 80%_数据湖仓_SelectDB_InfoQ精选文章