使用multiget从Cassandra读取数据时的MaximumRetryException

时间:2013-12-29 07:52:13

标签: cassandra hector astyanax datastax-enterprise pycassa

我在时间戳(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个rowkeys中,我收到以下错误:

文件“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,consistency)

文件“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行,in new_f     返回new_f(self,* args,** kwargs)

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

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

文件“c:\ Python27-64bit \ lib \ site-packages \ pycassa-1.9.1-py2.7.egg \ pycassa \ pool.py”,第153行,in 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个rowkeys的数据。现在,我增加了数据密度(即在一个时间范围内没有数据点),并且查询因此问题而失败。

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

HeapSize:6GB

RAM:16GB

阅读一致性:ONE

群集:5个节点

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

我还尝试将Cassandra.yaml中的read_request_timeout_in_ms增加到60000但是徒劳无功。关于为什么我们得到这个例外的任何其他指针? 我希望查询花费大量时间来检索结果,但仍然没有失败。

谢谢,

VS

1 个答案:

答案 0 :(得分:3)

(从pycassa邮件列表中的同一问题复制回答。)

  

上次失败是超时:超时

这表示客户端超时,因此调整read_request_timeout_in_ms将无法解决此问题。而是调整ConnectionPool的超时参数;默认值为0.5秒。

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