写点什么

Apache Doris 在云真信智能决策分析平台的应用实践

用户头像
DorisDB
关注
发布于: 2020 年 10 月 09 日
Apache Doris在云真信智能决策分析平台的应用实践

1、业务场景



北京云真信科技有限公司(简称“云真信”)是国内领先的金融科技服务提供商。公司拥有强大的数据挖掘与整合、提供优势的泛金融领域整体化解决方案的能力;自设立以来,已与多家大型国有银行、商业银行以及大型持牌消金机构等建立了深度的合作关系,打造了客户信赖的产品服务体系;同时拥有一支在数据科学、人工智能、金融风控等领域具备丰富的理论和实践经验的核心管理团队;近期,云真信连续获评国家高新技术企业、2020中国金融创新奖十佳智能风控创新奖,标志着权威认证机构对云真信技术能力和创新能力的高度认可。



云真信智能决策分析平台是解决大规模数据下进行多维度的快速分析决策系统,借助Apache Doris底层技术能力,最终能够实现秒级多维度的快速统计分析与高效建模。



2、技术选型



为了有效地支持智能决策分析平台的数据计算,我们对市面上流行的OLAP引擎进行了全面的调研。在目前开源的OLAP引擎中,根据处理类型分类,主要有三大类:MPP架构、搜索引擎架构以及预处理架构这三种类型。针对这三大类型的主要产品,我们分析了其对于我们场景的适用情况。





相较于以上的产品,Apache Doris更加适合我们的场景,主要原因如下:



1. Doris支持的数据规模比较大,而且实现了MySQL协议,对标准SQL支持比较友好。



2. Doris架构比较简洁,只有FE和BE两个组件,不依赖任何外部的组件。不依赖Hadoop,却可以通过HDFS导入数据,还可以通过Spark、Kafka等方式导入数据。



3. 在Join方面,支持Shuffle Join、Broadcast Join以及Colocation Join,特别是Colocation Join,非常适合我们。Doris 的Colocation Join功能,原理是将需要Join的表,根据Join时用到的key进行分桶,而且要保证分桶数一样,副本数一样,colocate_with属性也要保持一致。在这样的前提条件下,Doris就会将相同key数据调度到相同的节点,在两表关联时,只需拿本地的数据即可,没有数据的网络传输开销,能大大提升性能。



4. Doris还有一个有用的特性:Doris On ES。在我们的智能决策分析平台中有用到ES,而ES无法对多个index进行join查询。Doris On ES的特性非常完美地解决了我们这样的需求。Doris On ES的一个重要功能是支持过滤条件下推,将过滤条件下推到ES。这样就只有满足条件的数据才会被返回,能大大提升性能以及降低Doris和ES之间数据传输的性能消耗。在查询时,Doris的BE节点会根据就近原则,优先请求本地部署的ES节点,通过HTTP Scroll方式流式地从ES中获取数据。目前我们的ES集群和Doris集群就是混合部署在相同的服务器上,使用Doris On ES这一特性很有优势。



综合我们自己的业务场景,以及目前市面上开源的OLAP引擎的现状,我们最终选择了Doris+ES解决方案来开发我们的智能决策分析平台。平台整体采用hadoop 、Doris On ES的架构,充分发挥三款开源组件各自的功能优势,最终实现秒级人群多维度组合分析。





各自功能介绍:



Hadoop:它是一个分布式系统基础架构,适合大数据体量下的数据预处理,进行高吞吐的离线清洗、加工。在智能决策分析平台中它主要用于用户特征宽表的预处理,主要为用户特征,以及行转列处理。最终在hadoop将数据按照ES以及Doris的数据组织结构进行加工处理。



Doris:它是一款开源的OLAP分析引擎,可以实现灵活的多维分析 、支持丰富的数据模型、基于主键的实时自动更新。且Doris 的优点是易运维,易扩展和高可用,无外部系统依赖,部署和配置都很简单,可以一键加减节点,并自动均衡数据, Doris 的 FE 和 BE 都可以容忍少数节点挂掉。



而在智能决策分析平台中,Doirs主要实现秒级的大数据体量下的快速Join,以及多维度下的秒级聚合分析。另外它支持在Doris中创建ES的外部表,Doris On ES将Doris的分布式查询规划能力和ES(Elasticsearch)的全文检索能力相结合,提供更完善的OLAP分析,实现ES中的多index分布式Join查询,Doris和ES中的表联合查询,更复杂的全文检索过滤。而Doris目前不支持表的二级索引,所以当我们想要实现多维度组合的的人群过滤,它并不能支持。



ES:ES是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,ES在智能决策分析平台中主要实现千亿级别数据量下对人群进行多维度的秒级过滤筛选。ES的弱项是不支持快速地对数据进行Join操作。



3、重点应用



1、Broadcast Join



我们经常会有根据一批样本数据,进行多维度的关联查询,而样本数据往往数据体量不大,而关联的维度表却非常庞大,在Doris里面可以快速使用Broadcast Join进行秒级的关联查询。



2、Colocation Join



Broadcast Join解决的是小样本数据(百万内)与大数据体量也就是小表与大表之间的关联查询,而Colocation Join解决的就是大表与大表之间的秒级关联,在我们的平台中,分析建模人员经常需要对指定一批人群进行多维度的人群分析刻画,而这一批人群往往数据体量很庞大,这就涉及到了大表与大表间的关联查询。两者做关联使用Shuffle Join肯定是不合适,而Broadcast Join在筛选出来的数据量大的话显然也不合适,节点越多性能也会越差。Colocation Join提供的是本地行优化,来减少数据在节点之间的传输耗时,以此来加速查询。所以目前我们该场景就是用Colocation Join来解决大表与大表间的秒级关联。



3、Doris On ES



基于多维度人群筛选步骤,目前我们使用的是Doris On ES的解决方案。通过Doris,将条件下推到ES,筛选出我们想要的人群,拉到Doris之后再和画像宽表做关联得到画像的统计数据。目前我们还有一个样本提数的场景准备改造。以前该场景是基于SparkSQL的解决方案,每个任务的速度基本上是几分钟到二十多分钟不等。由于是使用Spark,并发量上不去,繁忙的时候排队现象比较严重。最近我们基于Doris On ES去测试相同的场景,提取一两百万的数据,都能在半分钟之内得到结果,该业务场景目前正在开发改造当中。



4、遇到的问题



我们从今年的5月份开始调研和使用Doris,由于平台开发时间比较紧,前期对Doris的调研和测试工作比较少,开发过程遇到了很多的问题,其中大部分是我们对Doris的配置不了解造成的。目前Doris发展很快,代码的迭代更新比较频繁,但官方文档对各种配置的说明没有跟上,这是我们认为Doris亟待改进的地方。



我们最开始使用的是apache的0.12.rc3版本,使用过程中遇到了一些bug,比如Doris On ES查询时,多个条件组合在一起就会查询失败、ES多索引同别名查询失败、BE内存写乱经常出现挂掉等。这些bug在我们的业务场景无法绕过的,所以我们在Doris开发者的建议下已经对Doris的版本升级过两三次了。以下是一些比较常见的问题以及解决方法:



1、客户端查询经常碰到 failed to initialize storage reader. 这类错误提示不太明确,只能到BE的log里面查看,原因一般都是内存不足,加大exec_mem_limit即可解决该问题。



2、failed to send brpc batch, error=The server is overcrowded. 大查询很容易会碰到这个异常,原因是BE之间shuffle大量的数据,最开始用的0.12.0-rc03版本BRPC socket_max_unwritten_bytes默认是64M,参数不可更改。之后增加了brpc_socket_max_unwritten_bytes参数,解决方法是升级版本,增大这个参数的值。



3、无法发挥机器多核并行计算的能力。原因一般有两个,一是FE的并行参数默认是1,需要自行更改,二是表设计不合理导致数据只落到一个bucket里面。



4、BE经常被系统干掉。原因是BE默认使用80%的物理内存,而我们是BE和FE以及ES混合部署,BE无法用到80%的内存。在进行耗内存的join查询时,BE经常因为占用大量内存而被系统干掉。这种情况基本上都是在测试环境机器配置比较低的时候遇到。解决办法是降低BE使用的内存占比以及FE的并发度。



5、不支持blob、text等文本类型,但是分析任务提交的参数有大量过滤标签以及分析标签等,想要将这些参数保存,却无法直接保存到Doris的一个或者varchar类型的字段里。原因是Doris默认限制了每张表中每一行数据的大小是100k。解决办法是修改max_layout_length_per_row参数来增大每一行的数据大小。



6、insert into/ stream load等可能会丢数据,原因是enable_insert_strict/strict_mode默认设置为false时,对于一些不符合表字段规范的数据会被过滤掉;设置为true的时候,只要遇到不符合规则的记录就抛出异常。



7、Document has not a scroll id field,ES多索引同别名异常或多条件组合查询异常。两种情况都是Doris On ES之前版本的一些bug,经过版本升级即可解决。



8、failed to send batch;intolerable failure in opening node channels ;Comparison method violates its general contract!,频繁出现异常还经常会导致BE挂掉。经Doris开发者分析,原因是之前的版本存在BE写内存错误的bug。后来我们升级到最新的版本,就没有再遇到这个问题。



9、bitmap在某些情况下查询会卡死,目前定位到原因是基数太大。一个bitmap超过了200M,rpc发送包时被拒绝了。解决办法是升级到最新版本,并修改参数brpc_max_body_size。



10、有时候元数据查询太慢,慢的时候大概耗时10秒。该问题已反馈给Doris的开发者,目前还在优化的过程中。



4、总结和展望



由于Doris项目历史比较长,一路走来,它的整体架构改动还是比较大的。在2018年贡献给Apache之后,开源社区给Doris项目增加了很多功能,比如Colocation Join、Bitmap支持都是开源之后才有的。目前Doris项目还在快速发展,还在不断地更新迭代,是一个处于高速发展期的开源产品,使用过程中难免会遇到一些问题。总体来说,Doris是一个优秀的产品。



在这里要非常感谢鼎石科技团队,特别是@赵纯和@李超勇两位大神热情、给力、靠谱的技术支持,为我们使用Doris提供有力的保证。目前我们使用Doris的解决方案在一些新场景下还在持续优化,也希望社区能尽快解决和采纳用户提出的各类问题和建议,这样就能给我们提供更多的优化方案,把Doris做得越来越好。



作者:罗义华,云真信大数据工程师



用户头像

DorisDB

关注

最好的国产MPP分析型数据库 2020.08.08 加入

还未添加个人简介

评论

发布
暂无评论
Apache Doris在云真信智能决策分析平台的应用实践