我使用的是cassandrapython驱动程序,它包含一个包含38500000行的表。我正在用我们正在开发的产品对各种数据库进行基准测试。为了对选择进行基准测试,我使用了一个过滤器,它应该返回大约一半的行和3个选择列(然后我改变选择列以查看哪一个性能最好)。但是,当使用cassandra时,每次查询我只能得到57016个结果(这必须是一些cap)。我试过使用simplestatement和setting fetch_size = 38500000
但这不管用。我想知道是否有一些参数我应该改变,因为我在文档中找不到任何东西,除了Cassandra如何分解超出 fetch_size
.
[编辑]
要添加查询返回的更多信息,请执行以下操作: cassandra.ReadFailure: Error from server: code=1300 [Replica(s) failed to execute read] message="Operation failed - received 0 responses and 1 failures" info={'consistency': 'LOCAL_ONE', 'required_responses': 1, 'received_responses': 0, 'failures': 1}
我用过之后 session.default_fetch_size = None
. 然后把墓碑增加到 tombstone_failure_threshold: 10000000
让 gc_grace_seconds = 0
我还是会犯同样的错误。我还进入了cluster.py并设置 _default_timeout = 1000
但这并没有带来任何结果。
[编辑2]通过调试控制台,错误是: <SELECT * FROM mydb.facttable WHERE int64 > 0 LIMIT 38500000>, total time 5007 msec, timeout 5000 msec
,那么我在哪里可以修改timeout 5000msec参数呢?
1条答案
按热度按时间zqdjd7g91#
他在那儿。
好消息是我想我可以解释你的情况和问题,但坏消息是我不认为有一个简单的解决办法。
为您提供简短的答案和解决方案:
读取失败是因为cassandra有适当的保护措施来防止“故障”或“恶意”查询损害整个集群的性能。因此,有一个读取超时(正如您在edit2中发现的那样)默认为5000ms
read_request_timeout_in_ms
在Cassandra。亚马尔。然而,这并不是一个真正的解决办法。
现在,长话短说:
据我所知,您的查询目标是3800万行,您希望cassandra过滤这些行,然后返回大约1900万行。我可以看到,在生产硬件上,通过精心设计的表和大量的微调,实现了这个价值。根据edit1中的信息,看起来您使用的是单节点集群,因此我认为这是一个小型开发节点,甚至可能托管在您的笔记本电脑/pc上。虽然共享表架构和查询可以提供更多信息并提供更多建议,总的来说,问题仍然是您正试图在一个显然动力不足的集群(实际上是节点)上运行任务。
根据您的数据,该节点在超时之前每秒只能处理超过20k行(返回10k)。根据我的经验,这似乎与低资源devel节点一致。从这个推断,你的节点大约需要半个小时才能通过38m记录,假设它有足够的内存,并且没有其他配置会带来问题(如果我没有搞砸计算的话)。这对于一个查询来说是一个很长的时间,甚至对于一个管理查询来说也是如此。当尝试处理这么多行时,您不仅应该尝试按比例的硬件来运行查询,而且还应该:
避免完全扫描(您应该始终尝试并命中单个分区,如果不是这样,您可能应该重新考虑db模型);
大部分分区应在10mb以下,所有分区应在100mb以下;
分区的硬上限为20亿个单元((行数)*(平均每行单元数))通常应保持在100k单元以下。
鉴于这3个“最佳实践”被普遍接受,以及您提供的数据,我倾向于认为您至少没有实现其中的2个。再加上硬件供电不足,导致缺乏一个简单的解决方案(比如增加超时值)。
我想真正解决这个问题的建议是:
如果您这样做只是为了测试您的代码或不同的方法,那么使用devel“服务器”与您的生产服务器成比例的数据量。考虑到所需的大量行使我认为db模型可能有问题,您仍然应该确保使用cold的模型在生产环境中有效地运行。
打开另一个问题,提供关于您的情况、当前模式和期望结果的信息,您就可以得到有关建模用例的帮助。虽然Cassandra可以非常强大时使用权,它可以是非常低效时使用不当。
希望这有帮助,
干杯。