我使用标准“cassandra-driver”来访问 Cassandra 和 Scylla,以便通过 BatchStatement 插入/更新数据。我通过批量 500 行进行更新,并且仅针对 Cassandra 出现此错误(对于 Scylla 一切正常):
Error from server: code=2200 [Invalid query] message="Batch too large"
Python代码参见:
from cassandra import ConsistencyLevel
from cassandra.cluster import Cluster
from cassandra.cluster import ExecutionProfile
from cassandra.cluster import EXEC_PROFILE_DEFAULT
from cassandra.query import BatchStatement
...
cluster = Cluster(contact_points=["localhost"],
port=9042,
execution_profiles={EXEC_PROFILE_DEFAULT: profile},
control_connection_timeout=60,
idle_heartbeat_interval=60,
connect_timeout=60)
session = cluster.connect(keyspace="catalog")
...
insert_statement = session.prepare(f"INSERT INTO rn6.t01 ({columns}) VALUES ({items})")
batch = BatchStatement(consistency_level=ConsistencyLevel.ONE)
data_frm = pandas.DataFrame(generator.integers(999999,
size=(run_setup.bulk_row, run_setup.bulk_col)),
columns=[f"fn{i}" for i in range(run_setup.bulk_col)])
# prepare data
for row in data_frm.values:
batch.add(insert_statement, row)
session.execute(batch)
Cassandra 和 Scylla 似乎对批处理语句有不同的默认限制。这些限制你知道吗?
Scylla 和 Cassandra 都有可配置的批量大小限制
batch_size_fail_threshold_in_kb
。但它的默认值不同:Scylla 的默认值是 1024,而 Cassandra 的默认值是 50。您可以尝试在 Cassandra 的配置中增加它 - 或使用较小的批次。
Cassandra 有当前限制(请参阅https://github.com/apache/cassandra/blob/trunk/conf/cassandra.yaml中的值):
Scylla 有当前限制(请参阅https://github.com/scylladb/scylladb/blob/master/conf/scylla.yaml中的值)