我一直在研究Cassandra几天,找到将数据插入Cassandra的最快捷有效的方法。有些人不建议使用批处理:https://lostechies.com/ryansvihla/2014/08/28/cassandra-batch-loading-without-the-batch-keyword/
我尝试过批处理,速度非常快,大约25k插入/秒,但我发现了一些问题:
Error : Batch statement cannot contain more than 65535 statements cassandra
另外,我发现它缺少数据......不知道为什么。
我也尝试过prepare语句和execute_async,如下所示:
query = "INSERT INTO leaks (value0, value1, value2, value3, value4) VALUES (?, ?, ?, ?, ?)"
prepared = session.prepare(query)
for row in data:
try:
session.execute_async(prepared, (cassandra.util.uuid_from_time(value0, value1, value2, value3, value4))
except Exception as e:
print "An error occured : " + str(e)
pass
使用此代码,我有大约3-4k插入/秒。我想知道插入数据的人有多少。
我有3个节点,每个6个CPU和32GB内存。我还将commitlog设置为另一个磁盘。
答案 0 :(得分:1)
批量插入数据并不是那么糟糕。但是您试图在批量限制之上的单个批次中插入更多65k记录。记住,cassandra在关系数据库方面没有交易。
使用许多不同的分区键的大批量和批次也是一个坏主意。单个批处理由单个协调器处理以取消更改。如果您的批处理包含单个分区键(而不是整个主键!)键,那么您很幸运,因为所选择的协调器可能是一个持有该分区的节点,从而加快了这一点。
如果您的批处理包含不同的分区键,这会给协调器节点带来更多压力(并且运气好,所有节点都需要)。在并行批处理上发生这种情况时,您的群集将很忙。
通常,您可以更快地将批次分组以匹配分区键和非常小的批量大小(我每批使用100行),但您应该自己尝试找到理想的批量大小)。比这些批次使用异步查询(https://datastax.github.io/python-driver/getting_started.html#asynchronous-queries)。这样做,您将在所有节点上并行运行许多小批量。
我可以在15节点集群上每秒存档大约120k次插入,每行有大约8k的负载,这几乎是网络链接速度(~800MBit / s)。