cassandra - 优化通过Python驱动向Cassandra数据库插入数据

标签 cassandra cassandra-python-driver

我尝试使用 Python 驱动程序中的 BATCH 将 150.000 个生成的数据插入到 Cassandra。大约需要 30 seconds .我应该怎么做才能优化它并更快地插入数据? 这是我的代码:

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最佳实践列表等指南。

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

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

关于cassandra - 优化通过Python驱动向Cassandra数据库插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64350512/

相关文章:

java - Cassandra Sync 和 Async,哪一个返回结果集更快?

python - 如何使用 cassandra python-driver 实现基于 token 的分页?

python - 如何从 python cassandra 驱动程序传递 cassandra 函数?

Python Cassandra float 精度损失

python - 使用 cassandra-python-driver 记录所有查询

cassandra - 您如何确定特定 KairosDB/OpenTSDB 指标占用了多少磁盘空间?

nosql - Cassandra super 列族架构创建

java - Cassandra 自动模式生成器

cassandra - CQL 检查记录是否存在