我尝试使用批处理python驱动程序向cassandra插入150.000个生成的数据。大约需要30秒。我应该如何优化它并更快地插入数据?这是我的密码:
from cassandra.cluster import Cluster
from faker import Faker
import time
fake = Faker()
cluster = Cluster(['127.0.0.1'], port=9042)
session = cluster.connect()
session.default_timeout = 150
num = 0
def create_data():
global num
BATCH_SIZE = 1500
BATCH_STMT = 'BEGIN BATCH'
for i in range(BATCH_SIZE):
BATCH_STMT += f" INSERT INTO tt(id, title) VALUES ('{num}', '{fake.name()}')";
num += 1
BATCH_STMT += ' APPLY BATCH;'
prep_batch = session.prepare(BATCH_STMT)
return prep_batch
tt = []
session.execute('USE ttest_2')
prep_batch = []
print("Start create data function!")
start = time.time()
for i in range(100):
prep_batch.append(create_data())
end = time.time()
print("Time for create fake data: ", end - start)
start = time.time()
for i in range(100):
session.execute(prep_batch[i])
time.sleep(0.00000001)
end = time.time()
print("Time for execution insert into table: ", end - start)
1条答案
按热度按时间w3nuxt5m1#
主要问题是您使用批处理来插入数据—在cassandra中,这是一种糟糕的做法(请参阅文档以获取解释)。相反,您需要准备一个查询,并逐个插入数据—这将允许驱动程序将数据路由到特定节点,减少该节点上的负载,并允许更快地执行数据插入。伪代码如下所示(请参阅python驱动程序代码以了解确切的语法):
另一个问题是,您使用的是同步api—这意味着驱动程序将等待插入发生,然后触发下一个。为了提高速度,您需要改用异步api(有关详细信息,请参阅同一文档)。有关最佳实践等的列表,请参阅《使用datastax驱动程序开发应用程序》指南。
但实际上,如果您只想用数据加载数据库,我建议您不要重新发明轮子,而是:
将数据生成csv文件并使用dsbulk加载到cassandra中,dsbulk对数据加载进行了大量优化
使用nosqlbench生成数据并填充cassandra—它还针对数据生成和加载进行了大量优化(不仅限于cassandra)。