StarRocks在游族的多维分析场景与落地实践
导读:本文分享的主题是StarRocks在游族的多维分析场景,将从以下4个方面展开:游族OLAP系统历史背景StarRocks的特点和优势StarRocks在游族OLAP系统中的应用场景游族StarRocks应用的未来规划
分享嘉宾刘成彬游族网络资深大数据开发
编辑整理Henryhypers
出品社区DataFun
01hr游族OLAP系统历史背景
1。历史背景与痛点
首先分享一下我们的历史背景,上图是我们之前做实时和离线指标计算所使用的一些组件:分钟级别调度的指标计算:用Presto或者是Clickhouse。Kafka数据流的计算:用SparkStreaming或者Flink去读取并计算。标签表的计算:会导入一些标签表到HBase里面,然后通过DataAPI的方式去提供给其他的系统使用(比如我们公司是做游戏的,会有一些玩家的标签表在对接客服之类的系统,他们会实时去查看每一个玩家的信息,进行一些问题的解答,我们会提供这样的数据)。报表展示:报表的实时指标的结果会落到MySQL库里面,报表系统会直接读取MySQL作为指标的展示。
这些组件其实各有优势:比如Presto直联Hive,不需要做其他的操作,就可以做一些自主分析;ClickHouse的一些单表,查询性能也特别好。
但是慢慢的演变之后,我们就会产生特别多的组件,给我们带来了一些痛点:首先组件太多,维护多套组件的运维成本是比较高的。其次,各组件的SQL语法存在差异,特别是ClickHouse不支持标准SQL,所以开发维护任务的成本也会比较高。第三,同指标数据因为有多套系统在计算,需要去保证不同组件计算的结果和口径都一样,成本也是比较高。最后,我们的结果数据是落在MySQL里面的,有一些维度比较多的数据结果数据量是比较大的,需要对MySQL通过分表去支持数据的存储和查询,然而数据量大的时候,即使分表,其查询性能也比较差,所以我们的报表系统时间上响应会比较慢。
2。诉求
为了解决以上痛点,我们需要选择统一的OLAP引擎,该引擎至少要满足以下要求:数据秒级写入,低延迟毫秒级响应复杂场景多表关联查询性能好运维简单,方便扩展支持高并发易用性强,开发简单方便
我们对比了市面上一些组件,希望用一款存算一体的组件去优化我们的整个架构。首先,ClickHouse的使用和运维比较困难,并且多表关联的性能比较差,所以我们没有选择ClickHouse。我们又对比了StarRocks和Doris,因为StarRocks在性能上会更好,所以我们最终选择了StarRocks作为统一的OLAP引擎。
02hrStarRocks的特点和优势
1。极致的查询性能
StarRocks是有着极致的查询性能的,主要得益于以下的这几点:分布式执行MPP:一条数据一条查询请求会被拆分成多个物理的执行单元,可以充分利用所有节点的资源,这样对于查询性能是一个很好的提升。列式存储引擎:对于大多数的OLAP引擎来说的话,基本会选择列式存储,因为很多的OLAP场景当中,计算基本上只会涉及到部分列的一些提取,所以相对于行存来说,列存只读取部分列的数据,可以极大的降低磁盘IO。全面向量化引擎:StarRocks所有的算子都实现了向量化,向量化简单的理解就是它可以消除程序循环的优化,是实现了Smid的一个特性,也就是当对一列数据进行相同的操作的时候,可以使用单条指令去操作多条数据,这是一个在CPU寄存器层面实行的对数据并行操作的优化。CBO优化器:这是StarRocks从0开始设计的一款全新的优化器,在多表查询或者一些复杂查询的情况下,光有好的一些执行性能是不够的,因为同样的一条SQL,会有不同的执行计划,不同计划之间的执行性能的差异可能会差几个量级,所以需要一款更好的优化器,才能够选择出相对更优的一个执行计划,从而提升查询效率。
上面的图表是一个SSB的基准测试,把一个星型模型转变成了一个单表,然后用一些SQL查询语句去测试。在这种情况下可以看到StarRocks的性能是好于ClickHouse和Druid的。下面的图表是一些低基准数据聚合查询的对比,同样也是StarRocks的性能会显得更好一些。
2。丰富的导入方式
StarRocks还拥有着丰富的导入方式,用户可以根据自己的实际场景选择合适的导入方式。以前使用其他组件时,在大多数情况下我们都会选择一些其他的导入工具来帮助我们完成数据的导入,比如Sqoop、DataX,等等一些工具;但是StarRocks有丰富的导入方式,所以无需借助其他工具,对接大多数组件都可以通过StarRocks提供的这些导入方式去直接完成数据的导入,可以极大节省开发时间。
3。StarRocks的优势特点
StarRocks还有一些其他优势:
运维简单:右侧这个图是StarRocks一个简单的架构图,只有FE和BE两种组件,不依赖于外部组件,运维简单,并且也方便扩缩容。丰富的数据模型:StarRocks支持明细、聚合、更新、主键4种数据模型,同时它还支持物化视图,方便我们针对不同的场景去选择合适的数据模型。简单易用:StarRocks兼容MySQL协议,支持标准的SQL语法,不需要太多的学习成本就可以去直接使用它。支持多种外部表:StarRocks支持多种外部表,比如MySQL、ElasticSearch、Hive、StarRocks(这里指另一个集群的StarRocks)等等,做跨集群的、跨组件的关联查询也无需数据的导入,可以直接建立外部表,基于多个数据源去做关联查询,在一些分析当中是比较方便的。
03hrStarRocks在游族OLAP系统中的应用场景
1。实时计算场景家长监控中心
首先分享一个实质性比较高的场景。左侧图看到的是我们的一款小程序
这款小程序是根据文化部的指导和要求研发的,目的是为了加强家长对未成年参与网络游戏的监护,提供一种家长监护的渠道,可以使得家长能够看到未成年的一些游戏时长的数据或者是充值金额,从而对孩子进行游戏时长的限制和游戏充值的限制。
这需要我们为该游戏提供有各个未成年账号的一些实时的在线数据,或者是充值数据。右侧图是这一需求的数据流转图
我们会通过读取Kafka里面的数据在Flink当中进行计算,实时写入StarRocks,再通过DataAPI的方式去提供给小程序使用,因为跨部门协作,所以用DataAPI的方式去提供数据比较安全;我们也有一条离线覆盖的线路,因为在Flink计算,难免会有一些上报的数据存在网络延迟,在这个场景中数据都会实时更新到StarRocks,部分数据的计算可能会有一些差异,所以我们最终要用离线数据去覆盖。
这里因为我们会实时去更新账号信息,StarRocks可更新的特性也为我们提供了很大的方便。
2。实时更新模型选择
StarRocks中提供了两种模型可以用于数据的更新,这两种组件的内部机制是有所区别的,所以使用场景也不太一样。更新模型
内部是使用MergeonRead的方式去实现数据的更新的,也就是说StarRocks在底层操作的时候不会去更新数据,但是会在查询的时候实时去合并版本,所以同一主键的数据会存储多个版本;这样的好处是在写入的时候会非常流畅,但是也有坏处,在频繁导入数据的时候,主键会存在多个版本的数据,这对于查询性能会有所影响。主键模型
内部是使用DeleteandInsert(删除并更新)的方式,StarRocks会将主键存于内存中,在数据写入的时候,会去内存中找到这条数据,然后执行一个标记删除的操作,之后会把新的数据插入进去,最后合并的时候只需要过滤掉那些标记删除的数据就可以了,这样它的查询性能会比更新模型更高;因为我们的这一需求实时性要求是比较高的,所以更新特别频繁,最终的使用也是给小程序提供实时的服务,所以我们最终还是会优先考虑查询性能。我们更倾向于去选择主键模型,去作为表的数据模型。
3。主键模型不能使用Delete方式删除数据
前文提到离线覆盖实时的一个操作,场景是当我们在数据有一些差异的时候,需要用离线数据覆盖实时数据;使用StarRocks的主键模型进行这种操作时,其实并不是用Delete的方式去删除数据的,只能够通过StreamLoad、BrokerLoad、RoutineLoad等这三种导入的方式去删除数据,这是非常不方便的,导入时需要先提供一个标志位,去标明这是Upsert还是Delete;对于直接写SQL语句去删除是非常不友好不方便的,下图中是使用主键模型时删除数据的代码示例。
4。软删除
在这种情形下,我们会选择使用软删除的方式去标记删除,因为StarRocks主键模型能够更新数据的特性,可以使我们把这些需要删除的数据先查询出来,再变更它的一个删除标志位,这样就可以达到了删除的目的了。
数据在StarRocks的更新模型是可以支持删除操作的,但是在这种情况下,我们为什么还是选择主键模型,而不是去选择更新模型呢?主要是由以下的3点情况:第一,我们这个场景的数据更新,频率是非常高的,所以用更新模型的查询性势必会有所下降。第二,更新模型的删除也是有一些限制的,在删除条件比较复杂的情况下也是无法删除的;比如说只能够根据排序列去删除,或者是删除条件只能用与AND不能用或OR,或者是只能使用一部分的操作符,并不是所有的删除情况、所有的条件下都可以去删除;在我们的场景和删除条件下,在更新模型里面无法满足。第三,我们会用离线数据去覆盖实时数据,这两份数据其实是非常相近的,只会有很少的不一致,所以我们删除的冗余也是很少的;此外这个需求只会保留30天的数据,我们也会对表做一个动态分区,让StarRocks自己去对这些表的数据做一个生命周期的管理;总结下来,我们删除的无效数据是非常少的,也就是冗余会比较少,因此并不会影响到查询性能。
所以基于这三点原因,我们在这种场景下会更倾向于去选择主键模型。
5。报表实时指标计算架构介绍
接下来介绍一下报表的一些实时指标的计算,首先报表是固定维度的,我们会有各种时效性的指标,所以在引进StarRocks之后,我们的架构也做了一些变化。
首先,Flink会读取Kafka的数据,但是只做一些简单的ETL操作;其次,我们也会去跟HBase交互,实时生成比如账号首次登录表,或者是角色首登表这种信息,并且把这些信息关联到日志上面。做完上述操作之后,数据会写入到下级的Kafka,最终同时写入Hive和StarRocks里面。最终,指标计算会统一在StarRocks里面做分钟级别的调度,完成实时指标的计算,一些数据的逻辑分层也是在这里面做。
最终我们的报表系统也是以StarRocks为核心,直接读取StarRocks的结果数据,不需要再像之前一样,在一个组件里面计算完的数据还导到MySQL里面进行展示;此外,我们对外提供的数据存在StarRocks里面,也能够通过一个统一的DataAPI的方式去提供,因为它是支持多并发的。
6。数据关系模型转变
在数据建模方面,我们也有一些转变。以前在使用ClickHouse时,因为多表Join的能力不理想,我们的数据关系模型基本会使用一些大宽表,尽量使用单表查询,以保证查询性能;但宽表模型的问题是,一旦维度有所变化,回溯的成本是很高的。
在引入StarRocks之后,因为它有很好的多表Join的能力,所以我们尽量会去考虑星型模型或者雪花模型,当维度不变化的时候,我们不需要回溯的成本,可以直接用多表Join的方式去查询数据,同时也把事实表和维度表去解耦,以便去应对更多的灵活分析、多维分析的场景。
7。精确一次性保证
在精准一次性保证的方面,以前我们使用Flink写入ClickHouse的时候,是无法保证数据的精确一次性的,这样我们在下游做计算时,会去做各种去重的操作,比如说日志ID的去重,账号的去重、订单的去重等等。
在引入StarRocks之后,我们使用官方的插件FlinkConnector去写入,是可以保证数据的精确一次性的。虽然说我们计算原始日志,也会对日志做去重,因为我们不能够保证日志从手机端上报到我们最终落入StarRocks全链路的精确一致性;但是对于Flink处理过的数据,能够保证精确一次性,这对我们来说也是非常有意义的,能够减少一些后续的操作。
8。指标存储转变
以前实时计算的结果都会写入MySQL,需要借助其他工具,比如Sqoop、DataX,或者是程序写入等等;对于ClickHouse可能会用库引擎的方式或者是程序写入。
在引入StarRocks之后,实现了算存一体,不需要其他导入;在做查询分析需要关联其他组件的时候,我们也可以根据其他数据源建立外表,然后直接做查询分析;这对于数据的流通性来说是非常友好的,也更能方便我们的开发工作,比如一些adhoc临时的分析也不用导数,直接做一些多数据源的查询就可以了。
9。常用数据导入方式
实时数据:使用FlinkconnectorStarRocks,其内部实现是通过缓存并批量由StreamLoad导入。
离线数据:创建Hive外表,用InsertIntoSelect方式直接写入结果表。
实时数据
我们使用官方的FlinkConnector插件导入数据,它的内部是通过缓存并批量由StreamLoad去导入的,而StreamLoad是通过HTTP协议提交和传输数据。
FlinkSync数据并要支持精确一次性的话,需要外部系统支持两阶段提交的机制;但是StarRocks没有这个机制,所以精确一次性的导入依赖于StarRocks的Label机制,就是说在StarRocks当中,所有的导入数据都会有一个Label用于标识每一个导入的作业;Label相同时StarRocks会保证数据只导入一次,这样保证Flink到StarRocks的精确一次性。
Label默认保存三天,也可以通过参数去调节,但因为该机制下系统要查看它的Label是否存在,如果Label保存的时间过长,肯定影响导入性能,所以也不可能无限期的保存。只要我们做好任务的监控,在通常情况下,我们是可以保证数据精确一次性写入的。
离线数据
我们目前主要是把以前Hive的一些结果数据迁移到StarRocks,以及一些离线计算的结果,也会刷到StarRocks里面去,所以我们使用Hive外表这种方式,虽然该方式性能不如BrokerLoad,但更方便。这种导入方式也有一些需要注意的点,因为Hive的源数据信息,包括分区信息以及分区下的一些文件信息,都是存储在StarRocksFE中的,所以在更新Hive数据的时候,需要及时更新FE的缓存。
在StarRocks里面提供了三种缓存的更新方式,首先是自动刷新缓存,默认是两个小时会自动刷新一次;但是我们在导入离线数据的任务中,倾向于用第二种方式,就是手动的去刷新缓存,能保证下一个导入任务执行的时候,缓存就已经更新了;最后一种是自动增量更新,跟第一种的区别是能够自动的增量去更新,效率更高,所以也能够提升更新频率。
10。分区分桶选择
下面分享一下我们在StarRocks建表的时候会涉及到的分区分桶的选择。
先分区后分桶:如果不分区,StarRocks会把整张表作为一个分区;分区是使用Range方式,分桶是使用Hash方式。
分区选择:通常会从数据管理的角度来选择分区,第一要方便过滤数据;第二大多数情况下会选择时间分区,这样可以使用动态分区,能够自动的帮我们删减分区。
分桶选择:因为分桶是用哈希的方式落到各个文件上面,所以通常会选择一个高基数的列来作为分桶键,这样可以尽量保证数据在各个桶中是均衡的;分桶的个数我们会先去计算它的存储量,然后尽量将每个Tablet设置成500兆左右。
在使用初期也曾遇到过问题,我们按照官方指南分成8个桶或32个桶,后来发现按天分区的话,一天的数据是在一天这个分区里面去分桶,所以有些表就会小文件特别多,然后在查询的时候,扫描时间会特别长,这样也会降低查询性能,因为分桶是影响查询的并行度的,分桶如果太少,并行度会比较低,太多的话又会导致小文件比较多。
所以这需要我们在建表设置分桶的时候,就对这个表的数据量有一个预估,然后去选择合适的分桶个数。
11。慢查询分析
最后介绍下慢查询分析。
StarRocks也提供了一些慢查询分析工具,比如可以到日志里面去查看慢查询的信息,或者是到页面上去看它的Profile(如图所示)。
Profile是BE执行后的一个结果,包含了每一步的耗时和处理量的结果。当遇到慢查询时,你可以去具体分析这个SQL的执行情况,然后去通过对应的一些信息达到优化。
04hr游族StarRocks应用的未来规划
最后分享一下游族对于StarRocks使用的一些未来规划。
首先我们会将剩余的实时场景全部迁入到StarRocks里面,建立以StarRocks为核心的统一的查询分析平台。
我们之前的DataAPI服务其实是临时的,所以我们也会去完善,建成一个全面的集成StarRocks的DataAPI
最后,我们会完善StarRocks的一些监控,比如慢查询的监控、任务的监控、性能的监控等等。
05hr问答环节环节
Q1:谢谢成彬老师的分享,下面是问答环节,欢迎直播间的小伙伴们留言提问。祖玛提了第一个问题,他问家长中心的场景中延迟数据为什么不适用Flink在计算,而是用离线数据的方式去覆盖
A1:首先因为我们每条数据的计算,涉及到Flink状态的变更,还有我们StarRocks里面的数据也会变更,所以说如果我们要再把延迟的数据加入,会改变掉它原来的一个计算结果,因为我们的计算是有持续性的。
当逻辑复杂的时候,我们还要这样操作的话,首先是我们这样操作会特别的复杂,第二我们这样去回溯也是更浪费资源的,会把之前的很多数据再计算一遍,再就是我们在实现需求的时候,会先去观察我们整体链路的数据延迟情况,然后去设置一个合理的水位线去计算。
所以基于这些原因,我们最终选择了用离线覆盖的方式,去纠正我们的延迟数据。
Q2:谢谢成彬老师。第二个问题是威克特提的,他的问题是StarRocks可以确保数据的一致性,为什么还需要Hive进行一次数据覆盖?是出于什么考虑?
A2:因为StarRocks它是可以确保数据的一致性;在使用Flink实时计算的时候,它的时效性和准确性是有取舍的;因为你不知道可能是用户的网络原因,或者是数据采集的一些过程,都有可能导致数据的延迟。
比如你设置的一个就是实时计算的延迟是一分钟,只要有一条数据它在一分钟甚至是十分钟他都没有来的话,Flink计算的结果始终是不准确的(因为数据的延迟,在计算的时刻拿不到完整的数据去做计算)。
所以我们用离线计算覆盖,因为离线计算能够保证前一天的所有数据,所有能采集的都已经采集到了,这样的话我们去进行一个离线的覆盖。
今天的分享就到这里,谢谢大家。
分享嘉宾
刘成彬游族网络资深大数据开发
游族网络资深大数据开发,负责公司设备数据贯通,实时数仓建设与指标开发。
《数据智能知识地图》下载
上下滑动,查看《数据智能知识地图》数据集成板块(点击可看大图),关注公众号大话数智,下载完整版知识地图
DataFun新媒体矩阵
关于DataFun
专注于大数据、人工智能技术应用的分享与交流。发起于2017年,在北京、上海、深圳、杭州等城市举办超过100线下和100线上沙龙、论坛及峰会,已邀请超过2000位专家和学者参与分享。其公众号DataFunTalk累计生产原创文章900,百万阅读,近16万精准粉丝。
新的一年,体制人该有的断舍离!富贵在天,人各有命。在体制内工作,只能越活越明白,而不能越活越糊涂。新的一年,希望所有体制人都能断舍离,放弃幻想,认清现实,不求走得多远,只求通透豁达。01断掉不切……
从经济学视角看怎么把中国送入世界杯经济学讲究理性,不讲究灵性。隔壁韩国日本都能进入16强了,咱们还是个亚洲二流队。且看我怎么设计一个方案给中国捅咕进世界杯。〔呲牙〕为什么巴西足球强?因为在巴西穷人想要实现……
细数抗美援朝中被志愿军打败的联合国军伤亡(一)盘点一下被中国打败了的外国王牌军队,仔细一数会发现原来中国已经打败了大半个世界了。1950年6月,朝鲜半岛上的北、南双方的民族爆发内战,后以美国为首的联合国军参战(联合国……
弘一法师怨恨背叛和辜负你的人,伤的是自己,生活自会给他惩罚弘一法师说:若有人背叛和辜负你,请不要去怨恨他,怨恨别人伤的是自己,你只需停止付出,生活自会给他惩罚命运饶过谁,你只管善良,其他的,交给时间。大师的哲思智慧与博大胸襟,引……
好命不如好名郭沫若(18921978年),原名郭开贞,四川乐山人。当代著名诗人,历史学家,古文字学家。沫水(大渡河)和若水,是郭沫若家乡的两条河名。岳飞(11031142年),字鹏举……
1990年,外蒙发现大量文字,学者解读后汉朝军队在此地血战大考古的意义在于,发现过往细微足迹,探寻古时真相,还原历史人物,追溯文明历程。《封燕然山铭》发现于外蒙,石刻的中国汉字揭开了汉朝时期军队血战的故事。中蒙联合,揭开面纱……
建国十大元帅之朱德(1)1955年9月的共和国授衔中,年近70的朱德位列十大元帅之首。十大元帅当中,有毛主席口中的横刀立马的彭大将军;有16岁就当上军长,在淮海战役中叱咤风云的林大帅;有挺近大别山,挺……
秦始皇去世后,他的子孙后代都去哪了,为何现在很少人姓嬴?公元前230年,秦王嬴政剑指六国,命令内史腾率领秦军进攻韩国,正式掀起了一统天下的序幕。仅仅用了九年时间,便将山东六国各个击破,完成了统一大业,秦王嬴政也一跃成为了历史上……
换个角度看旬阳市蜀河古镇阳光讯(记者潘定安)这些年拍摄家乡旬阳蜀河古镇很多,总是在古巷老街转悠,影像里除了历史遗存下来的黄州馆,杨泗庙和清真寺以及曾记铁匠铺,老水井和骡马古道还有南门、北门和西门。蜀河……
印度人为啥爱吃咖喱?咖喱到底是个啥?吃了那么多次,终于清楚了给大家说一件关于在家制作咖喱土豆牛腩的趣事吧!半年前,爸妈参加老同事之间的聚会,回忆过往、畅谈往昔,到了中午一大群老太太们就去了一家自助餐厅,当然这也是他们提前就打听好了……
西汉的外戚专权还真的要算在汉武帝的头上外戚专权是中国古代历史上一个现象,但是真的是个常态并且造成了很大祸患的,基本上只能说是在两汉时代。对于外戚的解释,一般是指皇帝的母族和妻族。但是很少能够见到妻族的外戚能够……
林心如私服搭配还挺时髦,穿风衣配长筒靴,搭上围巾精致又高级女明星们在舞台上总是光鲜亮丽的,但日常生活中的她们其实也很低调,就像林心如她这一次的私服穿搭看上去就非常的清新简约,挺时髦,穿风衣配长筒靴,搭上围巾精致又高级,再将头发扎着半扎……