2

我们正在通过尝试一些长时间运行的测试用例(压力测试)对 Cassandra 进行一些试验,并且我们在任何给定时间都在集群的一个节点上遇到了一些内存问题(它可能是集群上的任何机器!)

我们在装有 Windows Server 2008 和 8 GB RAM 的机器上运行带有 Cassandra 1.1.6 的 DataStax Community。此外,我们将堆大小配置为 2GB,而不是默认值 1GB。

日志中的一个片段:

java.lang.OutOfMemoryError:Java 堆空间

将堆转储到 java_pid2440.hprof ...

已创建堆转储文件 [11.713 秒内 1117876234 个字节]

错误 22:16:56,756 线程 Thread[CompactionExecutor:399,1,main] 中的异常

java.lang.OutOfMemoryError:Java 堆空间

在 org.apache.cassandra.io.util.FastByteArrayOutputStream.expand(FastByteArrayOutputStream.java:104)

在 org.apache.cassandra.io.util.FastByteArrayOutputStream.write(FastByteArrayOutputStream.java:220)

在 java.io.DataOutputStream.write(未知来源)

任何指示/帮助来调查和解决这个问题。??

4

1 回答 1

3

通过长时间运行负载测试,您正在做正确的事情,但在生产用例中,您不会像这样编写数据。

当需要压缩它们时,您的行可能会变得太大而无法放入 RAM。压缩需要整行才能放入 RAM。

每行也有 20 亿列的硬性限制,但实际上你不应该让行增长那么宽。通过将数据集中的日期或服务器名称或其他一些常见的值添加到行键来存储它们。

对于“经常写入几乎从不读取”的工作负载,您可以拥有非常宽的行,但您不应接近 20 亿列标记。通过分桶保持数百万。

对于频繁读取整行的写入/读取混合工作负载,即使数百列也可能太多。

如果您正确对待 Cassandra,您将轻松处理每个节点每秒数以千计的读写操作。我看到我的主集群上每个节点同时进行大约 2.5k 读取和写入。

于 2013-04-10T11:50:14.003 回答