Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在cassandra中获取分区ID的所有记录会导致RPC超时_Cassandra - Fatal编程技术网

在cassandra中获取分区ID的所有记录会导致RPC超时

在cassandra中获取分区ID的所有记录会导致RPC超时,cassandra,Cassandra,我正在使用Cassandra 1.2.1复合键,并尝试获取特定分区ID的所有记录。以下是我正在使用的模式: 时间戳 设备ID 数据传输 位置ID 设备所有者 主键是复合键:(时间戳,设备ID)。因此,时间戳是分区密钥。每条记录将为70-80字节 有1000个不同的时间戳,每个时间戳有500K个设备ID。所以有5亿条记录,我想获取特定时间戳的所有记录。类似于: 从模式中选择*,其中时间戳='..' 我的理解是,这个查询应该能够快速获取所有记录,因为相关的行都存储在相邻的磁盘位置,这意味着很少的

我正在使用Cassandra 1.2.1复合键,并尝试获取特定分区ID的所有记录。以下是我正在使用的模式:

  • 时间戳
  • 设备ID
  • 数据传输
  • 位置ID
  • 设备所有者
主键是复合键:(时间戳,设备ID)。因此,时间戳是分区密钥。每条记录将为70-80字节

有1000个不同的时间戳,每个时间戳有500K个设备ID。所以有5亿条记录,我想获取特定时间戳的所有记录。类似于:

从模式中选择*,其中时间戳='..'

我的理解是,这个查询应该能够快速获取所有记录,因为相关的行都存储在相邻的磁盘位置,这意味着很少的磁盘搜索会给出结果。过滤器位于时间戳上,这意味着查询只会命中一个节点。另外,数据总量是500K*80字节~40MB,这不是一个很大的数据量。但是,当我使用CQL(3)或Astyanax运行此程序时,会出现RPC超时


我的理解是分区ID的所有记录都位于相邻的磁盘位置吗?大容量获取此类数据的正确方法是什么?

最终,磁盘上的列将彼此靠近,因为它们位于同一行中。但在压缩完成之前(即,假设您不运行nodetool compact),它们不会运行。但它们应该分为几个表

然而,较慢的事情可能是CPU进行反序列化、比较来自其他副本的结果并序列化回客户端。我怀疑你能在rpc_超时(默认值为10秒)内为500k对象做到这一点

为此,您应该逐页浏览结果

对于第一个查询,请执行以下操作:

SELECT * from schema where TimeStamp = '..' limit 1000
然后获取最后一个设备ID并调用它:

SELECT 'last'..'' from schema where TimeStamp = '..' limit 1000

直到响应中的列少于1000列。

最终,这些列将在磁盘上彼此靠近,因为它们位于同一行中。但在压缩完成之前(即,假设您不运行nodetool compact),它们不会运行。但它们应该分为几个表

然而,较慢的事情可能是CPU进行反序列化、比较来自其他副本的结果并序列化回客户端。我怀疑你能在rpc_超时(默认值为10秒)内为500k对象做到这一点

为此,您应该逐页浏览结果

对于第一个查询,请执行以下操作:

SELECT * from schema where TimeStamp = '..' limit 1000
然后获取最后一个设备ID并调用它:

SELECT 'last'..'' from schema where TimeStamp = '..' limit 1000

直到您在响应中得到的列少于1000列。

Richard,我没有复制,因此比较其他副本的结果不应该减慢速度。。正确的?你能详细说明你所说的反序列化是什么意思吗?您指的是通过处理DB的输出并在网络上发送记录(通过客户端)而引入的延迟吗?我已经运行了compact命令,如果有帮助,将进行更新。您是否知道我还可以从以下事实中受益:特定分区ID的数据将顺序存储在DB中,这样我就可以用最少的磁盘搜索来获取它?谢谢。如果您没有复制,这将使它更快。通过反序列化,我的意思是Cassandra必须从磁盘读取数据并从中构造Java对象。在本例中,这可能是您的瓶颈-您可以在运行查询时通过监视服务器来确认。是否受CPU限制(使用top)?它能做多少I/O(使用iostat)?您所说的可能意味着无论我做什么(压缩等),我都会因为Java反序列化而遇到瓶颈?如果我错了,请纠正我。有什么方法可以改进吗?我的另一个输入是使用模式中的查询Select count(),其中TimeStamp='..'也会导致RPC超时。如果反序列化是罪魁祸首,那么这种情况就不应该发生,对吗?你知道为什么count()会这么慢吗?如果压缩会有帮助吗?另一个输入是,我的数据库中只有插入项,从未删除过条目。可能是的。不过,您应该通过进行一些监视来确认。Cassandra的查询协议是为小型查询设计的,返回500k结果对Cassandra来说是一件非常重要的事情“选择计数”所用的时间几乎与“选择*”所用的时间相同——在Cassandra内部,它执行“选择*”查询,只对结果进行计数。解决这些问题的标准方法是使用我的答案中的分页。谢谢Richard。我会试一试,然后更新结果。任何关于如何使用Astyanax进行分页的指示都会很有帮助。Richard,我没有复制,所以比较其他副本的结果不应该会减慢速度。。正确的?你能详细说明你所说的反序列化是什么意思吗?您指的是通过处理DB的输出并在网络上发送记录(通过客户端)而引入的延迟吗?我已经运行了compact命令,如果有帮助,将进行更新。您是否知道我还可以从以下事实中受益:特定分区ID的数据将顺序存储在DB中,这样我就可以用最少的磁盘搜索来获取它?谢谢。如果您没有复制,这将使它更快。通过反序列化,我的意思是Cassandra必须从磁盘读取数据并从中构造Java对象。在本例中,这可能是您的瓶颈-您可以在运行查询时通过监视服务器来确认。是否受CPU限制(使用top)?它能做多少I/O(使用iostat)?您所说的可能意味着无论我做什么(压缩等),我都会因为Java反序列化而遇到瓶颈?如果我错了,请纠正我。有什么方法可以改进吗?我的另一个输入是使用模式中的查询Select count(),其中TimeStamp='..'也会导致RPC超时。如果反序列化是罪魁祸首,那么这种情况就不应该发生,对吗?你知道我们为什么要这样做吗