【问题标题】:Timeout cassandra hector超时卡桑德拉赫克托
【发布时间】:2012-07-03 23:44:21
【问题描述】:

我已经开始使用 cassandra。因此,我将 cassandra (1.1.1) 下载到我的 windows 电脑并启动它。一切正常。 因此,我开始重新实现一个旧应用程序(在 java 中使用 hector 1.1),它为 4 个表导入了大约 200.000.000,这些表应该插入到 4 个列族中。导入大约 2.000.000 条记录后,我得到一个超时异常,并且 cassandra 没有响应请求:

2012-07-03 15:35:43,299 WARN  - Could not fullfill request on this host CassandraClient<localhost:9160-16>
2012-07-03 15:35:43,300 WARN  - Exception: me.prettyprint.hector.api.exceptions.HTimedOutException: TimedOutException()
....
Caused by: TimedOutException()
at org.apache.cassandra.thrift.Cassandra$batch_mutate_result.read(Cassandra.java:20269)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
at org.apache.cassandra.thrift.Cassandra$Client.recv_batch_mutate(Cassandra.java:922)
at org.apache.cassandra.thrift.Cassandra$Client.batch_mutate(Cassandra.java:908)
at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:246)
at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:243)
at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:103)
at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:258)

日志文件中的最后一个条目是:

INFO 15:35:31,678 Writing Memtable-cf2@678837311(7447722/53551072 serialized/live bytes, 262236 ops)
INFO 15:35:32,810 Completed flushing \var\lib\cassandra\data\keySpaceName\cf2\keySpaceName-cf2-hd-205-Data.db (3292685 bytes) for commitlog position ReplayPosition(segmentId=109596147695328, position=131717208)
INFO 15:35:33,282 Compacted to [\var\lib\cassandra\data\keySpaceName\cf3\keySpaceName-cf3-hd-29-Data.db,].  33.992.615 to 30.224.481 (~88% of original) bytes for 282.032 keys at 1,378099MB/s.  Time: 20.916ms.
INFO 15:35:33,286 Compacting [SSTableReader(path='\var\lib\cassandra\data\keySpaceName\cf4\keySpaceName-cf4-hd-8-Data.db'), SSTableReader(path='\var\lib\cassandra\data\keySpaceName\cf4\keySpaceName-cf4-hd-6-Data.db'), SSTableReader(path='\var\lib\cassandra\data\keySpaceName\cf4\keySpaceName-cf4-hd-7-Data.db'), SSTableReader(path='\var\lib\cassandra\data\keySpaceName\cf4\keySpaceName-cf4-hd-5-Data.db')]
INFO 15:35:34,871 Compacted to [\var\lib\cassandra\data\keySpaceName\cf4\keySpaceName-cf4-hd-9-Data.db,].  4.249.270 to 2.471.543 (~58% of original) bytes for 30.270 keys at 1,489916MB/s.  Time: 1.582ms.
INFO 15:35:41,858 Compacted to [\var\lib\cassandra\data\keySpaceName\cf2\keySpaceName-cf2-hd-204-Data.db,].  48.868.818 to 24.033.164 (~49% of original) bytes for 135.367 keys at 2,019011MB/s.  Time: 11.352ms.

我创建了 4 个列族,如下所示:

ColumnFamilyDefinition cf1 = HFactory.createColumnFamilyDefinition(
“keyspacename”,
“cf1”,
ComparatorType.ASCIITYPE);

列族具有以下列数:

  1. 16 列
  2. 14 列
  3. 7 列
  4. 5 列

keyspace 是使用复制因子 1 和默认策略创建的(简单) 我用'Mutator#AddInsertion'插入记录(行)

有什么建议可以避免这种异常吗?

问候 WM

【问题讨论】:

  • 要在桌面上的单个节点上插入大量数据。看起来你被压缩过程伤害了。如果你在一个真实的集群中运行它(即 3 台以上的机器,RF=2),我怀疑你会看到这个问题。
  • 我创建了一个新环境,如下所述。同样的问题
  • 你能发布插入的代码吗?
  • 我在从 Cassandra 数据库中检索数据时也遇到了超时异常

标签: cassandra hector


【解决方案1】:

这个例外基本上是 Cassandra 说它在突变方面已经远远落后,以至于它无法在您的请求超时之前完成您的请求。假设您的 PC 不是野兽,您可能应该限制您的请求。我建议在捕获该异常后睡一会儿,然后重试;不小心将同一行写入两次并没有什么坏处,Cassandra 应该很快就能赶上。

如果您在生产环境中,我会更仔细地研究导致节点性能不佳的其他原因。

【讨论】:

  • 我的 PC A 有 4 核,8GB 内存。我在集群中添加了 2 台 PC B 和 C(每个 2 核,4 GB 内存)并将复制因子更改为 2。重新启动导入具有相同的结果。发生异常后,我等了 10 分钟并打开 cassandra 命令行。执行“describe cluster”导致机器A不可达。
  • 我创建了一个新环境。 3 台电脑 á 4 核和 8 GB 内存。我的程序在另一台 PC 上运行。在程序内部,我捕获了异常并添加了延迟并重试插入。
  • 听起来 Cassandra 进程要么耗尽了堆空间,要么操作系统正在杀死它以释放内存。我不是 Windows 人,所以我不知道如何检查第二种情况,但如果堆空间不足,您应该会在日志中看到一些内容。
  • 我明白了。我将服务器日志级别更改为 DEBUG 并收到异常 org.apache.thrift.transport.TTransportException: Cannot read. Remote side has closed. Tried to read 4 bytes, but only got 0 bytes.。在 linux 上运行 cassandra 后一切正常(内存不足异常除外)。
猜你喜欢
  • 2012-02-23
  • 2011-07-03
  • 2012-06-10
  • 2011-10-20
  • 2012-03-17
  • 2014-12-28
  • 2017-05-08
  • 2012-08-29
  • 1970-01-01
相关资源
最近更新 更多