2016-08-13 1 views
9

Je reçois une requête d'écriture en bloc pour laisser dire 20 clés du client. Je peux les écrire en C * en un seul lot ou les écrire individuellement de manière asynchrone et attendre à l'avenir pour les terminer.Cassandra: Optimisation d'écriture par lots

L'écriture en batch ne semble pas être une option goo selon la documentation car mon taux d'insertion sera élevé et si les clés appartiennent à des partitions différentes, les coordinateurs devront faire un travail supplémentaire.

est-il un moyen de DataStax pilote java avec lequel je peux les clés du groupe qui pourrait appartenir à une même partition et puis le club en petits lots puis faire écrire par lots invidual unlogged dans async. Dans ce je fais moins d'appels rpc au serveur en même temps le coordonnateur devra écrire localement. J'utiliserai une politique de jeton.

Répondre

7

Votre idée est bonne, mais il n'y a pas de manière intégrée, vous le faites habituellement manuellement.

La règle principale ici est d'utiliser TokenAwarePolicy, donc une certaine coordination aurait lieu du côté du conducteur. Ensuite, vous pourriez regrouper vos demandes par égalité de clé de partition, ce qui serait probablement suffisant, en fonction de votre charge de travail. Ce que je veux dire par "regroupement par égalité de clé de partition" est par exemple le suivant: vous avez des données qui ressemble à

MyData { partitioningKey, clusteringKey, otherValue, andAnotherOne } 

Ensuite, lors de l'insertion de plusieurs de ces objets, vous les regrouper par MyData.partitioningKey. Il est, pour toutes les valeurs existant paritioningKey, vous prenez tous les objets avec partitioningKey même, et les enveloppez dans BatchStatement. Maintenant, vous avez plusieurs BatchStatements, alors il suffit de les exécuter.

Si vous souhaitez aller plus loin et mimétique hashing cassandra, alors vous devriez regarder les métadonnées du cluster via getMetadata méthode com.datastax.driver.core.Cluster classe, il y a la méthode getTokenRanges et de les comparer à la suite de Murmur3Partitioner.getToken ou tout autre partitionneur vous avez configuré dans cassandra.yaml. Je n'ai jamais essayé ça moi-même. Donc, je recommanderais de mettre en œuvre la première approche, puis de comparer votre application. J'utilise cette approche moi-même, et sur ma charge de travail cela fonctionne beaucoup mieux que sans lots, sans parler des lots sans regroupement.

+0

Comment faire pour aller au même I clés de lot noeud? - Est-ce que le client de data stax expose les jetons appartenant à chaque nœud, alors je peux murmurer et les grouper ensuite? – Peter

+0

A répondu avec edit. – folex

+0

pouvez-vous expliquer "vous pourriez regrouper vos demandes par l'égalité des clés de partition" un peu plus? Je n'ai pas compris cette partie – Peter

0

Logged Les lots doivent être utilisés avec précaution dans Cassandra car ils imposent des frais généraux supplémentaires. Cela dépend également de la distribution des clés de partition. Si votre écriture en bloc cible une partition unique, l'utilisation du lot Unlogged entraîne une seule opération d'insertion.

En général, les écrire individuellement au moyen d'une manière async semble être un bon aproche comme le souligne ici: https://medium.com/@foundev/cassandra-batch-loading-without-the-batch-the-nuanced-edition-dd78d61e9885

Vous pouvez trouver un exemple de code sur le site ci-dessus comment traiter plusieurs écrit async: https://gist.github.com/rssvihla/26271f351bdd679553d55368171407be#file-bulkloader-java https://gist.github.com/rssvihla/4b62b8e5625a805583c1ce39b1260ff4#file-bulkloader-java

EDIT:
s'il vous plaît lire ceci aussi: https://inoio.de/blog/2016/01/13/cassandra-to-batch-or-not-to-batch/#14

Que coûte un lot de partition unique?

Aucun journal de lots n'est écrit pour les lots de partition unique. Le coordinateur n'a aucun travail supplémentaire (comme pour les partitions multiples ) parce que tout va dans une seule partition. Les lots de partition simples sont optimisés: ils sont appliqués avec un seul RowMutation [10]. En quelques mots: les lots de partition unique ne mettent pas beaucoup plus de charge sur le serveur que les écritures normales.


Quel est le coût de traitement par lots de partition à plusieurs?

Permettez-moi de citer Christopher Batey, parce qu'il a résumé cette très bien dans son poste « Cassandra anti-modèle: lots journalisé » [3]:

Cassandra [est d'abord] écrit toutes les déclarations un journal de lot. Ce journal de lots est répliqué sur deux autres nœuds au cas où le coordinateur échoue. Si le coordinateur échoue, une autre réplique du journal de lots prendra le relais. [..] Le coordinateur doit faire beaucoup plus de travail que tout autre nœud du cluster.

Encore une fois, en balles ce qui doit être fait:

  1. sérialisation les déclarations de lots
  2. écrire le lot sérialisé à la table du système de journal des lots
  3. répliquées de ce lot sérialisé à 2 noeuds
  4. coordonnée écrit sur les noeuds contenant les différentes partitions
  5. sur succe ss retirer le lot sérialisé à partir du journal de lot (également sur les 2 répliques)

Rappelez-vous que les lots non exploitées pour plusieurs partitions sont dépréciées depuis Cassandra 2.1.6