Usei o 'driver cassandra' padrão para acessar Cassandra e Scylla para inserir/atualizar dados via BatchStatement. Atualizei via lote 500 linhas e recebi apenas para Cassandra este erro (tudo funciona bem para Scylla):
Error from server: code=2200 [Invalid query] message="Batch too large"
Código Python, consulte:
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)
Parece que Cassandra e Scylla têm limites padrão diferentes para instruções em lote. Você conhece esses limites?
Tanto o Scylla quanto o Cassandra têm um limite configurável de tamanho de lote,
batch_size_fail_threshold_in_kb
. Mas seu valor padrão é diferente: o padrão de Scylla é 1024, enquanto o padrão de Cassandra é 50.Você pode tentar aumentá-lo na configuração do Cassandra - ou usar lotes menores.
Cassandra tem limites atuais (veja os valores em https://github.com/apache/cassandra/blob/trunk/conf/cassandra.yaml ):
Scylla tem limites atuais (veja valores em https://github.com/scylladb/scylladb/blob/master/conf/scylla.yaml )