OLAP,On-Line Analytical Processing,在线分析处理,主要用于支持企业决策管理分析。区别于OLTP,On-Line Transaction Processing,联机事务处理。
OLTP 主要用来记录具体某类业务事件的发生,如交易行为,当行为产生后,数据库会记录这个事件是谁在什么时候什么地方做了什么事,这样的一行(或多行)数据会以(增删改)的方式在数据库中进行数据的更新处理操作,要求实时性高、稳定性强、确保数据及时更新成功,常见的业务系统如商场系统,ERP,客服系统,OA等系统都是基于OLTP开发的系统。
当业务发展到一定程度,积累了一些数据的时候,对过去发生的事情做一个总结分析的需求就会产生,这类需求往往需要把过去一段时间内产生的数据拿出来进行统计分析,从中获取我们想要的信息,为公司做决策提供支持,我们管这类场景就叫做OLAP。OLAP的优势:丰富的数据展现方式、高效的数据查询以及多视角多层次的数据分析。
我们常说OLTP是数据库的应用,OLAP是数据仓库的应用,两者主要的区别如下图:
OLAP的多维分析操作包括:钻取(Drill-down)、上卷(Roll-up)、切片(Slice)、切块(Dice)以及旋转(Pivot)。
钻取:维的层次变化,从粗粒度到细粒度,汇总数据下钻到明细数据。eg:通过季度销售数据钻取每个月的销售数据
上卷:钻取的逆,向上钻取。从细粒度到粗粒度,细粒度数据到不同维层级的汇总。eg:通过每个月的销售数据汇总季度、年销售数据
切片:特定维数据(剩余维两个)。eg:只选电子产品销售数据
切块:维区间数据(剩余维三个)。eg:第一季度到第二季度销售数据
旋转:维位置互换(数据行列互换)。eg:通过旋转可以得到不同视角的数据
OLAP按存储器的数据存储格式分为ROLAP(Relational OLAP)、MOLAP(Multi-dimensional OLAP)和 HOLAP(Hybrid OLAP)。
首先是日常交易、售后业务等业务板块的数据自助分析。运营业务侧需要实时统计订单销量、商品库存相关指标,估算订单的单量、增速是否达到策略的预期效果,库存异常波动原因、库存及时调动补充等。售后客服侧则需要根据实时指标去评估日常工作,更好的开展管理工作。
另外一个场景是大促活动期间的实时看板展示,在大型活动促销期间需要整个供应链和销售的实时数据,从用户流量到用户转化到订单、商品、库存等漏斗分析,让运营侧可以按照当前的数据及时调整活动策略,提升转化率。对大促活动期间的指标分析,也是一个很典型的多维分析的过程,OLAP平台要满足每天几万次的查询调用需求,查询的时延要保证在百毫秒级。
OLAP平台选型时对公司多个业务团队的需求做了调研,总结来讲,大家对以下几个点关注度会比较高,比如超大数据规模的支持,单个数据源可能每天有上十亿的数据量需要录入;查询时延,要保证在毫秒到秒级;数据实时性,很多业务线明确提出实时数据分析的需求;另外还有高并发查询、平台稳定性等。
根据对用户的调研,以及对比了各种OLAP在不同场景下的应用,我们得出了如下的OLAP分析架构图:
物化视图
什么是物化视图,假设一个数据源的原始维度有十个列,通过分析查询请求发现,group1中的三个维度和group2中的三个维度分别经常同时出现,剩余的四个维度可能查询频率很低。更加严重的是,没有被查询的维度列里面有一个是高基维,就是 count district 值很大的维度,比如说像 User id 这种。这种情况下会存在很大的查询性能问题,因为高基维度会影响 Druid 的数据预聚合效果,聚合效果差就会导致索引文件 Size 变大,进而导致查询时的读 IO 变大,整体查询性能变差。针对这种 case 的优化,我们会将 group1 和 group2 这种维度分别建一个预聚合索引,然后当收到新的查询请求,系统会先分析请求里要查询维度集合,如果要查询的维度集合是刚才新建的专用的索引维度集合的一个子集,则直接访问刚才新建的索引就可以,不需要去访问原始的聚合索引,查询的性能会有一个比较明显的改善,这就是物化视图的一个设计思路,也是一个典型的用空间换时间的方案。
缓存查询
为了提升整体查询速度,我们引入了 Redis 作为缓存,如果只是简单的按照每次查询 sql 结果进行缓存的话则存在一个问题,每次不同用户查询的时间周期不一致,导致命中缓存的比例较低,查询性能提升不是很明显。为了提高缓存复用率,我们需要增加一套新的缓存机制:我们按照拆解表的最细时间粒度,按照天和小时进行数据的缓存。当用户进行查询的如果只是部分时间跨度的结果命中 redis ,则只查询未命中的时间跨度,然后将查询的结果和 redis 中的缓存数据拼接返回给用户,进而提升查询效率。
冷热数据分层
通过配置每个节点的数据分配策略,让高频查询的数据尽量多的分散在不同的broker,减少单个节点的查询压力,调整 History Node配置参数。
#集群分片,不写默认_default_tier
druid.server.tier=hot
#查询优先级,不写默认0,_default_tier分片的两个节点为0,hot节点的都改为100。这样,热数据只会查hot节点的机器。
druid.server.priority=100
#processing.buff,默认是1G
processing.buff = 4G
#processing.numThreads:默认是繁忙时core-1做process,剩余的1个进程做与zk通信和拉取seg等。
druid.processing.buffer.sizeBytes=1073741824
druid.processing.numThreads=30
在 ClickHouse 的聚合查询中,每个机器都会把自己的聚合的中间状态返回给分布式节点,也就是说,即使你只是想要Top100,每台机器也会把自己所拥有的所有枚举值都返回给分布式节点进行进一步的聚合。ClickHouse 的聚合过程大致如下图:
开启分布式查询优化后的执行图,如图所示,可以提前进行数据过滤,提升查询效率:
跳数索引
clickhouse 数据库为列式数据库,其本身并没传统关系型数据库中所指的二级索引,clickhouse 提供了一种适用于列存检索的跳数索引算法来替代二级索引。
在生产中只对枚举值比较多的字段诸如订单id,商品id用 bloom_filter 跳数索引,其他索引没有使用,因为 bloom_filter 的索引文件不至于太大,同时对于值比较多的列又能起到比较好的过滤效果。
避免使用final
ClickHouse 中我们可以使用 ReplacintMergeTree 来对数据进行去重,这个引擎可以在数据主键相同时根据指定的字段保留一条数据,ReplacingMergeTree 只是在一定程度上解决了数据重复问题,由于自动分区合并机制在后台定时执行,所以并不能完全保障数据不重复。我们需要在查询时在最后执行 final 关键字,final 执行会导致后台数据合并,查询时如果有 final 效率将会极低,我们应当避免使用 final 查询,那么不使用 final 我们可以通过自己写SQL方式查询出想要的数据,举例如下:
create table t_replacing_table(
id UInt8,
name String,
age UInt8
) engine = ReplacingMergeTree(age)
order by id;
insert into t_replacing_table values (1,'张三',18),(2,'李四',19),(3,'王五',20);
insert into t_replacing_table values (1,'张三',20),(2,'李四',15);
#自己写SQL方式实现查询去重后的数据,这样避免使用final查询,效率提高
SELECT
id,
argMax(name, age) AS namex,
max(age) AS agex
FROM t_replacing_table
GROUP BY id
本文主要介绍了转转OLAP分析架构的选型和实践,通过引入 Druid 和 Clickhouse ,解决了公司当前场景下的多维分析需求。但目前 OLAP 能够支持的场景还是比较受限,对于高并发的自助分析场景和多表的关联分析等方面的支持还不友好,后续希望能做一个能够支持明细、聚合分析,还有关联场景的 OLAP 平台,进一步提升公司的实时 OLAP 分析能力。
本文名称:转转实时OLAP分析场景技术选型与应用实践
新闻来源:http://www.csdahua.cn/qtweb/news5/474005.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网