有一个基于MDX的开源内存OLAP服务器吗?

10

我想知道是否有一个内存中的OLAP服务器可以处理MDX。

我找到了维基百科文章。 但它没有提到内存功能...

我所知道的唯一一个是Mondrian,它也是上述维基文章中提到的两个开源解决方案之一。

到目前为止,我只是稍微使用过Mondrian...我不认为Mondrian是真正的内存 OLAP 服务器。
原因如下:
它具有内存缓存,其中包含查询结果。 但是它们的第一次执行需要很长时间,并且必须从RDBMS加载。(http://mondrian.pentaho.com/documentation/faq.php#Scalability
我认为更好的方法是:
将所有事实和维度表加载到缓存中,然后在这些内存数据上执行每个查询。

据我所知,Oracle将在今年推出12c企业版,其中有可能(或全部)将一些表置于内存中。 这将加快OLAP服务器的速度,该服务器仅使用SQL查询RDBMS事实表。
...但企业版非常昂贵...

我想听听其他人的意见。

最好的问候,
丹尼斯。


2
您可以通过在ETL完成后运行要保存在内存中的查询来预热Mondrian的缓存。但是,当您说“在内存中”时...显然,您的事实表不是一个拥有数十亿行事实的多维数据集,否则将无法将所有内容存储在RAM中。这就是为什么Mondrian甚至不尝试加载所有内容的原因,它应该处理多TB的立方体,试图将所有内容都保存在内存中是毫无意义的。直到某个特定的详细级别...那就是完全不同的游戏了。 - nsousa
1
预热Idea听起来像是一个好的且易于实现的解决方法,谢谢。关于cube-size的一些建议:我认为每月5GB的数据和过去3年的数据将会是一个olap系统中180GB的内存表。Cube的数据大部分时间都是预聚合的,例如客户每天/每月的收入。因此,即使DWH是多TB的,Datamart和Cube也不必那么大...顺便问一下,如果你的Cubes是多TB大,你如何加速Mondrian? - DennisH
3
有太多方法可以提高性能,这本身就可以成为一本书。以下是几个通用的想法:1)切换到高性能的列式数据库(例如Vertica、InfiniDB、MonetDB等);2)使用索引、索引和索引(在Vertica中为投影;在InfiniDB中没有;在Monet中为索引);3)聚合表(Mondrian选择最小的聚合表,以满足我们所请求的细节级别);4)缓存,大量缓存,并在多个级别上进行缓存(数据库缓存、Mondrian缓存、查询结果缓存等);5)与数据库的网络路径;6)如果MDX查询过于复杂,应将其简化并分解为若干部分。等等…… - nsousa
2
@nsousa 给出了很好的建议。我还想再提一个:IO 瓶颈。在一个项目中,我们使用了 512GB 的 RAM 作为 DWH 存储。在其他任何 DWH 项目中,我都坚持使用 SSD 硬盘。 - fenix
目前该项目的MDX界面不太流行,但它确实能够工作,并且非常快。这不仅是因为它是内存中的,还因为底层的C引擎可以处理data.table包中的查询:https://github.com/jangorecki/data.cube 我希望有一天能够重新启动这个项目,并最终添加MDX界面支持。 - jangorecki
1个回答

0
在ActiveViam,我们开发了Sparkube,这是Apache Spark的扩展,它将任何Apache Spark数据集公开为OLAP立方体,您可以使用Excel数据透视表、Tableau软件或ActiveUI(直接嵌入Sparkube的Web前端)查询MDX。聚合在Spark集群中分布,并在内存中实时执行。

http://activeviam.com/sparkube

Sparkube 中的 MDX 引擎是我们在商业 ActiveViam 分析平台中开发的引擎, 因此它被许多人使用和测试。
下面是一个例子,演示如何将 CSV 文件的内容存储到内存中,并将其作为多维立方体进行展现:
// Load a file into a Spark dataset.
// Here we load a CSV file, get the column names from
// the CSV headers, and use Spark automatic type inference.
var ds = spark.read
  .format("csv")
  .option("header","true")
  .option("inferSchema","true")
  .load("path/to/file.csv")

// Import the sparkube library (the sparkube jar must be in the classpath)
import com.activeviam.sparkube._

// Expose the dataset as a multidimensional cube.
// You can start visualizing the cube right away at http://localhost:9090/ui
// or connect from Excel with the XMLA protocol at http://localhost:9090/xmla
new Sparkube().fromDataset(ds)
  .withName("My first cube")
  .expose()

3
如果您在链接中提到自己的项目/应用/服务,需要披露这是您自己的。如果您没有披露这一点,通常会被视为垃圾邮件。请参见:什么是“好”的自我推广?如何避免成为垃圾邮件发送者 - Samuel Liew
1
哇,非常好的想法!这就像是一个针对Spark的OLAP驱动程序,不是吗? - Thomas Decaux
是的,说得很好。Sparkube就像Apache Spark的OLAP驱动程序;它实现了MDX查询语言和XMLA协议(多维OLAP的两个标准),并将所有数据处理委托给Spark。 - Antoine CHAMBILLE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接