You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用execute_concurrent写入Cassandra速度极慢如何优化

问题根因

你遇到的超慢写入完全是代码逻辑错误导致的,和execute_concurrent接口性能、Cassandra服务端能力没有关系:

  • 外层套了遍历全量数据行数的for循环,每一次循环都把全部14000行的参数列表传给execute_concurrent_with_args重跑一遍,等于全量数据被重复提交14000次,不是并发没生效,是你制造了天量的重复请求
  • 循环里硬加了time.sleep(0.1),每次循环强制暂停100毫秒,平白增加了上千秒的无意义等待
  • 循环末尾写了session.execute(batch),但代码里从来没定义过batch变量,正常运行到这行直接抛异常,前面跑的所有并发请求完全没做结果校验,大概率大量请求根本没成功写入
  • 开头导入了Flask框架的session对象,后续连接Cassandra时又把连接实例命名为session,存在变量名覆盖风险,容易触发不可预期的请求错误
  • 你用的是云托管Cassandra(通过secure_connect_bundle连接),网络开销比本地集群高,但远到不了单条5秒的程度,这个耗时完全是重复请求+报错重试堆出来的
  • 表结构虽然所有字段都设成varchar不太合理,但对1.4万行这个量级的写入完全没影响,不需要调整表结构。
优化步骤
  • 直接删掉整个套在execute_concurrent_with_args外面的for循环、time.sleep逻辑、未定义的batch执行代码。execute_concurrent_with_args本身会自动按设定的并发数,把传入的参数列表里的所有语句全部提交执行,只需要调用一次就行,不需要循环调用。
  • 调整并发数适配你的环境:2核CPU的客户端连云托管Cassandra,并发数设32~64就够,开500并发会直接打满客户端CPU、造成网络连接拥塞,反而会触发服务端限流降速。
  • 把Cassandra连接对象重命名避免和Flask的session冲突,给写入操作单独配置ExecutionProfile,把请求超时设成30秒,开启默认重试策略,避免偶发网络波动导致写入失败。
  • 如果要加进度条,可以遍历execute_concurrent返回的结果迭代器统计进度,不要在提交请求的环节套无意义循环。

修正后的核心写入代码参考:

# 前面读配置、建集群连接的部分,把session改名为cas_session避免变量冲突
cluster = Cluster(cloud=cassandra_config, auth_provider=auth_provider)
cas_session = cluster.connect()
# 后续建表、读csv、生成df的逻辑保持不变,所有调用session的地方替换成cas_session

# 写入部分修正
insert_qry = f"INSERT INTO {table_}({columns}) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)"
statement = cas_session.prepare(insert_qry)
# 生成参数列表的逻辑不变
parameters = [
    (str(df.iat[i,0]), str(df.iat[i,1]), str(df.iat[i,2]), str(df.iat[i,3]), 
     str(df.iat[i,4]), str(df.iat[i,5]), str(df.iat[i,6]), str(df.iat[i,7]), 
     str(df.iat[i,8]), str(df.iat[i,9]), str(df.iat[i,10]), str(df.iat[i,11]), 
     str(df.iat[i,12])) 
for i in range(len(df))]

# 单次调用并发执行即可
start = time.time()
execute_concurrent_with_args(
    cas_session,
    statement,
    parameters,
    concurrency=64,
    raise_on_first_error=True
)
print(f"写入完成,总耗时:{time.time() - start:.2f}秒,共写入{len(parameters)}行")
性能预期

修正代码后,你当前的2核客户端+云托管Cassandra环境,14000行数据的正常写入耗时在310秒,平均写入速度15005000行/秒。如果换成本地部署的3节点Cassandra集群,同配置客户端写入速度可以稳定在1万行/秒以上,1.4万行数据1~2秒就能完成写入。
注意不要盲目调大并发数,云托管Cassandra一般对单客户端的请求速率有限流阈值,并发开太高触发限流后,写入速度反而会断崖式下跌。

内容的提问来源于stack exchange,提问作者Manu Vats

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:18:04