我们正在通过尝试一些长期运行的测试用例(压力测试)来尝试Cassandra,并且我们在任何给定时间在群集的一个节点上遇到一些内存问题(它可能是群集中的任何计算机) !)
我们在装有Windows Server 2008和8 GB RAM的计算机上运行带有Cassandra 1.1.6的DataStax社区。此外,我们已将堆大小配置为2GB,而默认值为1GB。
日志摘录:
java.lang.OutOfMemoryError:Java堆空间
将堆转储到java_pid2440.hprof ...
创建堆转储文件[1117136234字节11.713秒]
ERROR 22:16:56,756线程中的异常线程[CompactionExecutor:399,1,main]
java.lang.OutOfMemoryError:Java堆空间
at org.apache.cassandra.io.util.FastByteArrayOutputStream.expand(FastByteArrayOutputStream.java:104)
at org.apache.cassandra.io.util.FastByteArrayOutputStream.write(FastByteArrayOutputStream.java:220)
at java.io.DataOutputStream.write(Unknown Source)
任何指针/帮助调查和修复此问题。??
答案 0 :(得分:3)
通过长时间运行负载测试,你做的是正确的,但在生产用例中,你不会写这样的数据。
当压缩它们时,你的行可能会变得太大而无法容纳在RAM中。压缩需要将整行放入RAM中。
每行还有20亿列的硬限制,但实际上你不应该让行增长那么宽。通过将数据集中的日期或服务器名称或其他常用值添加到行键来暂停它们。
对于“通常读取 - 几乎从不”的工作负载,您可以拥有非常宽的行,但不应接近20亿列标记。通过分组保持数百万。
对于写入/读取混合工作负载,您经常读取整行,甚至数百列可能太多。
如果你正确对待Cassandra,你将轻松处理每个节点每秒数千次读写操作。我在主集群上看到每个节点同时进行大约2.5k的读写操作。