2G内存搞定一亿数据的分析引擎

简介: EuclidOLAP是一个可以在低配置服务器上执行上亿数据量分析并且快速响应和支持复杂查询的开源OLAP数据库。

运行大数据服务对服务器的配置要求是比较高的,相应的经济成本也不会低。本人做数据分析相关工作,一直在寻找高性能低成本的开源OLAP引擎,但是并没有找到,既然这样,那就自己搞一个。

EuclidOLAP

EuclidOLAP是我搞的一个开源OLAP多维数据库,它目前具有以下的几个特点:

  • 针对百亿级别数据量查询时可以达到毫秒级响应;
  • 能够支持非常复杂的查询,包括跨模型的关联查询;
  • 支持实时的增删改查;
  • 可以部署为集群模式,也能以单机模式运行在低配置服务器上。

在将来EuclidOLAP将会演化成基于云原生、容器、弹性资源的存算分离的架构模式。

EuclidOLAP的Github地址:https://github.com/EuclidOLAP/EuclidOLAP

剩下的内容分为两部分,首先简要介绍一下EuclidOLAP的数据模型与存储结构,然后在一台3G内存的低配服务器上运行一个EuclidOLAP示例并对一个一亿数据量的模型进行分析。

数据模型与存储结构

EuclidOLAP采用了立方体(Cube)和维度(Dimension)作为数据模型,如下所示:

维度就相当于坐标轴,你可以将一个关联个N个维度的Cube想象成一个N维立方体,同时把所有度量值想象成是存储于一个多维数组中。多维数组结构会带来一个严重的问题——内存容量爆炸,为了解决这个问题,像Cogons、Essbase这些传统多维数据库的解决办法是采用稀疏维和密集维结构:稀疏的几个维度被构建为索引,密集的维度则被构建为数据块——相对密集的更小的多维数组。

由于根据密集维构成的数据块也会存在数据空洞,所以上述的这种数据结构也会浪费掉一些内存。

EuclidOLAP的解决办法是在多维数组元素前面添加坐标偏移量,然后进行完全压缩,这样虽然也需要额外的内存来存储偏移量数据,但其消耗的内存相对于前面那两种结构来说是可以忽略不计的。

EuclidOLAP会同时构建一个索引结构,它会根据数据偏移量进行快速定位,以确定度量数据的坐标和聚合查询时的数据范围。

在逻辑层面,EuclidOLAP的这个索引结构很像图-2中稀疏维索引,但不同之处在于EuclidOLAP的这个索引结构可以表示从全部稀疏维到全部密集维的各种情况,我给它起了个名字——弹性索引结构。

在一个关联个N个维度的Cube中,弹性索引可以表示N+1种索引结构:

在逻辑模型层面,你还是可以将EuclidOLAP Cube中的度量数据想象成是存储于一个有着大量数据空洞的巨大的多维数组之中。

这种弹性索引结构同样存在问题,在新增数据时会导致整个数据结构的变化,我会在以后的文章中专门来介绍针对这个问题的解决办法。

接下来进入实践环节。

运行EuclidOLAP服务实例

EuclidOLAP中自带了一个一亿数据量的Cube,它需要占用不到2G内存,我在一台2400M内存的机器上运行过,你需要准备一台CentOS、Redhat、Ubuntu或Debian服务器,内存最好不低于3G。

EuclidOLAP自带了一个名为Nile Online Store的Cube,它关联了六个维度:日期(Date )、地区(Region )、商品(Goods )、支付方式(Payment Methods )、客户类型(Customer Types )、销售渠道(Sales Channels )。

点击这个链接查看这6个维度的详细结构:http://www.euclidolap.com/attachments/nos.html

这个Cube有一个度量值:Sales,为了演示方便,所有的明细度量值都是1。

EuclidOLAP支持多维数据库的标准语言——MDX(Multi-Dimensional Expressions ),它在语法结构上类似于SQL,不同之处在于MDX在语义层面直接描述多维结构,它对于复杂分析的支持能力要强于SQL。

按下面的步骤下载并运行EuclidOLAP服务:

wget https://sysbase.oss-cn-beijing.aliyuncs.com/EuclidOLAP-v0.1.6.1.tar.gz
tar zxvf EuclidOLAP-v0.1.6.1.tar.gz
cd EuclidOLAP
./bin/start.sh &

查看日志:

tail -n 5 log/euclid.log

当日志中显示了Net service startup on port 8760内容时表示EuclidOLAP已经成功运行。

第一个MDX是一个执行全汇总的查询

select
    [Measures].Sales on 0,
    Date.[ALL] on 1
from [Nile Online Store];

在EuclidOLAP目录中运行olap客户端工具:

./bin/olap-cli

执行MDX查询:

这个查询将全部明细数据汇总查出,结果是100000000。

第二个MDX对明细数据进行查询

它在商品维度(Goods )、支付方式维度(Payment Methods )、客户类型维度(Customer Types )和销售渠道维度(Sales Channels )上进行了限定,然后按日期维度(Date )和地区维度(Region )查看Sales度量值:

select
    {Date.[2022].Q1, Date.[2022].Q2, Date.[2022].Q3, Date.[2022].Q4} on 0,
    {Region.Europe.France, Region.Europe.Germany, Region.Europe.[United Kingdom]} on 1
from [Nile Online Store]
where
([Goods].[Foodstuff].[Drink].[Tea], [Payment Methods].[PayPal], [Customer Types].[New customers], [Sales Channels].[Direct sales]);

执行这个MDX将立即返回结果。

第三个MDX与第二个类似

它没有在日期和地区之外的其他维度进行限定,该查询将在其他四个维度上进行汇总。日期和地区维度分别指定了年份和洲级别的维度成员,这要比第二个MDX具有更高的汇总粒度。

select
    {Date.[2020], Date.[2021], Date.[2022]} on 0,
    {Region.Asia, Region.Europe, Region.[North America]} on 1
from [Nile Online Store];

第四个MDX是一个复杂逻辑的查询

它将按地区查询2022年总体销售额最高的那个季度的前三种畅销商品的销售数据:

select
    CrossJoin(
        TopCount(Date.[2022].Children, 1, [Measures].Sales),
        TopCount(LateralMembers([Goods].[Foodstuff].[Drink].[Tea]), 3, [Measures].Sales)) on 1,
Region.ROOT.Children() on 0
from [Nile Online Store];

最后说一下MDX这个东西。MDX 与SQL 语法相似,如同SQL 查询一样,每个MDX 查询都要求有SELECT、FROM 和可选的WHERE部分。SQL的语义模型描述Table结构,MDX的语义模型描述Cube结构,相同的一套业务模型可以放在SQL星型表结构中,也可以放在MDX Cube模型中,但是基于Cube使用MDX能更好的支持复杂且比SQL更加直观。关于MDX的详细介绍我也会发布在以后的文章中。

相关实践学习
数据库实验室挑战任务-初级任务
本场景介绍如何开通属于你的免费云数据库,在RDS-MySQL中完成对学生成绩的详情查询,执行指定类型SQL。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
5天前
|
存储 编译器 C语言
数据存储以及内存
数据存储以及内存
17 1
|
11天前
|
存储 安全 Java
synchronized原理-字节码分析、对象内存结构、锁升级过程、Monitor
本文分析的问题: 1. synchronized 字节码文件分析之 monitorenter、monitorexit 指令 2. 为什么任何一个Java对象都可以成为一把锁? 3. 对象的内存结构 4. 锁升级过程 (无锁、偏向锁、轻量级锁、重量级锁) 5. Monitor 是什么、源码查看(hotspot虚拟机源码) 6. JOL工具使用
|
17天前
|
存储 小程序 编译器
数据在内存中的存储(探索内存的秘密)
数据在内存中的存储(探索内存的秘密)
111 0
|
18天前
|
存储 监控 NoSQL
Redis处理大量数据主要依赖于其内存存储结构、高效的数据结构和算法,以及一系列的优化策略
【5月更文挑战第15天】Redis处理大量数据依赖内存存储、高效数据结构和优化策略。选择合适的数据结构、利用批量操作减少网络开销、控制批量大小、使用Redis Cluster进行分布式存储、优化内存使用及监控调优是关键。通过这些方法,Redis能有效处理大量数据并保持高性能。
38 0
|
4天前
|
Java
堆内存的溢出案例分析
堆内存的溢出案例分析
4 0
|
5天前
|
JSON 数据管理 测试技术
自动化测试工具Selenium Grid的深度应用分析深入理解操作系统的内存管理
【5月更文挑战第28天】随着互联网技术的飞速发展,软件测试工作日益复杂化,传统的手工测试已无法满足快速迭代的需求。自动化测试工具Selenium Grid因其分布式执行特性而受到广泛关注。本文旨在深入剖析Selenium Grid的工作原理、配置方法及其在复杂测试场景中的应用优势,为测试工程师提供高效测试解决方案的参考。
|
6天前
|
存储 C语言
[C进阶] 数据在内存中的存储——浮点型篇
[C进阶] 数据在内存中的存储——浮点型篇
|
6天前
|
存储 小程序 编译器
[C进阶] 数据在内存中的存储——整形篇
[C进阶] 数据在内存中的存储——整形篇
|
9天前
|
存储 小程序
数据在内存中的存储
数据在内存中的存储
17 1
|
11天前
|
存储 算法 编译器
C语言:数据在内存中的存储`
C语言:数据在内存中的存储`
20 0