Cassandra的低写性能

时间:2011-12-06 14:09:21

标签: java performance nosql cassandra hector

我是NoSQL和Cassandra的新手。我正在尝试设置来实现内存缓存唯一的解决方案。我正在通过从100000行文件中逐行读取并使用Hector插入到Cassandra进行处理。我注意到每秒约6000个插入的吞吐量非常低。整个写操作大约20.5秒,这对我们的应用来说是不可接受的。我们需要每秒100000次插入。我正在使用4GB RAM的Windows 7计算机上进行测试。

我正在进行仅插入测试。

请让我知道我哪里出错了。请建议我如何每秒提高插入量。

Keyspace: Keyspace1
        Read Count: 0
        Read Latency: NaN ms.
        Write Count: 177042
        Write Latency: 0.003106884242157228 ms.
        Pending Tasks: 0
                Column Family: user
                SSTable count: 3
                Space used (live): 17691
                Space used (total): 17691
                Number of Keys (estimate): 384
                Memtable Columns Count: 100000
                Memtable Data Size: 96082090
                Memtable Switch Count: 1
                Read Count: 0
                Read Latency: NaN ms.
                Write Count: 177042
                Write Latency: NaN ms.
                Pending Tasks: 0
                Key cache capacity: 150000
                Key cache size: 0
                Key cache hit rate: NaN
                Row cache capacity: 150000
                Row cache size: 0
                Row cache hit rate: NaN
                Compacted row minimum size: 73
                Compacted row maximum size: 924
                Compacted row mean size: 784

我尝试了几种设置行缓存和密钥缓存的方法:

  1. 通过Cassandra CLI

  2. 通过NodeCmd:java org.apache.cassandra.tools.NodeCmd -p 7199 setcachecapacity Keyspace1 user 150000 150000

2 个答案:

答案 0 :(得分:9)

我不会将每秒6000次写入描述为“慢” - 但Cassandra可以做得更好。但请注意,Cassandra专为持久写入而设计,因此可能比仅使用内存的缓存解决方案具有更低的性能。

正如sbridges所说,使用单个客户端无法从Cassandra中获得完整的性能。尝试使用多个客户端线程,进程或计算机。

我认为您不会在单个节点上每秒获得100,000次写入。我在适度的硬件上每秒只获得了大约20,000-25,000次写入(尽管Cassandra自从我进行基准测试以来已经明显加快了)。单个客户端对单个商品节点的每秒6000似乎是正确的。

使用节点集群,您每秒肯定可以获得100,000个(请参阅http://techblog.netflix.com/2011/11/benchmarking-cassandra-scalability-on.html,了解最近每秒1,000,000次写入的基准测试!)

行缓存和密钥缓存有助于读取性能,而不是写入性能。

此外,请确保您正在批处理写入(如果适用) - 这将减少网络开销。

答案 1 :(得分:8)

您使用多少线程/进程执行插入? Hector调用是同步的,所以如果你只在客户端使用1个线程,那么这可能是你的瓶颈。