【发布时间】:2017-01-13 21:40:50
【问题描述】:
我正在尝试将数据加载到 Cassandra,但它失败了。我在单个节点(笔记本电脑)上运行,但在小型集群(3-5 个节点)中看到了相同的行为。我正在使用默认设置运行 Cassandra 3.9。
我使用 DataStax Java 驱动程序 3.0.0 从两个线程编写。我正在编写具有 50KB 行和 5-10K 列的行。磁盘上的总数据集约为 40GB。我正在写 5 行并发/线程。
插入一段时间后,我开始出现写入超时:
com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during write query at consistency LOCAL_ONE (1 replica were required but only 0 acknowledged the write)
我使用指数退避重试。最终,写入停止前进。此时,我看到了很长的 GC 暂停:
WARN [Service Thread] 2017-01-11 19:04:54,529 GCInspector.java:282 - ConcurrentMarkSweep GC in 4139ms. CMS Old Gen: 3456106376 -> 3455729576; Par Eden Space: 671088640 -> 670388064; Par Survivor Space: 83886080 -> 58722784
WARN [Service Thread] 2017-01-11 19:04:58,692 GCInspector.java:282 - ConcurrentMarkSweep GC in 4010ms. CMS Old Gen: 3456105584 -> 3455769528; Par Survivor Space: 83886080 -> 62960320
此时,看起来所有时间都花在了 GC 上。即使我终止了写作工作,Cassandra 似乎也没有恢复。它最终死于 OutOfMemoryError。我将 memtable 空间降低到 32MB:
memtable_heap_space_in_mb: 32
memtable_offheap_space_in_mb: 32
这可能已经修复了 OOM 错误(尽管我可能只是等待的时间不够长)。
我希望 Cassandra + 指数退避能将写入器限制到某个最大平衡写入速度,但这似乎没有发生。这是对 Cassandra 的不切实际的期望吗?我可以在作者中进行速率限制,但我不知道什么指标是合理的速率限制。有什么想法吗?
【问题讨论】:
-
我的行为看起来很像:stackoverflow.com/questions/21715622/…。 RussS 的回答中的第 4 点似乎是相关的。这仍然没有解释如何限制写入速度。
标签: cassandra garbage-collection jvm