J'ai un client Java qui pousse (INSERT) en lot vers Cassandra cluster. Les éléments du lot ont tous la même clé de ligne, donc ils ont tous sera placé dans le même nœud. De plus, je n'ai pas besoin que la transaction soit atomique, j'ai donc utilisé un lot non enregistré.
Le nombre de commandes INSERT dans chaque lot dépend de différents facteurs, mais peut être compris entre 5 et 50000. Tout d'abord, je viens de mettre autant de commandes que j'avais dans un lot et de le soumettre. Cela a jeté com.datastax.driver.core.exceptions.InvalidQueryException: Batch too large
. Ensuite, j'ai utilisé un plafond de 1000 INSERT par lot, puis jusqu'à 300. J'ai remarqué que je devinais au hasard sans savoir exactement d'où venait cette limite, ce qui peut causer des problèmes en cours de route.
Ma question est, quelle est cette limite? Puis-je le modifier? Comment savoir combien d'éléments peuvent être placés dans un lot? Quand mon lot est "plein"?
Je recommanderais de ne pas augmenter le plafond et de simplement diviser en plusieurs demandes. Mettre tout dans une seule et même requête géante aura un impact négatif significatif sur le coordinateur. Le fait d'avoir tout dans une partition peut améliorer le débit dans certains lots de taille en réduisant la latence, mais les lots ne sont jamais destinés à être utilisés pour améliorer les performances. Donc, essayer d'optimiser pour obtenir un débit maximal en utilisant différentes tailles de lots dépendra en grande partie du cas d'utilisation/du schéma/des nœuds et nécessitera des tests spécifiques, car il y a généralement une falaise sur la taille où il commence à se dégrader.
Il y a un
# Fail any batch exceeding this value. 50kb (10x warn threshold) by default.
batch_size_fail_threshold_in_kb: 50
option dans votre cassandra.yaml
pour l'augmenter, mais assurez-vous de tester pour vous assurer que vous aidez réellement et ne nuit pas à votre débit.
En regardant les journaux Cassandra vous pourrez repérer des choses comme:
ERREUR 19:54:13 Le lot de [correspondances] est de la taille 103,072 Ko, dépassant le seuil spécifié de 50 000 Ko de 53,072 Ko. (voir batch_size_fail_threshold_in_kb)
J'ai résolu ce problème en changeant le CHUNKSIZE à une valeur inférieure (par exemple 1) https://docs.datastax.com/en/cql/3.1/cql/cql_reference/copy_r.html
COPIER mytable DE 'mybackup' AVEC CHUNKSIZE = 1;
L'opération est beaucoup plus lente mais au moins ça marche maintenant