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

本文涉及的产品
云原生数据仓库AnalyticDB MySQL版,基础版 8ACU 100GB 1个月
简介: 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 &
AI 代码解读

查看日志:

tail -n 5 log/euclid.log
AI 代码解读

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

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

select
    [Measures].Sales on 0,
    Date.[ALL] on 1
from [Nile Online Store];
AI 代码解读

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

./bin/olap-cli
AI 代码解读

执行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]);
AI 代码解读

执行这个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];
AI 代码解读

第四个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];
AI 代码解读

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

相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
打赏
0
2
2
0
1
分享
相关文章
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
35 4
AI代理内存消耗过大?9种优化策略对比分析
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
go的内存逃逸分析
内存逃逸分析是Go编译器在编译期间根据变量的类型和作用域,确定变量分配在堆上还是栈上的过程。如果变量需要分配在堆上,则称作内存逃逸。Go语言有自动内存管理(GC),开发者无需手动释放内存,但编译器需准确分配内存以优化性能。常见的内存逃逸场景包括返回局部变量的指针、使用`interface{}`动态类型、栈空间不足和闭包等。内存逃逸会影响性能,因为操作堆比栈慢,且增加GC压力。合理使用内存逃逸分析工具(如`-gcflags=-m`)有助于编写高效代码。
105 2
|
8月前
|
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
238 62
kafka 的数据是放在磁盘上还是内存上,为什么速度会快?
Kafka的数据存储机制通过将数据同时写入磁盘和内存,确保高吞吐量与持久性。其日志文件按主题和分区组织,使用预写日志(WAL)保证数据持久性,并借助操作系统的页缓存加速读取。Kafka采用顺序I/O、零拷贝技术和批量处理优化性能,支持分区分段以实现并行处理。示例代码展示了如何使用KafkaProducer发送消息。
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
245 57
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
241 12
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
198 1
AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等