0

我在一个宽列中插入带有时间戳 (T) 的时间序列数据作为列名,该列在一行中存储 24 小时的数据。流数据从数据生成器(4 个实例,每个实例有 256 个线程)写入,将数据并行插入到多行中。

CF2(宽列系列):

RowKey1 (T1, V1) (T2, V3) (T4, V4) ......

RowKey2 (T1, V1) (T3, V3) .....

我现在正在尝试使用 multiget 从 Cassandra 读取这些数据。客户端是用python编写的,使用pycassa。

当我为单个行键查询 24 小时价值数据时,会返回超过 200 万个数据点。在使用 multiget 并行 4 个行键时,我收到以下错误:

文件“c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\columnfamily.py”,第 772 行,在 multiget packed_keys[offset:offset + buffer_size], cp, sp,一致性)

文件“c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py”,第 576 行,执行 return getattr(conn, f)(*args, **kwargs)

文件“c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py”,第 153 行,在 new_f 返回 new_f(self, *args, **kwargs )

文件“c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py”,第 153 行,在 new_f 返回 new_f(self, *args, **kwargs )

文件“c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py”,第 153 行,在 new_f 返回 new_f(self, *args, **kwargs ) 文件“c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py”,第 153 行,在 new_f 返回 new_f(self, *args, **夸格斯)

文件“c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py”,第 153 行,在 new_f 返回 new_f(self, *args, **kwargs )

文件“c:\Python27-64bit\lib\site-packages\pycassa-1.9.1-py2.7.egg\pycassa\pool.py”,第 148 行,在 new_f (self._retry_count, exc. class ._ name _, exc)) pycassa.pool.MaximumRetryException:重试 6 次。上次失败超时:超时

但是,以前我能够并行获取 256 个行键的数据。现在,我增加了数据的密度(即在一个时间范围内没有 .of 数据点)并且查询因这个问题而失败。

我们在 multiget 中调整了 buffer_size,发现 8 是最佳选择。

堆大小:6GB

内存:16GB

读取一致性:一个

集群:5节点

CPU 利用率低于 20%。此外,我没有看到 OpsCenter 报告的读取吞吐量、读取延迟、磁盘吞吐量和磁盘延迟有任何异常模式。

我还尝试将 Cassandra.yaml 中的 read_request_timeout_in_ms 增加到 60000 但徒劳无功。关于我们为什么会收到此异常的任何其他指示?我希望查询花费大量时间来检索结果,但仍然不会失败。

谢谢,

VS

4

1 回答 1

3

(从 pycassa 邮件列表上的相同问题复制答案。)

上次失败超时:超时

这表示客户端超时,因此调整read_request_timeout_in_ms不会解决此问题。相反,为您的ConnectionPool;调整超时参数。默认值为 0.5 秒。

对于非常宽的行,您可能还想尝试xget()跨多个线程并行使用。这将更好地分配来自您的查询的负载,并且不会给一个协调器节点带来这样的负担。

于 2014-01-03T22:01:59.810 回答