使用昆德拉 ORM 编写 Cassandra 的性能
Posted
技术标签:
【中文标题】使用昆德拉 ORM 编写 Cassandra 的性能【英文标题】:Write performance of Cassandra with Kundera ORM 【发布时间】:2015-12-29 07:24:03 【问题描述】:我正在设计一个应用程序,该应用程序将接受来自面向客户的系统的数据/事件,将它们持久化以供审核,并在下游系统需要在任何数据馈送中进行更正时充当重播消息的源。
我不打算对这些数据进行太多分析(这将在下游系统中完成)。但我应该保留这些数据并让运行临时查询。
我的系统的几个特点
(1) 99 % 写入 - 1 % 读取 (2) 高写入吞吐量(大约每秒 30000 个事件,每个事件中大约有 100 个属性) (3) 数据的动态性。无法符合固定架构。
这些特性让我将 Apache cassandra 视为一个选项,可以使用widerow 功能或映射来存储我的属性。
我用单节点和 Kundera ORM 做了一些示例来将事件写入映射,并获得每秒 1500 个事件/线程的最大写入吞吐量。我可以通过更多线程和 cassandra 节点来扩展它。
但是,它与我应该从您的经验中得到的结果接近吗?网上可用的基准测试很少看起来令人困惑..(我使用的是 cassandra 2.0,使用 Kundra ORM 2.13)
【问题讨论】:
我很难提供答案,因为您的问题非常模糊(不清楚),而且我们不知道数据模型是什么样的。 感谢塞德里克的回复。我正在寻找,我的方向是否正确(1500 次写入/线程/节点看起来是否真实)。 我不是专家,所以我会让其他人发布真正的答案,但确定 1500 限制来自 Cassandra 或您的 ORM/应用程序? 感谢塞德里克的回复。我期待看到,我的方向是否正确(1500 次写入/线程/节点看起来是否真实 - 我期待更多?)。数据模型是一个简单的平面表,只有几列,剩下一个属性图(我在这张图上写了大约 100 个属性) CREATE TABLE user_events (event_time timeuuid PRIMARY KEY, attributes map您的 Cassandra 数据模型似乎“过度使用”了 map
集合类型。如果这回答了您对“数据的动态性质。不能符合固定模式。”的担忧,还有其他方法。
CREATE TABLE user_events (event_time timeuuid PRIMARY KEY, attributes map, session_token text, state text, system text, user text)
看起来attributes
列中存储的键值对是您事件的实际负载。因此,它们应该是分区中的行,使用地图的键作为集群键。
CREATE TABLE user_events(
event_time TIMEUUID,
session_token TEXT STATIC,
state TEXT STATIC,
system TEXT STATIC,
USER TEXT STATIC,
attribute TEXT,
value TEXT,
PRIMARY KEY(event_time, attribute)
);
这使得event_time
和attribute
成为主键的一部分,event_time
是分区键,attribute
是集群键。
STATIC
部分使这些数据成为事件的“属性”,并且每个分区仅存储一次。
【讨论】:
感谢 Cedric,通过 (1) 使用 datastax java 驱动程序 (2) 批处理执行 (3) 调整配置,我能够在吞吐量方面获得更多改进。我可以进行大约 2500 次操作(插入)。 我正在尝试使用您在此处提到的宽行方法。如果我继续这样做,我是否会丢失有关我的数据类型的完整信息? [我也同意它与 map 相同],但是当我们说“Cassandra 允许动态列”时,是否允许我向列族添加列以“保留”我的数据类型?关于使用比较器和验证器实现这一点的任何想法?【参考方案2】:你尝试过 cassandra.yaml 和 cassandra-env.sh 吗?调整节点集群对于优化性能非常重要,您可能还想查看操作系统参数,您还需要确保交换内存为 0。这有助于我提高集群性能
【讨论】:
以上是关于使用昆德拉 ORM 编写 Cassandra 的性能的主要内容,如果未能解决你的问题,请参考以下文章