CQLSSTableWriter内存泄漏

时间:2014-06-04 05:48:44

标签: garbage-collection cassandra

我正在使用Cassandra的CQLSSTableWriter将大量数据导入Cassandra。当我使用CQLSSTableWriter写入具有复合主键的表时,内存消耗不断增长。 JVM的GC无法收集任何已用内存。写入没有复合主键的表时,JVM GC工作正常。

我的Cassandra版本是2.0.5。操作系统是Ubuntu 14.04 x86-64。 JVM参数是-Xms1g -Xmx2g。这对于所有其他非复合主键情况就足够了。

可以通过以下测试案例重现该问题:

import org.apache.cassandra.io.sstable.CQLSSTableWriter;
import org.apache.cassandra.exceptions.InvalidRequestException;

import java.io.IOException;
import java.util.UUID;

class SS {
    public static void main(String[] args) {
        String schema = "create table test.t (x uuid, y uuid, primary key (x, y))";


        String insert = "insert into test.t (x, y) values (?, ?)";
        CQLSSTableWriter writer = CQLSSTableWriter.builder()
            .inDirectory("/tmp/test/t")
            .forTable(schema).withBufferSizeInMB(32)
            .using(insert).build();

        UUID id = UUID.randomUUID();
        try {
            for (int i = 0; i < 50000000; i++) {
                UUID id2 = UUID.randomUUID();
                writer.addRow(id, id2);
            }

            writer.close();
        } catch (Exception e) {
            System.err.println("hell");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我自己想通了。这行不应该太宽。 50000000对于单行来说太大了。