Cassandra 无限行响应

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 毫秒参数?

Mik*_*ike 5

你好。

好消息是我想我可以解释你的情况和问题,但坏消息是我认为没有简单的解决办法。

给你一个简短的答案和解决方案:
读取失败是因为 Cassandra 有适当的保护措施来防止“故障”或“流氓”查询影响整个集群的性能。出于这个原因,有一个默认为5000ms的读取超时(正如您在 EDIT2 中发现的那样)。 如果您需要增加该值,则需要read_request_timeout_in_mscassandra.yaml 中进行修改

然而,这不是一个真正的解决方案。

现在,对于长答案:据
我所知,您的查询目标是 3800 万行,您希望 Cassandra 过滤这些行,然后返回大约 1900 万行。我可以通过精心设计的表格和大量微调在生产硬件上看到这个价值。鉴于 EDIT1 中的信息,看起来您使用的是单节点集群,所以我想这是一个小型开发节点,甚至可能托管在您的笔记本电脑/PC 上。虽然共享表架构和查询可以提供更多信息并导致更多建议,但总体而言,问题仍然是您试图在明显功率不足的集群(实际上是节点)上运行任务。
根据您的数据,该节点能够在超时之前每秒处理超过 20k 行(并返回 10k)。根据我的经验,这似乎与低资源开发节点一致。由此推断,假设您的节点有足够的内存来处理38M 记录并且没有其他配置会造成问题(如果我没有搞乱计算),则需要大约半小时的时间来处理 38M 记录。这对于查询来说是很长的时间,即使对于管理查询也是如此。当尝试处理这么多行时,您不仅应该尝试使用成比例的硬件来运行查询,而且还应该:

  1. 避免完全扫描(您应该始终尝试点击单个分区,如果不是这种情况,您可能应该重新考虑 DB 模型);
  2. 大多数分区应该在 10MB 以下,所有分区都应该在 100MB 以下;
  3. 分区虽然硬上限为 20 亿个单元((行数)*(每行的平均单元数))通常应保持在 10 万个单元以下。

鉴于普遍接受的 3 个“最佳实践”以及您提供的数据,我倾向于相信您没有实施 3 个中的至少 2 个。解决方案(就像只是增加超时值)。
我真正解决问题的建议是:

  • 如果您这样做只是为了测试您的代码或不同的方法,那么与您的生产服务器相比,使用具有开发“服务器”功能的成比例的数据量。鉴于大量所需的行让我认为 DB 模型可能存在问题,您仍然应该确保您使用的冷模型在生产中有效运行。
  • 打开另一个问题,提供有关您的情况、当前模式和所需结果的信息,您可以获得有关建模用例的帮助。虽然 Cassandra 使用得当可以非常强大,但如果使用不当,它的效率可能会非常低。

希望这有帮助,
干杯。