通过Python驱动程序优化将数据插入Cassandra数据库

问题描述

我尝试使用Python驱动程序中的BATCH将150.000生成的数据插入Cassandra。大约需要Files inside the build-tools。我应该怎么做才能优化它并更快地插入数据? 这是我的代码

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)

解决方法

主要问题是您正在使用批处理插入数据-在Cassandra中,这是一种不良做法(有关说明,请参见documentation)。相反,您需要准备查询,并一个接一个地插入数据-这将允许驱动程序将数据路由到特定节点,从而减少该节点上的负载,并允许更快地执行数据插入。伪代码如下所示(有关确切语法,请参见python driver code

prep_statement = session.prepare("INSERT INTO tt(id,title) VALUES (?,?)")
for your_loop:
   session.execute(prep_statement,[id,title])

另一个问题是您使用的是同步API-这意味着驱动程序会等到插入发生然后再启动下一个。为了加快速度,您需要改用异步API(有关详细信息,请参见同一文档)。有关最佳做法等的列表,请参见Developing applications with DataStax drivers指南。

但是,实际上,如果您只想用数据加载数据库,我建议不要重新发明轮子,而是:

  • 使用DSBulk将数据生成为CSV文件并加载到Cassandra中,该加载项经过了针对加载数据进行了优化的
  • 使用NoSQLBench生成数据并填充Cassandra-它也针对数据生成和加载(不仅是Cassandra中)进行了大量优化。