cassandra-driver 执行查询时返回错误 OperationTimedOut

5 投票
2 回答
10532 浏览
提问于 2025-04-18 09:23

我用一个Python脚本,向Cassandra发送批量查询,代码大概是这样的:

query = 'BEGIN BATCH ' + 'insert into ... ; insert into ... ; insert into ...; ' + ' APPLY BATCH;'
session.execute(query)



这个脚本有时候能正常工作,但大约两分钟后就会失败,并显示错误信息:

Traceback (most recent call last):<br>
  File "/home/fervid/Desktop/cassandra/scripts/parse_and_save_to_cassandra.cgi", line 127, in <module><br>
    session.execute(query)<br>
  File "/usr/local/lib/python2.7/dist-packages/cassandra/cluster.py", line 1103, in execute<br>
    result = future.result(timeout)<br>
  File "/usr/local/lib/python2.7/dist-packages/cassandra/cluster.py", line 2475, in result<br>
    raise OperationTimedOut(errors=self._errors, last_host=self._current_host)<br>
cassandra.OperationTimedOut: errors={}, last_host=127.0.0.1<br>
<br>
<br>

我把cassandra.yaml中的超时时间改成了:
read_request_timeout_in_ms: 15000
range_request_timeout_in_ms: 20000
write_request_timeout_in_ms: 20000
cas_contention_timeout_in_ms: 10000
request_timeout_in_ms: 25000


然后我重启了Cassandra,但这并没有解决问题。 错误还是不断出现!

在脚本失败时,日志中出现的几行信息:

INFO [BatchlogTasks:1] 2014-06-11 14:18:10,490 ColumnFamilyStore.java (第794行) 正在排队刷新 Memtable-batchlog@28149592(13557969/13557969序列化/活跃字节, 4 操作)
INFO [FlushWriter:10] 2014-06-11 14:18:10,490 Memtable.java (第363行) 正在写入 Memtable-batchlog@28149592(13557969/13557969 序列化/活跃字节, 4 操作)
INFO [FlushWriter:10] 2014-06-11 14:18:10,566 Memtable.java (第410行) 刷新完成;没有 需要保留的内容。提交日志位置是 ReplayPosition(segmentId=1402469922169, position=27138996)
INFO [ScheduledTasks:1] 2014-06-11 14:18:13,758 GCInspector.java (第116行) ParNew的垃圾回收:640毫秒,进行了3次收集,使用了775214160;最大是 1052770304
INFO [ScheduledTasks:1] 2014-06-11 14:18:16,155 GCInspector.java (第116行) ConcurrentMarkSweep的垃圾回收:1838毫秒,进行了2次 收集,使用了810976000;最大是1052770304
INFO [ScheduledTasks:1] 2014-06-11 14:18:17,959 GCInspector.java (第116行) ConcurrentMarkSweep的垃圾回收:1612毫秒,进行了1次收集,使用了858404088; 最大是1052770304
INFO [ScheduledTasks:1] 2014-06-11 14:18:17,959 StatusLogger.java (第55行) 池名称 活跃
待处理 完成的 被阻塞 所有时间被阻塞
INFO [ScheduledTasks:1] 2014-06-11 14:18:17,959 StatusLogger.java (第70行) 读取阶段 0 0 627 0 0
INFO [ScheduledTasks:1] 2014-06-11 14:18:17,960 StatusLogger.java (第70行) 请求响应阶段 0
0 0 0 0
INFO [ScheduledTasks:1] 2014-06-11 14:18:17,960 StatusLogger.java (第70行) 读取修复阶段 0 0 0 0 0
INFO [ScheduledTasks:1] 2014-06-11 14:18:17,960 StatusLogger.java (第70行) 变更阶段 0
0 184386 0 0
INFO [ScheduledTasks:1] 2014-06-11 14:18:17,960 StatusLogger.java (第70行) 写入时复制阶段 0 0 0 0 0

2 个回答

1

根据文档,这个错误的意思是说,操作在客户端花费的时间超过了规定的时间。这个错误是由驱动程序产生的,而不是Cassandra本身造成的。我还在寻找处理这个错误的方法。

http://datastax.github.io/python-driver/api/cassandra.html#cassandra.OperationTimedOut

17
  1. 这是一个客户端超时的问题(可以查看@Syrial的回复中的链接:http://datastax.github.io/python-driver/api/cassandra.html#cassandra.OperationTimedOut

  2. 你可以更改Session默认超时时间

    session = cluster.connect()
    session.default_timeout = 30  # this is in *seconds*
    
  3. 你也可以更改特定查询的超时时间

    session.execute(statement, 30, ...)
    
  4. 通过在BATCH中使用预编译语句,你可以大大加快执行速度。可以查看这篇文章中的批处理语句部分

  5. 如果你想要更好的结果,请阅读这些性能说明

撰写回答