我是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
我尝试了几种设置行缓存和密钥缓存的方法:
通过Cassandra CLI
通过NodeCmd:java org.apache.cassandra.tools.NodeCmd -p 7199 setcachecapacity Keyspace1 user 150000 150000
答案 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个线程,那么这可能是你的瓶颈。