Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra在长时间运行时遇到OutOfMemory问题(Java堆空间)_Cassandra_Datastax Enterprise - Fatal编程技术网

Cassandra在长时间运行时遇到OutOfMemory问题(Java堆空间)

Cassandra在长时间运行时遇到OutOfMemory问题(Java堆空间),cassandra,datastax-enterprise,Cassandra,Datastax Enterprise,我们正在使用Cassandra进行一些实验,尝试一些长时间运行的测试用例(压力测试),并且在任何给定时间(可能是集群上的任何机器)集群的一个节点上都会遇到一些内存问题 我们正在一台装有Windows Server 2008和8GB RAM的机器上运行带有Cassandra 1.1.6的DataStax社区。此外,我们还将堆大小配置为2GB,而默认值为1GB 日志中的一个片段: java.lang.OutOfMemoryError:java堆空间 正在将堆转储到java_pid2440.hprof

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

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

日志中的一个片段:

java.lang.OutOfMemoryError:java堆空间

正在将堆转储到java_pid2440.hprof

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

错误22:16:56756线程[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(未知源)


任何用于调查和修复此问题的指针/帮助。?

长时间运行负载测试是正确的,但在生产用例中,您不会这样编写数据

当需要压缩行时,您的行可能会变得太大,无法放入RAM中。压实要求整行都能装入闸板中

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

对于“经常写入,几乎从不读取”的工作负载,可以有非常宽的行,但不应该接近20亿列的标记。用bucketing将其保存在数百万美元中

对于一个写/读混合工作负载,您经常读取整行,甚至数百列也可能太多


如果您正确对待Cassandra,您可以轻松处理每个节点每秒数千次的读写操作。在我的主集群上,每个节点大约有2.5k的并发读写操作。

能否提供更多有关插入内容和插入位置(键、列名等)的详细信息?您在声明集群和键空间时使用了哪些设置?任何细节都可能是相关的。我正在使用以下命令创建密钥空间:createkeyspace T_V_0,其中placement_strategy='org.apache.cassandra.locator.SimpleStrategy'和strategy_options={replication_factor:1};这些列基本上有一个DateType、UUIDType、3个IntegerType、2个LongType和1个DoubleType,其中comparator=UTF8Type和key\u validation\u class=UTF8Type和default\u validation\u class=UTF8Type您是否总是在同一地址(key+列名)插入?由于UTF8Type与其他验证不兼容(您可能应该保留为字节…这是一个默认值,允许您在一行中有多种类型的列),所以在某些写入操作中不会出现写入错误。不,我不会在同一地址插入。列名是UTF8Type,我使用的唯一键是UUID和TimeStamp的组合,因此从来没有重叠。我能够成功地插入数据。只有当我连续插入超过10亿条记录时,集群中的一个节点才会出现OutOfMemory异常。这可以是任何节点,但我相信它主要是接受来自客户端的最大连接的节点。我将JAVA堆大小增加到大约4GB,并且写入吞吐量有所提高。正如您正确提到的,我有很宽的行(每天的时间戳数据)。我可能会考虑将粒度更改为每小时,而不是24小时。否则,行可能会变得非常大。您认为反向比较器在这种情况下会有所帮助吗?除非您确定自己理解为什么要这样做,否则不要增加堆大小。增加堆大小首先会增加垃圾收集的暂停时间,这通常会让事情变得更糟,其次会从内核文件缓存中占用内存,至少在Linux上,这比Cassandra缓存快得多,最后在您的场景中,只会延迟OOM,不阻止它。除非您完全理解为什么要这样做,否则更改cassandra env文件中的任何内容都是一个坏主意。此外,像您这样做是处理此类数据的正确方法,但反向比较器不会对OOM问题产生影响,但可能对您的访问模式更好?只有你能告诉我,虽然我在阅读关于GC@的Oracle文档,但我在使用ParallelGC时偶然发现了这一点,我确信DataStax Cassandra的配置是为了: