【问题标题】:Storing timeseries of large raw requests and responses in Cassandra在 Cassandra 中存储大型原始请求和响应的时间序列
【发布时间】:2015-04-09 01:47:24
【问题描述】:

我有许多 python 进程,每个进程都重复查询一个单独的投注 API。请求一次以约 20-100 个突发形式出现,然后该过程会消失以解析响应并在一秒钟左右重复。我希望使用 Cassandra 作为请求和响应的原始存储。这将允许我调试解析数据的问题和/或稍后重新解析。我正在尝试为此设计一个架构。

我想我可以为每个 API 提供一个单独的表(列族),对此没什么好说的。我对表模式的最初想法是:

stripe text, // free text to describe the flavour of the request, e.g. live games  
date int, // YYYYMMDD  
requests map<datetime, text>,  
responses map<datetime, text>  

然后,我可以在请求和响应发生时将它们附加到正确的行,并以每天按时间排序的请求和响应结束。然后我可以轻松地返回并查找给定日期的数据(这似乎是一次处理的合理数据块),然后在需要时转到当天的特定时间点。

这里的问题很明显,考虑到我的时间戳分辨率,在同一时间发出的 2 个请求最终会相互覆盖。虽然不太可能,但它是错误的。

然后我继续我不太喜欢的第二个想法,使用时间戳和请求的哈希来消除密钥的歧义,假设同一请求同时返回相同的结果,因此足够独特,即str(timestamp) + str(hash(request)),意思是schema变成(datetime变成text)

stripe text, // free text to describe the flavour of the request, e.g. live games  
date int, // YYYYMMDD  
requests map<text, text>,  
responses map<text, text>  

这很糟糕,因为文本占用更多空间并且比较慢,但我愿意接受它,然后我遇到了这个问题:

E               InvalidRequest: code=2200 [Invalid query] message="Map value is too long. Map values are limited to 65535 bytes but 435145 bytes value provided"

这基本上是在告诉我,无论如何我都不能将这些东西放在集合列中,因为响​​应的大小是任意的,而且几乎总是大于限制。

我是 Cassandra 世界的新手,但我认为这些 CQL 映射最终对应于记录中单独的列名和值,并且每列的大小限制为 2GB。我能想到的一件事是不使用映射并每次都更改表架构,然后将正常值插入单元格,但我不确定在底层存储中有什么不同。

所以我想我有两个问题:

  • 这只是 CQL 的限制还是 Cassandra 的全部限制?
  • 有经验的人能想出一个整体上更好的方法吗?

感谢阅读

KCH

【问题讨论】:

标签: python dictionary cassandra


【解决方案1】:

回答我自己的问题 - 我的误解在于,在 CQL 中,键的第一部分始终是行键,因此对于复合键,键的其余部分形成列键。映射也使用它们自己的键名“展开”约定,但应用限制大小,最终位于同一行的不同列中。

【讨论】:

    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 2013-12-01
    • 2013-07-02
    • 2013-03-19
    • 2015-06-22
    • 2019-09-23
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多