大型数据集上的 Cassandra 超时中的计数查询



这是我的表格

CREATE TABLE star.star_event (
eventnumber int,
primarytracks int,
prodtime double,
antinucleus int,
eventfile int,
eventtime double,
histfile bigint,
multiplicity int,
nabovelb int,
nbelowlb int,
nlb int,
pt double,
runnumber int,
vertexx double,
vertexy double,
vertexz double,
PRIMARY KEY (eventnumber, primarytracks, prodtime)
) WITH CLUSTERING ORDER BY (primarytracks ASC, prodtime ASC)

我正在尝试做select count(1) from star_event.我知道这是 cassandra 支持的有效查询,至少对于少量数据。但是对于庞大的数据集,它似乎不起作用。

不断收到错误

ReadTimeout: Error from server: code=1200 [Coordinator node timed out
waiting for replica nodes' responses] message="Operation timed out -
received  only 0 responses." info={'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'}

增加了默认ReadTimeoutcassandra.yaml仍然没有运气。有哪些可用的解决方法。

我看你对卡桑德拉的了解足够多;)并且您已经尝试更改yaml文件。围绕这个问题,你真的无能为力,因为它现在只使用 cassandra(除了可能进一步增加超时,看看会发生什么)

基本上有时数据只是很大。所以你必须解决这个问题。有几种方法可以做到这一点:

  1. 通过外部进程执行计数 - Spark 对我来说总是很好用,但我也编写了一些自己的工具来经常处理数据。您可以将此答案用于您自己的计数工具 https://stackoverflow.com/a/23750872/7413631

  2. 尝试重塑数据 - 但我想这对你没有好处,因为将表分解成多个较小的表格似乎不是最佳的

  3. 如果您只是对球场感兴趣,请使用模糊卡桑德拉近似(128 以内),方法是使用表格统计量nodetool cfstats: http://www.wentnet.com/blog/?p=24

  4. 尝试使用计数器列,基本上为您所做的每个插入都有一个更新,这实际上会增加计数器值。但是,一旦开始计数,您还需要将其设置为某个初始值。

这完全取决于,如果这个计数是你不经常做的事情,可以等待自己的脚本或火花是可以的,如果你必须立即拥有它,我会选择计数器列。

最新更新