我在一张表中导入了超过1个核心记录,当我执行Select查询count(*)时,它会给我一个错误。我知道这是一个代价高昂的查询,但有人能帮我找到解决方案吗。
SELECT COUNT(*) FROM TABLE1;
错误:OperationTimedOut:errors={'10.20.30.10': '客户端请求超时。请参见Session.execute_async'}, last_host=10.20.30.10
我在一张表中导入了超过1个核心记录,当我执行Select查询count(*)时,它会给我一个错误。我知道这是一个代价高昂的查询,但有人能帮我找到解决方案吗。
SELECT COUNT(*) FROM TABLE1;
错误:OperationTimedOut:errors={'10.20.30.10': '客户端请求超时。请参见Session.execute_async'}, last_host=10.20.30.10
在进行多次研究后,我找到了解决count(*)问题的方法。
步骤:
打开Presto控制台http://localhost:8081,您应该在控制台中看到协调器和工作节点。
下载“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'}
[root@casdb01 bin]# ./prestocli --server localhost:8081 presto> 使用presto作为接口执行count(*)可以查询任何应用程序的查询。
7587418 (1 行)
查询 20190118_070908_00005_38tiw,已完成,1 个节点 拆分:1,298 总数,1,298 已完成(100.00%) 0:53 [7.59M 行,7.24MB] [142K 行/秒,139KB/秒]
特别感谢我的团队成员Venkatesh Bhat,帮助我获得这个结果。
如果这是一个生产系统,可能最好不要这样做,但你似乎已经意识到了这一点。
> cqlsh --request-timeout=3600
SELECT count(*) FROM table1 ALLOW FILTERING;
你的系统超时是因为查询太耗费资源,这就是你遇到的错误。你可以延长超时时间来解决这个问题,但如果数据集足够大,Cassandra 在某些时候将无法返回结果。此外,你可能希望使用一致性级别为ONE
运行查询,以避免触发读取压缩并加快查询速度。当然,这样会降低准确性。
你也可以尝试:nodetool cfstats mykeyspace
,虽然只是一个估计值,但总比没有好。
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