【发布时间】:2014-05-30 19:00:58
【问题描述】:
我正在使用带有 python CQL 的 Cassandra 2.0。
我创建了一个列族如下:
CREATE KEYSPACE IF NOT EXISTS Identification
WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy',
'DC1' : 1 };
USE Identification;
CREATE TABLE IF NOT EXISTS entitylookup (
name varchar,
value varchar,
entity_id uuid,
PRIMARY KEY ((name, value), entity_id))
WITH
caching=all
;
然后我尝试计算此 CF 中的记录数,如下所示:
#!/usr/bin/env python
import argparse
import sys
import traceback
from cassandra import ConsistencyLevel
from cassandra.cluster import Cluster
from cassandra.query import SimpleStatement
def count(host, cf):
keyspace = "identification"
cluster = Cluster([host], port=9042, control_connection_timeout=600000000)
session = cluster.connect(keyspace)
session.default_timeout=600000000
st = SimpleStatement("SELECT count(*) FROM %s" % cf, consistency_level=ConsistencyLevel.ALL)
for row in session.execute(st, timeout=600000000):
print "count for cf %s = %s " % (cf, str(row))
dump_pool.close()
dump_pool.join()
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-cf", "--column-family", default="entitylookup", help="Column Family to query")
parser.add_argument("-H", "--host", default="localhost", help="Cassandra host")
args = parser.parse_args()
count(args.host, args.column_family)
print "fim"
计数对我来说没什么用,它只是一个需要很长时间才能完成的操作的测试。
虽然我已将超时定义为 600000000 秒,但在不到 30 秒后,我收到以下错误:
./count_entity_lookup.py -H localhost -cf entitylookup
Traceback (most recent call last):
File "./count_entity_lookup.py", line 27, in <module>
count(args.host, args.column_family)
File "./count_entity_lookup.py", line 16, in count
for row in session.execute(st, timeout=None):
File "/home/mvalle/pyenv0/local/lib/python2.7/site-packages/cassandra/cluster.py", line 1026, in execute
result = future.result(timeout)
File "/home/mvalle/pyenv0/local/lib/python2.7/site-packages/cassandra/cluster.py", line 2300, in result
raise self._final_exception
cassandra.ReadTimeout: code=1200 [Timeout during read request] message="Operation timed out - received only 1 responses." info={'received_responses': 1, 'data_retrieved': True, 'required_responses': 2, 'consistency': 5}
似乎只是在复制品中找到了答案,但这对我来说真的没有意义。 cassandra 不应该能够查询它吗?
在下图中,可以看到对集群的请求量非常低,延迟也非常低。我不确定为什么会这样。
【问题讨论】:
-
这个集群要运行多少个节点?根据您的描述,它听起来只是一个节点,因此不清楚为什么读取操作会期望 2 个响应。如果您有一个 2 节点集群,其中只有一个处于联机状态,那么这些结果是预期的。
-
我在这个集群中有两个节点,RF=2,读写一致性级别都是ALL——两个节点都在线
-
你找到解决方案了吗?
-
关于超时,我发现更改cassandra服务器文件的超时会有效。可以指定客户端超时,但不会覆盖服务器中的配置。
-
关于缓慢本身,它与对 Cassandra 的请求的大小有关。存储在列族中的数据太大,导致延迟。
标签: python cql3 cassandra-2.0