cassandra的cqlsh控制台操作超时错误

Operation Time Out Error in cqlsh console of cassandra

我有一个三节点 Cassandra 集群,我创建了一个 table,它有超过 2,000,000 行。

当我在 cqlsh 中执行此 (select count(*) from userdetails) 查询时,出现此错误:

OperationTimedOut: errors={}, last_host=192.168.1.2

当我 运行 对较少行或限制为 50,000 的计数函数时,它工作正常。

count(*) 实际上翻阅所有数据。因此,没有限制的 select count(*) from userdetails 预计会因这么多行而超时。这里有一些细节: http://planetcassandra.org/blog/counting-key-in-cassandra/

您可能需要考虑使用 Spark 自行维护计数,或者如果您只想要一个球场号码,您可以从 JMX 获取它。

根据您的数据模型,要从 JMX 中获取数据可能会有些棘手。要获取分区数,请获取 org.apache.cassandra.metrics:type=ColumnFamily,keyspace={{Keyspace}},scope={{Table​}},name=EstimatedColumnCountHistogram mbean 并对所有 90 个值求和(这就是 nodetool cfstats 输出)。它只会为您提供 sstables 中存在的数字,以便使它更准确,您可以进行刷新或尝试从 MemtableColumnsCount mbean

估计内存表中的数字

对于一个非常基本的大概数字,您可以从 system.size_estimates 中获取列出的所有范围内的估计分区计数(请注意,这只是一个节点上的数字)。将其乘以节点数,然后除以 RF。

如果您使用 cqlsh:在编辑器中打开脚本并找到所有单词 "timeout"。将默认值从 10 更改为 60 并保存脚本。

如果我对一天进行计数,就会遇到与上述相同的问题,但作为解决方法,我将计数分为两个请求(12 小时 + 12 小时),如下所示。

cqlsh:jw_schema1> select count(*) from flight_statistics where insert_time >= '2015-08-20 00:00:00' and insert_time <= '2015-08-20 11:59:59' ALLOW FILTERING;

 count
-------
 42528

(1 rows)
cqlsh:jw_schema1> select count(*) from flight_statistics where insert_time >= '2015-08-20 12:00:00' and insert_time <= '2015-08-20 23:59:59' ALLOW FILTERING;

 count
-------
 86580

(1 rows)
cqlsh:jw_schema1> 

要更改 Apache Cassandra 中的客户端超时限制,有两种技术:

技术1:Modify cqlshrc 文件。

技巧二:打开程序cqlsh,修改client_timeout变量指定的时间。

具体实现请参考link:https://playwithcassandra.wordpress.com/2015/11/05/cqlsh-increase-timeout-limit/

我正在使用 Cassandra 3.4 和 cqlsh 来获取记录数。似乎在 3.4 中有代码更改。 cqlsh 只是调用 cqlsh.py。 cqlsh.py 内部有一个默认为 10(秒)的 DEFAULT_REQUEST_TIMEOUT_SECONDS 变量。我将其更改为 3600(1 小时),现在我的 SELECT count(*) 查询正常了。

你也可以在cqlsh命令中增加超时时间,例如:

cqlsh --request-timeout 120 myhost

我正在使用 Cassandra 3.11 和 cqlsh 来获取记录数。我的 table 大约有 40,000,000 行,我被迫解决了这个问题。我的问题通过两个更改解决了:

首先是更改所有节点上 'cassandra.yaml' 中的所有超时配置:

# 3,600,000 is one hour in ms
read_request_timeout_in_ms: 3600000
range_request_timeout_in_ms: 3600000
write_request_timeout_in_ms: 3600000
counter_write_request_timeout_in_ms: 3600000
cas_contention_timeout_in_ms: 3600000
truncate_request_timeout_in_ms: 3600000
request_timeout_in_ms: 3600000
slow_query_log_timeout_in_ms: 3600000

然后在所有节点上重启 cassandra。

第二个是 运行 'cqlsh',指定超时如下:

cqlsh --request-timeout=3600000 <myhost>