复杂查询响应速度提升10+倍,度言软件基于 Apache Doris 实时数仓建设实践|最佳实践
杭州度言软件有限公司(度言软件)成立于2014年,是信贷不良资产处置技术服务供应商,以“智能科技赋能不良资产处置,推动贷后行业合规高效发展”为使命,运用云通讯、大数据、人工智能等智能科技为信贷不良资产处置业务赋能,提供贷后管理通信能力支撑,实现了催收作业的智能化管理,客户群体为银行、消费金融公司、AMC 等金融机构和为这些机构提供人力资源外包服务的相关公司,目前已拥有 2000 多家企业客户。
度言软件以围绕信贷不良资产案件高效流转管理为目的核心,从机构管理、团队管理、坐席管理、外呼作业、调解法诉等环节入手,帮助客户构建数智化的业务管理体系,以数字化系统提升管理效能、以智能化工具赋能处置作业,打通金融机构、外包服务公司、司法系统等多方的业务系统,并按照监管要求对外呼行为、录音文件、沟通记录等案件相关数据进行记录、汇集、稽核、统计和分析,具有海量账号同时登陆、数据请求高并发、多来源数据汇总接入的特点要求。
业务需求
2021 年之前,度言软件旗下产品的数据需求主要由传统数据库 MySQL,MongoDB,ElasticSearch 为主的技术架构来实现,近两年随着业务不断发展带而来数据量的高速增长,传统的数仓技术架构已初显瓶颈,难以满足客户日益丰富多样化的数据及分析需求。为了给客户提供更优质的服务体验,度言软件亟需对现有的技术架构做出优化和重构。
早期架构及痛点
数仓架构 1.0
数仓架构 2.0
早期架构存在的问题
响应速度较慢。MySQL 对于大表的聚合计算并不友好,响应速度较慢。产品侧要求数据查询响应时间在 5 秒以内,虽然我们也基于 MySQL 进行了许多优化,但优化效果十分有限,仍无法达到 5s 的响应要求;我们甚至尝试了直接用 MaxCompute 对接 QuickBI,希望基于 MaxCompute 的查询加速和 QuickBI 的缓存来帮助我们解决问题,然而结果并不理想。 维系维度表成本高、难度大。离线数仓在数据同步的时效性上并不占优势(每 5 分钟进行一次批量同步),因此不太适合数据频繁更新和删除的场景,同时也给维度表的维护带来了额外的工作量。在数据更新和删除场景中,我们需要定期通过过滤和去重来保持数据的一致性,而事实上,大多时候需要报表数据实时关联维度表,这让我们直接放弃了在离线数仓中维系维度表的方案。 不支持高并发点查询场景。原实时数仓虽然可以满足我们对数据分析的部分性能要求,但其对高并发的点查场景并不太友好,不管是采用列式存储还是行级存储建表,优化之后的响应时长在 500 毫秒左右,综合来看性价比不算太高。
思考与选型
新数仓要求
为了解决上述问题,我们希望理想数仓能具有如下特性:
实现一站式实时数仓,能同时满足多种不同业务数据需求,大大简化大数据架构体系; 可同时支持 OLAP,Ad-hoc 和高 QPS 点查场景; 数据接入友好,写入即可见,对数据增删改和聚合等都有较好的支持; 架构简单,运维部署和维护简单,有较好的监控体系。
技术选型
新数仓架构
基于 Doris 新数仓架构设计
最初使用 Doris 的初衷是替换部分 MySQL 数据量较大的报表,基于 MySQL 的查询约需要几十秒的响应时间,在替换为 Doris 后,查询性能有了显著提升,几秒内即可返回结果,最长的 SQL 执行时间大概在 8 秒左右,速度相较于之前提升了8 倍。Doris 的初步应用就给了我们一个意外的惊喜,因此我们决定使用 Doris 完全替换掉早期数仓中的 MySQL,在这使用过程中,我们又发现 Doris 远比我们想象的要强大,目前已将客户报表及公司内部运营决策数据全部迁移至 Apache Doris,并计划用 Apache Doris 来替换 MongoDB 和 ElasticSearch,用于业务上高 QPS 的点查场景。以下是基于 Doris 的新数仓架构设计及使用情况:
数据建模:
Unique 模型主要用于维度表和业务表(原始表)的接入,确保数据导入过程中的一致性。 Aggregate 主要用于报表数据的导入,Aggregate 分为 Key (维度列) 和 Value(指标列),Value 列支持四种聚合方式: sum
,replace
,max
,min
。当前主要以
replace
聚合方式为主,方便统计数据重复导入和修正结果,后续也会尝试更多的方式来充分发挥 Doris 的性能。
数据接入:
使用 Flink-Doris-Connector 进行实时导入:主要用于业务数据的导入,基于MySQL 的 Binlog 日志写入到 Kafka 后,通过 Flink 解析加工后准实时写入 Doris。 使用 DataX 进行离线导入:主要用于对接离线数仓已计算后的报表数据。
数据开发:
insert into
的方式来导入。数据管理:
监控和报警:
慢 SQL 查询:
fe.audit.log
。主要查询统计指标:
优化实践
提高并发
parallel_fragment_exec_instance_num
的值,顺利完成了压测目标。需要说明的是:parallel_fragment_exec_instance_num
指的是 Scan Node 在每个 BE 节点上执行实例的个数,相当于在整个查询计划执行过程中的并发度,调高该参数可以提升查询效率,但同时也会增加更多机器资源的消耗。因此在资源有限且查询耗时满足业务需求的情况下,通过调低参数来节省单个 SQL 的资源消耗,有助于提高并发表现。另外,我们通过 Doris 社区了解到,在即将发布的新版本中将实现参数自动设置,无需进行手动调整。
如下图,我们可以看到,在参数设置为 16 的时候,异常率高达 82.84%,并且期间还出现了 BE 宕机重启,将参数调低至 8 后,异常率也同步降低到了 27.66%。最后我们将参数设置为最小值 1 后,异常率为 0,查询响应也能达到预期目标。
parallel_fragment_exec_instance_num
变动所带来的效果。parallel_fragment_exec_instance_num
= 1
parallel_fragment_exec_instance_num
= 8
parallel_fragment_exec_instance_num
= 16
BE 内存问题
最初我们使用的是 Doris 0.15 的版本。由于刚开始处于测试阶段,Doris 集群配置比较低或参数配置的不合理,当某些 SQL 扫描数据量较大时,就可能因为内存问题导致 BE 宕机。
资源占用
在迁移完新集群后,我们发现通过 Flink-Doris-Connector 数据导入占用非常高的集群资源,虽然设置了按批次写入(每 3s 写入一次 ),以限制数据的导入频率,但集群资源的占用仍未得到较大改善。因此我们在集群资源和数据实时可见性方面做了权衡,介于我们对数据实时性的要求相对不是太高,所以我们将每 3s 写入一次改为每 10s 或 20s 写入一次,调整写入时间后,集群的 CPU 资源占用下降明显,得到改善。
应用现状
目前度言软件有 2 个 Doris 集群,1 个集群用作线上业务的查询系统,主要是应对高 QPS 的点查场景,我们将原先基于业务库 MySQL 和 MongoDB 的查询迁移至 Doris,一方面减少了业务库的读写压力,同时也提高了用户查询服务的使用体验。在 Doris 中,最复杂的查询在 1 秒以内即可响应,响应速度提升了十几倍;另外 1 个集群主要用作即席查询(AD-Hoc Query)和报表分析,具体包括公司内部使用的所有报表和一些临时查询、客户报表、数据实时大屏。
总结规划
效果总结
Doris 完美覆盖了原本需要多个技术栈才能实现的业务场景,极大地简化了大数据的架构体系。 Doris 对 Join 支持较好,因此我们选择了将维度表放到 Doris 中进行维护,相较于之前在离线数仓中进行维护,明显地提高了开发的效率,并降低了数据出错的可能性,满足了业务上对维度表近实时更新的需求。 Doris 支持 MySQL 协议和标准 SQL,开发人员学习成本低,上手简单,可以快速将原先的业务迁移至 Doris 上来。 Doris 社区活跃,版本迭代速度快。在遇到任何问题时,都可以向社区求助,SelectDB 为 Apache Doris 组建了一支全职专业的技术支持团队,24H 内即可得到社区的响应回复。
未来规划
到目前为止,基于 Doris 的实时数仓搭建已基本完成,但我们对 Doris 的进一步尝试才刚刚开始,比如 BE 的多磁盘部署,物化视图的使用,Doris-On-ES,Doris 多租户和资源划分等。
Flink-Doris-Connector 能支持单 Sink 同时写入多张表,不需要再通过分流后多个 Sink 写入。 物化视图能够支持多表 Join,不再局限于单表。 进一步优化数据的底层 Compaction,在保证数据可见性的同时能够尽可能降低资源消耗。 Doris-Manager 提供对慢 SQL 的优化建议以及表信息收集,对于不合理的建表进行一定的提示。
最后,从 3 月份使用 Doris 以来,我们一直都和 Doris 社区保持着密切的联系,后续我们也将继续围绕 Doris 作为实时数仓应用到更多的业务使用场景中,对于使用中遇到的问题和优化的方案,我们也会持续和社区保持热切联系,为社区进步贡献我们的一份力量。
最后,欢迎更多的开源技术爱好者加入 Apache Doris 社区,携手成长,共建社区生态。Apache Doris 社区当前已容纳了上万名开发者和使用者,承载了 30+ 交流社群,如果你也是 Apache Doris 的爱好者,扫码加入 Apache Doris 社区用户交流群,在这里你可以获得:
专业全职团队技术支持 直接和社区专家交流,获取免费且专业回复 认识不同行业的开发者,收获知识以及合作机会 Apache Doris 最新版本优先体验权 获取一手干货和资讯以及活动优先参与权
扫描下方二维码立即报名,精彩演讲不容错过!