Comment utiliser efficacement par Lots écrit à cassandra à l'aide de datastax pilote java?
J'ai besoin d'écrire dans des Lots de Cassandra à l'aide de Datastax pilote Java et c'est ma première fois que je suis en train d'utiliser le traitement par lots avec datastax pilote java donc je vais avoir un peu de confusion -
Ci-dessous mon code dans lequel je suis en train de faire une Déclaration d'objet et les ajouter dans le Lot et le réglage de la ConsistencyLevel que le QUORUM ainsi.
Session session = null;
Cluster cluster = null;
//we build cluster and session object here and we use DowngradingConsistencyRetryPolicy as well
//cluster = builder.withSocketOptions(socketOpts).withRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE)
public void insertMetadata(List<AddressMetadata> listAddress) {
//what is the purpose of unloggedBatch here?
Batch batch = QueryBuilder.unloggedBatch();
try {
for (AddressMetadata data : listAddress) {
Statement insert = insertInto("test_table").values(
new String[] { "address", "name", "last_modified_date", "client_id" },
new Object[] { data.getAddress(), data.getName(), data.getLastModifiedDate(), 1 });
//is this the right way to set consistency level for Batch?
insert.setConsistencyLevel(ConsistencyLevel.QUORUM);
batch.add(insert);
}
//now execute the batch
session.execute(batch);
} catch (NoHostAvailableException e) {
//log an exception
} catch (QueryExecutionException e) {
//log an exception
} catch (QueryValidationException e) {
//log an exception
} catch (IllegalStateException e) {
//log an exception
} catch (Exception e) {
//log an exception
}
}
Et ci-dessous est mon AddressMetadata
classe -
public class AddressMetadata {
private String name;
private String address;
private Date lastModifiedDate;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(Date lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
}
Maintenant, ma question est - est-ce la façon dont je suis l'aide de Lot à insérer dans cassandra avec Datastax Java Pilote est correct? Et que dire de réessayer politiques, de sens que si un lot d'exécution de l'instruction a échoué, ce qui va arriver, il va essayer à nouveau?
Et quel est le meilleur moyen de l'utilisation des lots écrit à cassandra à l'aide du pilote java?
Vous devez vous connecter pour publier un commentaire.
D'abord un peu d'un coup de gueule:
Le lot mots clés dans Cassandra est pas une optimisation des performances pour le traitement par lots ensemble de grands seaux de données pour des charges en vrac.
Lots sont utilisés pour regrouper les opérations atomiques, les actions que vous vous attendez à se produire ensemble. Lots garantie que si une seule partie de votre lot est réussie, le lot entier est réussie.
À l'aide des lots ne sera probablement pas faire de votre masse ingestion de courir plus vite
Maintenant, pour tes questions:
Cassandra utilise un mécanisme appelé lot de journalisation afin d'assurer un lot de l'atomicité. En spécifiant anonymes lot, vous désactivez cette fonctionnalité pour le lot n'est plus atomique et peut échouer avec une exécution partielle. Naturellement, il y a une perte de performance pour l'enregistrement de vos lots et leur assurer l'atomicité, à l'aide anonymes lots sera supprime cette pénalité.
Il y a, dans certains cas, vous souhaiterez peut-être utiliser anonymes lots afin de s'assurer que les demandes (inserts) qui appartiennent à la même partition, sont envoyés ensemble. Si vous lot l'ensemble des opérations et elles doivent être effectuées dans les différentes partitions /nœuds, vous êtes essentiellement la création de plus de travail pour votre coordinateur. Voir des exemples précis de ce à Ryan du blog:
Lire ce post
Je ne vois rien de mal avec votre code ici, tout dépend de ce que vous essayez d'atteindre. Creuser dans ce billet de blog, j'ai partagé pour plus d'informations.
Un lot sur son propre ne sera pas réessayer sur son propre si elle échoue. Le pilote n'ont réessayer politiques, mais vous devez appliquer séparément.
La stratégie par défaut dans le pilote java uniquement tentatives dans ces scénarios:
récupérée.
distribué journal utilisé par lot instructions.
Lire plus sur le politique par défaut et d'envisager moins conservateur politiques en fonction de votre cas d'utilisation.
Nous avons débattu pendant un certain temps entre l'utilisation asynchrone et les lots. Nous avons essayé les deux pour comparer. Nous avons obtenu un meilleur débit à l'aide de "anonymes lots" par rapport à un individu "async" les demandes. Nous ne savons pas pourquoi, mais sur la base Ryan du blog, je devine que cela a à voir avec la taille d'écriture. Nous sommes probablement faire de trop nombreuses petites écrit et donc de traitement par lots, probablement, nous a donné de meilleures performances comme il le fait de réduire le trafic réseau.
Je dois mentionner que nous ne sommes pas même à faire des "anonymes lots" à la manière recommandée. Il est recommandé de faire un lot avec une seule partition de la clé. Fondamentalement, le lot de tous les enregistrements qui appartiennent à la même clé de partition. Mais, nous étions juste dosage de certains dossiers qui appartiennent probablement à des partitions différentes.
Quelqu'un fait un peu de benchmarking pour comparer async et "anonymes lots" et nous avons trouvé que très utile. Voici la lien.