存储在Cassandra中的流媒体财务时间序列 - 性能不佳

时间:2016-01-18 12:35:39

标签: c# cassandra bigdata nosql

我们正在评估Cassandra与财务时间序列数据一起使用,并试图了解以最高性能方式存储和检索所需数据的最佳方法。我们在虚拟机上运行Cassandra,已经分配了8个内核和8Gb RAM。主机的剩余资源(另外8个内核和12Gb RAM)用于开发测试客户端应用程序。我们的数据目前存储在平面文件中,每天大约100-150Gb(未压缩)。在从cassandra检索数据方面,我们需要能够流式传输

  1. 所有数据 - 即按时间戳排序的一整天所有证券的流数据
  2. 特定时间段内的所有数据,这是按时间戳排序的整天的子集
  3. 证券子集的数据和特定时间段的数据,该时间段是按时间戳排序的整天的子集。
  4. 到目前为止,我们已尝试使用具有以下架构的表格对基于安全性和日期的数据进行分区:

    create table MarketData (
    Security text
    ,Date date
    ,Timestamp timestamp
    ...
    other columns
    ...
    primary key((Security,Date),timestamp));
    

    但是,当我们在C#客户端应用程序中执行如下所示的简单分页查询时,大约需要 8秒来检索50K记录,这非常差。我们尝试了不同的页面大小和大约的页面大小。 450似乎给出了最不好的结果。

    var ps = client.Session.Prepare("select security, date, timestamp, toUnixTimestamp(timestamp), from marketdata where security = ? and date = ?");
    int pageSize = 450;
    var statement = ps.Bind("AAPL_O",new LocalDate(2016,01,12)).SetPageSize(pageSize);
    stopwatch.Start();
    var rowSet = client.Session.Execute(statement);
    foreach (Row row in rowSet)
    {
    }
    stopwatch.Stop();
    

    此外,这种模式在跨分区选择SORTED数据(即多个证券)方面也存在问题,因为它涉及跨Cassandra似乎不太适合的分区进行排序。

    我们还基于以下架构以分钟为基础进行了分离:

    创建表MarketData( 年份int, 月份int, Day int, 小时int, 分钟int, 安全文本 ,时间戳时间戳 ... 其他专栏 ... 主键((年,月,日,小时,分钟),时间戳));

    然而,我们担心的是,我们对简单的“选择”陈述结果进行分页的测试是如此糟糕。

    我们是否以错误的方式接近事物?我们的配置可能不正确吗?或者Cassandra可能不适合我们想要实现的目标吗?

    由于

1 个答案:

答案 0 :(得分:1)

" .... 表现不佳 ...."

"我们在虚拟机上运行Cassandra "

我认为这两个突出显示的单词是相关 :)。出于好奇,您的硬盘的性质是什么? 共享存储空间 SAN ?旋转盘? SSD?互惠硬盘?

  

此外,这种模式在跨分区选择SORTED数据(即多个证券)方面也存在问题

确切,Cassandra不按分区键排序。您可能需要使用 PRIMARY KEY((time_period),安全性,时间戳创建另一个表格(或具体化视图,新的 Cassandra 3.0 功能) ),以便您可以通过安全

订购
  

我们是否以错误的方式接近了事情?

是的,你为什么要做" 效果基准"在虚拟机上?这两个想法非常矛盾。 Cassandra的一般建议是使用专用硬盘驱动器(至少旋转磁盘,最好是SSD)。 Cassandra读取性能与您的磁盘I / O密切相关。

借助虚拟机和虚拟化存储,您可以停用所有Cassandra优化磁盘吞吐量。在虚拟化磁盘上写入顺序数据块并不能保证数据是按顺序有效写入的,因为虚拟机管理程序/虚拟磁盘控制器可以重新排序它们以分割实际物理磁盘上的多个块

虚拟机上的Cassandra部署仅适用于P.O.C来验证数据模型&查询。您需要拥有专用的物理硬盘来与Cassandra对数据模型的实际性能进行基准测试。