Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
Java Cassandra节点因堆空间错误而频繁死亡_Java_Cassandra - Fatal编程技术网

Java Cassandra节点因堆空间错误而频繁死亡

Java Cassandra节点因堆空间错误而频繁死亡,java,cassandra,Java,Cassandra,我有一个问题,Cassandra节点经常因为“java.lang.OutOfMemoryError:java堆空间”异常而死亡 我的设置由5个运行在5个虚拟机上的5个Cassandra 2.0.11节点组成。 每个虚拟机都有8GB RAM、100GB磁盘容量和相当快的CPU 我已经尝试过增加堆的大小。目前它被设置为默认值(8GB的1/4=2GB) 记忆填充得非常快,接缝可能是限制因素。我怎样才能强迫卡桑德拉使用更少的内存?我可以容忍较慢的写操作以换取稳定性 目前我只写,没有更新,读取或删除。 我

我有一个问题,Cassandra节点经常因为“java.lang.OutOfMemoryError:java堆空间”异常而死亡

我的设置由5个运行在5个虚拟机上的5个Cassandra 2.0.11节点组成。 每个虚拟机都有8GB RAM、100GB磁盘容量和相当快的CPU

我已经尝试过增加堆的大小。目前它被设置为默认值(8GB的1/4=2GB)

记忆填充得非常快,接缝可能是限制因素。我怎样才能强迫卡桑德拉使用更少的内存?我可以容忍较慢的写操作以换取稳定性

目前我只写,没有更新,读取或删除。 我用每个文件大约100000个值编写时间序列。并发级别为仲裁,复制因子为3。我使用datastax的java驱动程序

表的创建方式如下:

"CREATE TABLE IF NOT EXISTS %s.%s(\n" +
        "ts_type text,\n" +
        "ts_name text,\n" +
        "year int,\n" +
        "time timestamp,\n" +
        "value double,\n" +
        "PRIMARY KEY((ts_type, ts_name), year, time));"
for (final Double value : data) {
    final Insert insertStatement = (Insert) QueryBuilder.insertInto(keyspace, tableName)
            .value("ts_type", tsType)
            .value("ts_name", tsName)
            .value("time", timestampAsDate)
            .value("year", timestamp.getYear())
            .value("value", value)
            .setConsistencyLevel(consistencyLevel);
    batch.add(insertStatement);
    zeitpunkt = zeitpunkt.plus(period);
    if (index++ % 200 == 0) {
        sets.add(client.executeAsync(batch));
        batch = (Batch) QueryBuilder.unloggedBatch().setConsistencyLevel(consistencyLevel);
    }
}
数据是这样写的:

"CREATE TABLE IF NOT EXISTS %s.%s(\n" +
        "ts_type text,\n" +
        "ts_name text,\n" +
        "year int,\n" +
        "time timestamp,\n" +
        "value double,\n" +
        "PRIMARY KEY((ts_type, ts_name), year, time));"
for (final Double value : data) {
    final Insert insertStatement = (Insert) QueryBuilder.insertInto(keyspace, tableName)
            .value("ts_type", tsType)
            .value("ts_name", tsName)
            .value("time", timestampAsDate)
            .value("year", timestamp.getYear())
            .value("value", value)
            .setConsistencyLevel(consistencyLevel);
    batch.add(insertStatement);
    zeitpunkt = zeitpunkt.plus(period);
    if (index++ % 200 == 0) {
        sets.add(client.executeAsync(batch));
        batch = (Batch) QueryBuilder.unloggedBatch().setConsistencyLevel(consistencyLevel);
    }
}
以下是即将死亡节点的堆栈跟踪:

如你所见,GC在这里花了很长时间

以下是即将死亡节点的堆转储:

知道我做错了什么吗


提前感谢您的帮助。

插入只需刷新到磁盘,不会导致OOM异常

卡桑德拉确实需要大量内存,2GB似乎很低。它的性能不仅来自于每个节点有大量的内存,还来自于大量的节点,创建了一个非常大的缓存


我建议您每个节点有一个8GB的堆,并且您的虚拟机应该增加到~32GB的内存。确保安装了JNA,以便Cassandra可以利用额外的堆外内存。

我刚刚就堆空间问题与Cassandra(2.0)进行了激烈的斗争。我运行了3个VM节点,每个节点8GB RAM,复制1。不用说,这不是最优的

以下是我使用它的目的和发现:
我存储了一个很长的多部分键((uuid)、text、text、text、int)来引用一个值(text)和一些其他的跟踪信息,这些信息实际上不是必需的,但是很好,它们采用了另外两个int的形式。我也有一个索引(过去时)在这些额外的好有字段之一。卡桑德拉经常抱怨,我的批量插入处理时间太长了,每分钟大约有4000个。如果/当我尝试进行nodetool修复时,它通常会因堆空间错误而崩溃。我做的第一件事就是删除了那个漂亮但最终不必要的索引。为了修复撞车事故,这项工作停止了,但修复工作需要几天才能完成。其次,我将8GB提高到24GB。听起来这不是你的奢侈品,但这就是你所需要的。这使得维修时间从几天变为几小时,就像其中的8小时一样。第三,我从2.0升级到了2.2。一旦我在所有三个节点上运行了修复,花了24小时,我升级了每个节点,一次升级一个,然后在所有节点都升级后再次在每个节点上运行修复。现在修复,不仅不会崩溃,而且在大约两个小时内完成整个集群的修复。更快,更稳定。此后,我添加了第四个节点和第二个副本。还是没有问题。我认为最大的问题是二级指数。我还发现安装jemalloc可以极大地提高速度

谢谢你的回复。遗憾的是,增加更多的内存目前不是一种选择。运行虚拟机的机器本身只有16GB左右。您认为有可能在给定设置的负载下运行cassandra stable吗?您可以在16GB虚拟机上运行。不确定那些盒子上还有什么,但是你的虚拟机应该是专用的。因此,如果您有16GB,请给Cassandra 8GB,并确保正确安装了JNA。额外的8GB将通过JNA提供给Cassandra。但是不要让你的堆>8GB,超过8GB的Java堆管理不是很好。正如我所说的,现在添加内存是不可能的。虚拟机运行在需要保持可用性的同事工作站上。我知道这个设置还远远不够完美,但在我们投资于更好的基础设施之前,它只用于cassandra的实验。datastax的Cassandra文档指出,最低系统要求为8GB内存。所以我希望在这种硬件上运行一个稳定的系统是可能的。在这种设置下,真的没有办法知道有多少CPU或内存可用。为此,您最好在AWS上托管。他们有一个“免费层”看看吧。或者,如果性能不是您的问题,请延迟加载脚本。您是否控制了一次处理中的请求数的速率?如果您提交请求的速度比完成请求的速度快,那么最终您将在某个时候压倒您的集群。了解集群的容量总是很好的,很可能你超过了它。这是一篇非常有趣的帖子,但很难找出它们的关键点。尝试添加一些格式并总结您的要点:删除不必要的索引、添加ram、升级。现在,你需要一些时间来弄清楚你的主要观点是什么。