Joh*_*ler 2 python database cassandra
我正在使用 Cassandra python 驱动程序,其中包含一个包含 38500000 行的表。我正在使用我们正在开发的产品对各种数据库进行基准测试。为了对选择进行基准测试,我使用了一个过滤器,该过滤器应该返回大约有 3 个选择列的一半行(然后我改变选择列以查看哪个表现最佳)。但是,在使用 Cassandra 时,每次查询每次只能得到 57016 个结果(必须是上限)。我试过使用 SimpleStatement 和设置,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,那么我在哪里可以修改超时 5000 毫秒参数?
你好。
好消息是我想我可以解释你的情况和问题,但坏消息是我认为没有简单的解决办法。
给你一个简短的答案和解决方案:
读取失败是因为 Cassandra 有适当的保护措施来防止“故障”或“流氓”查询影响整个集群的性能。出于这个原因,有一个默认为5000ms的读取超时(正如您在 EDIT2 中发现的那样)。
如果您需要增加该值,则需要read_request_timeout_in_ms在cassandra.yaml 中进行修改。
然而,这不是一个真正的解决方案。
现在,对于长答案:据
我所知,您的查询目标是 3800 万行,您希望 Cassandra 过滤这些行,然后返回大约 1900 万行。我可以通过精心设计的表格和大量微调在生产硬件上看到这个价值。鉴于 EDIT1 中的信息,看起来您使用的是单节点集群,所以我想这是一个小型开发节点,甚至可能托管在您的笔记本电脑/PC 上。虽然共享表架构和查询可以提供更多信息并导致更多建议,但总体而言,问题仍然是您试图在明显功率不足的集群(实际上是节点)上运行任务。
根据您的数据,该节点能够在超时之前每秒处理超过 20k 行(并返回 10k)。根据我的经验,这似乎与低资源开发节点一致。由此推断,假设您的节点有足够的内存来处理38M 记录并且没有其他配置会造成问题(如果我没有搞乱计算),则需要大约半小时的时间来处理 38M 记录。这对于查询来说是很长的时间,即使对于管理查询也是如此。当尝试处理这么多行时,您不仅应该尝试使用成比例的硬件来运行查询,而且还应该:
鉴于普遍接受的 3 个“最佳实践”以及您提供的数据,我倾向于相信您没有实施 3 个中的至少 2 个。解决方案(就像只是增加超时值)。
我真正解决问题的建议是:
希望这有帮助,
干杯。