在cassandra中获取分区ID的所有记录会导致RPC超时
我正在使用Cassandra 1.2.1复合键,并尝试获取特定分区ID的所有记录。以下是我正在使用的模式:在cassandra中获取分区ID的所有记录会导致RPC超时,cassandra,Cassandra,我正在使用Cassandra 1.2.1复合键,并尝试获取特定分区ID的所有记录。以下是我正在使用的模式: 时间戳 设备ID 数据传输 位置ID 设备所有者 主键是复合键:(时间戳,设备ID)。因此,时间戳是分区密钥。每条记录将为70-80字节 有1000个不同的时间戳,每个时间戳有500K个设备ID。所以有5亿条记录,我想获取特定时间戳的所有记录。类似于: 从模式中选择*,其中时间戳='..' 我的理解是,这个查询应该能够快速获取所有记录,因为相关的行都存储在相邻的磁盘位置,这意味着很少的
- 时间戳
- 设备ID
- 数据传输
- 位置ID
- 设备所有者
我的理解是分区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超时。如果反序列化是罪魁祸首,那么这种情况就不应该发生,对吗?你知道我们为什么要这样做吗