我在一个表中导入了1个以上的核心记录,当我执行Select查询计数(*(时,会出现错误。我知道这是一个代价高昂的查询,但有人能帮我找到同样的解决方案吗。
从表1中选择COUNT(*(;
错误:OperationTimeout:errors={'10.20.30.10':'客户端请求超时。请参阅会话.execute_async'},last_host=10.20.30.10
执行多次R&D我得到了计数(*(问题的解决方案。
步骤:
- 在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
- 在一个cassandra服务器上安装presto,它将成为协调器,集群中的其他节点将成为工作节点,请参阅下面的URL以设置presto。参考URL:https://github.com/prestodb/presto/issues/3382
- 您需要为您在config.properties文件中提到的Presto端口添加防火墙规则(我使用的是RHEL 7.x OS(
- 在launcher.py中进行更改--->行号'214'安装的jdk路径"command=['/opt/jdk1.8.0_151/bin/java','-cp',classpath]">
- 启动presto--->/启动器启动
-
打开presto控制台http://localhost:8081您应该在控制台中看到协调器和工作节点。
-
下载"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'}
- 以下是计数(*(的解决方案
[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]
- 对于任何应用程序查询,您都可以预存为执行计数(*(的接口
特别感谢我的团队成员,他们帮助我获得了这个结果(Venkatesh Bhat(。
因此,如果这是一个生产系统,可能不会,但您似乎已经意识到了这一点。
> cqlsh --request-timeout=3600
SELECT count(*) FROM table1 ALLOW FILTERING;
您的系统超时是因为查询成本高昂,而这正是您的错误所在。您可以延长超时时间来解决此问题,但在某些情况下,如果您的数据集足够大,cassandra将无法返回。此外,您可能希望在ONE
的一致性下运行查询,这样您就不会触发读取压缩,而且它会更快地返回。它当然会不那么准确。
你也可以试试:nodetool cfstats mykeyspace
这只是一个估计,但总比什么都没有好。