Cassandra问题v3.11.3.从表1中选择count(*)



我在一个表中导入了1个以上的核心记录,当我执行Select查询计数(*(时,会出现错误。我知道这是一个代价高昂的查询,但有人能帮我找到同样的解决方案吗。

从表1中选择COUNT(*(;

错误:OperationTimeout:errors={'10.20.30.10':'客户端请求超时。请参阅会话.execute_async'},last_host=10.20.30.10

执行多次R&D我得到了计数(*(问题的解决方案。

步骤:

  1. 在Cassandra集群上安装presto(我使用了pres-to-server-0.1215版本(pres-to-server-0.215.tar.gz,并使用了jdk:jdk-8u151-linux-x64.tar.gz((1.1.pres-to-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 OS(
  4. 在launcher.py中进行更改--->行号'214'安装的jdk路径"command=['/opt/jdk1.8.0_151/bin/java','-cp',classpath]">
  5. 启动presto--->/启动器启动
  6. 打开presto控制台http://localhost:8081您应该在控制台中看到协调器和工作节点。

  7. 下载"pres-to-cli-0.215-esecutable.jar"(网址:https://prestodb.io/docs/current/installation/cli.html)并将其重命名为prestocli(授予755权限(,然后使用"prestocli"测试一个大表的计数(*(,该表有7500万条记录,当我们在cqlsh中运行时出现错误。7.1.CQLSH错误:来自服务器的错误:代码=1200[协调器节点等待副本节点的响应超时]消息="操作超时-仅收到0个响应。"信息={received_responses’:0,required_responses‘:1,consistency’:'ONE'}

  8. 以下是计数(*(的解决方案

[root@casdb01bin]#/prestocli—服务器localhost:8801presto>SELECT count(*(FROM cassandra.datamart.big_table;

_col0

7587418(1排(

查询20190118_070908_00005_38tiw,FINISHED,1个节点分裂:总共1298次,完成1298次(100.00%(0:53[759M行,7.24MB][142K行/s,139KB/s]

  1. 对于任何应用程序查询,您都可以预存为执行计数(*(的接口

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

因此,如果这是一个生产系统,可能不会,但您似乎已经意识到了这一点。

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

您的系统超时是因为查询成本高昂,而这正是您的错误所在。您可以延长超时时间来解决此问题,但在某些情况下,如果您的数据集足够大,cassandra将无法返回。此外,您可能希望在ONE的一致性下运行查询,这样您就不会触发读取压缩,而且它会更快地返回。它当然会不那么准确。

你也可以试试:nodetool cfstats mykeyspace这只是一个估计,但总比什么都没有好。

最新更新