Cassandra问题v3.11.3...从table1中选择计数(*)

3

我在一张表中导入了超过1个核心记录,当我执行Select查询count(*)时,它会给我一个错误。我知道这是一个代价高昂的查询,但有人能帮我找到解决方案吗。

SELECT COUNT(*) FROM TABLE1;

错误:OperationTimedOut:errors={'10.20.30.10': '客户端请求超时。请参见Session.execute_async'}, last_host=10.20.30.10

2个回答

1

在进行多次研究后,我找到了解决count(*)问题的方法。

步骤:

  1. 在Cassandra集群上安装 Presto(我使用的是 presto-server-0.215 版本(presto-server-0.215.tar.gz),并使用 JDK:jdk-8u151-linux-x64.tar.gz)。 1.1. presto-server-0.215.tar.gz: https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.215/ 1.2. jdk-8u151-linux-x64.tar.gz: https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html
  2. 在一个Cassandra服务器上安装 Presto,并将其设置为协调器,集群中的其他节点将作为工作节点,请参考下面的URL进行Presto的设置。 参考URL:https://github.com/prestodb/presto/issues/3382
  3. 您需要为config.properties文件中指定的Presto端口添加防火墙规则(我使用的是RHEL 7.x操作系统)。
  4. 更改launcher.py ---> 第214行JDK安装路径 "command = ['/opt/jdk1.8.0_151/bin/java', '-cp', classpath]"
  5. 启动Presto ---> ./launcher start
  6. 打开Presto控制台http://localhost:8081,您应该在控制台中看到协调器和工作节点。

  7. 下载“presto-cli-0.215-executable.jar”(URL:https://prestodb.io/docs/current/installation/cli.html),并将其重命名为prestocli(给予755权限),然后使用'prestocli'测试一个具有750万条记录的大表的count(*),当我们在cqlsh中运行时会出错。 7.1. CQLSH Error: Error from server: code=1200 [Coordinator node timed out waiting for replica nodes' responses] message="Operation timed out - received only 0 responses." info={'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'}

  8. 以下是count(*)的解决方案...

[root@casdb01 bin]# ./prestocli --server localhost:8081 presto> 使用presto作为接口执行count(*)可以查询任何应用程序的查询。

_col0

7587418 (1 行)

查询 20190118_070908_00005_38tiw,已完成,1 个节点 拆分:1,298 总数,1,298 已完成(100.00%) 0:53 [7.59M 行,7.24MB] [142K 行/秒,139KB/秒]

  1. 对于任何应用程序查询,您可以使用presto作为接口执行count(*)。

特别感谢我的团队成员Venkatesh Bhat,帮助我获得这个结果。


0

如果这是一个生产系统,可能最好不要这样做,但你似乎已经意识到了这一点。

> cqlsh --request-timeout=3600
SELECT count(*) FROM table1 ALLOW FILTERING;

你的系统超时是因为查询太耗费资源,这就是你遇到的错误。你可以延长超时时间来解决这个问题,但如果数据集足够大,Cassandra 在某些时候将无法返回结果。此外,你可能希望使用一致性级别为ONE运行查询,以避免触发读取压缩并加快查询速度。当然,这样会降低准确性。

你也可以尝试:nodetool cfstats mykeyspace,虽然只是一个估计值,但总比没有好。


没有运气...我尝试了ALLOW FILTERING...
SELECT count(*) FROM TABLE1 ALLOW FILTERING ;ReadTimeout: Error from server: code=1200 [Coordinator node timed out waiting for replica nodes' responses] message="Operation timed out - received only 0 responses." info={'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'}
CFSTAT也没有给我任何数据,因为现在还没有写入任何内容。
- Hareesha
那么在 nodetool status 中,你的所有节点都正常运行,它是否有效?有多少数据存储在其中(你可以尝试进一步增加超时时间,它需要3600秒才能返回吗?)?你的节点数和复制因子是多少? - Highstead
nodetool status = 是的,节点正在运行(UN),目前我们在集群中有2个节点,并计划扩展到5个节点(不久之后)。nodecount = 我们上个月开始了生产,现在在一个集群中有两个种子节点。遇到了大表的问题 - 记录超过1千万至5千1百万。已按建议将超时值保留。复制因子:2
  • {'class':'SimpleStrategy','replication_factor':'2'}
请建议您在生产环境中遵循的最佳实践。
- Hareesha
尽快使用3个节点。如果其中一个节点出现故障,您的仲裁写入和读取都将失败,直到您添加或替换第三个节点。根据模式,最佳实践和改进将更加明显。通过在节点上使用JBOD技术对我的HDD进行配置,我在AWS中看到了显着的性能提升,而成本相同。这在使用弹性驱动器时特别有用。 - Highstead
就你的问题而言,如果你运行了数亿行数据,我不会指望那个查询会在合理的时间内返回结果。 - Highstead
我尝试了所有建议的选项... 你能告诉我是否需要在cassandra.yaml文件中进行任何更改或者我可以使用cqsh命令来获取计数的设置,或者我可以有一些代码(Java或Python或...)来执行相同的操作。 - Hareesha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接