2

我正在对 cassandra thrift 与 CQL 进行性能测试,我使用以下代码在标准列族中输入 1000 条记录,其中 4 列使用 CQL 和 thrift。但是与datastax相反,我使用thrift比使用CQL获得更高的吞吐量和更少的延迟。如果我在某个地方出错了,谁能帮助我?

公共无效插入使用Cql(){

    try {
        long start = System.currentTimeMillis();
        System.out.println("Inserting using cql started at: " + System.currentTimeMillis());

        for (int i = 0; i < 10000; i++) {
            session.execute(boundStatement.bind(Integer.toString(i), Integer.toString(i), Integer.toString(i), Integer.toString(i)));
        }

        System.out.println("Inserting using cql ended at: " + System.currentTimeMillis());
        long end = System.currentTimeMillis();
        long diff = end - start;
        System.out.println("Time taken is= " + diff);
    } catch (Exception e) {
        e.printStackTrace();

    }
}

公共无效插入使用Thrift(字符串键空间){ System.out.print(键空间);

    try {
        Column col;
        ColumnOrSuperColumn column;

        client.set_keyspace(keyspace);
        long start = System.currentTimeMillis();
        System.out.println("Inserting using thrift started at: " + System.currentTimeMillis());
        for (int j = 0; j < 1000; j++) {
            for (int i = 0; i < 4; i++) {
                col = new Column();
                col.setName(ByteBuffer.wrap(Integer.toString(i).getBytes()));
                col.setValue(ByteBuffer.wrap(Integer.toString(i).getBytes()));
                col.setTimestamp(System.currentTimeMillis());

                column = new ColumnOrSuperColumn();
                column.setColumn(col);

                mutations.add(new Mutation().setColumn_or_supercolumn(column));
            }

            mutationMap.put("data", mutations);
            record.put(ByteBuffer.wrap(Integer.toString(j).getBytes()), mutationMap);
            client.batch_mutate(record, ConsistencyLevel.ONE);
            mutations.clear();
            mutationMap.clear();
            record.clear();

        }

        System.out.println("Inserting using thrift ended at: " + System.currentTimeMillis());
        long end = System.currentTimeMillis();
        long diff = end - start;
        System.out.println("Time taken is= " + diff);
    } catch (InvalidRequestException ex) {
        Logger.getLogger(PerformaceTest.class.getName()).log(Level.SEVERE, null, ex);
    } catch (UnavailableException ex) {
        Logger.getLogger(PerformaceTest.class.getName()).log(Level.SEVERE, null, ex);
    } catch (TimedOutException ex) {
        Logger.getLogger(PerformaceTest.class.getName()).log(Level.SEVERE, null, ex);
    } catch (TException ex) {
        Logger.getLogger(PerformaceTest.class.getName()).log(Level.SEVERE, null, ex);
    }
}
4

2 回答 2

0

execute()如果您替换为executeAsync()并等待所有任务完成,我希望性能会提高(GuavaFutures.allAsList(...).get()是一种方便的方法)。

目前尚不清楚您是在本地还是分布式 Cassandra 安装上运行它。分布式环境中的性能增益应该更高,特别是如果您在Cluster初始化时进行一些调整。但即使在本地 Cassandra 安装上,也必须有明显的改进。

另外,我建议将循环中的记录数增加到 1M 并添加预热循环。您可能没有对 Cassandra 进行基准测试,而是在 Cassandra JVM 中进行了 JIT 编译器 :)

于 2013-07-11T23:40:31.167 回答
0

不,您没有做错任何事情,因为这种低容量节俭驱动程序平均看起来更快,但在第 95 和第 99 个百分位数上会有更高的峰值,并且随着负载的增加它会变得更糟。尝试使用指标进行性能测试http://metrics.codahale.com/并查看延迟分布,而不仅仅是平均响应时间。还要注意 cassandra 缓存,这样您就不会使用冷缓存运行一个测试,然后使用暖缓存运行下一个测试。根据我的经验,使用本机驱动程序,因为它得到广泛支持,并且在更有可能删除节俭驱动程序的情况下使用,特别是在 C* 2.0 中。

于 2013-07-11T17:16:59.603 回答