流式传输存储在 Cassandra 中的金融时间序列 - 性能不佳
本文关键字:时间序列 金融 性能 传输 存储 Cassandra | 更新日期: 2023-09-27 18:30:45
我们正在评估Cassandra与金融时间序列数据的使用,并试图了解以最高性能的方式存储和检索所需数据的最佳方式。我们在已分配了 8 个内核和 8Gb RAM 的虚拟机上运行 Cassandra。主机的剩余资源(另外 8 个内核和 12Gb RAM)用于开发测试客户端应用程序。我们的数据目前存储在平面文件中,每天大约 100-150Gb(未压缩)。在从 cassandra 检索数据方面,我们需要能够流式传输:
- 所有数据 - 即按时间戳排序的一整天所有证券的流数据
- 特定时间段的所有数据,这是按时间戳排序的整天的子集
- 证券子集和特定时间段的数据,该时间段是按时间戳排序的全天子集。
到目前为止,我们已经尝试使用具有以下架构的表基于安全性和日期对数据进行分区:
create table MarketData (
Security text
,Date date
,Timestamp timestamp
...
other columns
...
primary key((Security,Date),timestamp));
但是,当我们从 C# 客户端应用程序中执行简单的分页查询时,如下所示,检索 50K 条记录大约需要 8 秒,这非常糟糕。我们尝试了不同的页面大小,大约 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似乎不太适合。
我们还基于分钟使用以下模式进行了部分化:
创建表市场数据 (年份,月份整数,日内,小时整数,分钟整数,安全文本,时间戳时间戳...其他列...主键((年,月,日,小时,分钟),时间戳));
但是,我们担心的是,我们对通过简单的"选择"语句的结果进行分页的逐页测试非常糟糕。
我们是否以错误的方式处理事情?我们的配置可能不正确吗?或者Cassandra可能不是我们想要实现的目标的合适大数据解决方案?
谢谢
"....性能差..."
"我们正在虚拟机上运行 Cassandra"
我认为这两个突出显示的词:)相关。出于好奇,您的硬盘驱动器的性质是什么?共享存储 ?桑?旋转盘?固态硬盘 ?共同硬盘?
此外,这种模式在跨分区选择SORTED数据方面也会有问题(即对于多个证券)
确切地说,Cassandra 不按分区键排序。您可能需要使用主键((time_period),安全性,时间戳)创建另一个表(或物化视图,新的Cassandra 3.0功能),以便您可以按安全性排序
我们是否以错误的方式处理事情?
是的,为什么要在虚拟机上进行"性能基准测试"?这两个想法是相当相反的。Cassandra的一般建议是使用专用硬盘驱动器(至少是旋转磁盘,最好是SSD)。Cassandra 读取性能与您的磁盘 I/O 密切相关。
使用虚拟机和虚拟化存储,您可以停用磁盘吞吐量的所有 Cassandra 优化。在虚拟化磁盘上写入顺序数据块并不能保证数据按顺序有效地写入,因为虚拟机管理程序/虚拟磁盘控制器可以对它们进行重新排序,以在实际物理磁盘上的多个块之间拆分
虚拟机上的Cassandra部署仅适用于P.O.C验证数据模型和查询。您需要有专用的物理硬盘驱动器来使用 Cassandra 对数据模型的实际性能进行基准测试。