Java – Cassandra – Requêtes sur un cluster


Java permet d’adresser le cluster Cassandra avec toutes ses possibilités de load balancing à condition de disposer des bonnes librairies.

Plusieurs librairies Java sont nécessaires afin de pouvoir bénéficier de l’architecture cluster de Cassandra :

  1. JDBC Cassandra
  2. SLF4J
  3. Netty

Librairies

Un driver packagé est disponible chez DbSchema.com et s’appuie sur le driver JDBC Cassandra de Datastax.

Il contient les jar suivants :

HdrHistogram-2.1.4.jar
cassandra-driver-core-3.0.0.jar
cassandra-driver-extras-3.0.0.jar
cassandra-driver-mapping-3.0.0.jar
cassandrajdbc1.1.jar
guava-16.0.1.jar
jackson-annotations-2.6.0.jar
jackson-core-2.6.3.jar
jackson-databind-2.6.3.jar
javax.json-api-1.0.jar
joda-time-2.9.1.jar
lz4-1.2.0.jar
metrics-core-3.1.2.jar
netty-buffer-4.0.33.Final.jar
netty-codec-4.0.33.Final.jar
netty-common-4.0.33.Final.jar
netty-handler-4.0.33.Final.jar
netty-transport-4.0.33.Final.jar
slf4j-api-1.7.7.jar
snappy-java-1.0.5.jar

D’autres librairies sont nécessaires :

netty-transport-native-epoll-4.0.32.Final-linux-x86_64.jar
slf4j-simple-1.7.21.jar

Ces librairies sont à intégrer au projet Java nécessitant une connexion à un cluster Cassandra.

Class Java exemple

Le code Java qui suit est nécessaire et suffisant pour exécuter des instructions CQL avec un cluster Cassandra.

Il prend en charge le load balancing.

(Note : Dans un souci de simplification de l’exemple, ce code utilise un code avec valeur en littéral et non une bind variable)

TestCassandra.java :

package test;

import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.policies.*;

public class TestCassandra {

 static final String USER = "admcass";
 static final String PWD = "admcass2016";
 static final String KEYSPACE = "testbal";

 public static void main(String[] args) {

     Cluster cluster = Cluster.builder()
         .addContactPoint("192.168.1.101")
         .withCredentials(USER, PWD)
         .withLoadBalancingPolicy(
         DCAwareRoundRobinPolicy.builder()
             .withLocalDc("dc1")
             .withUsedHostsPerRemoteDc(6)
             .allowRemoteDCsForLocalConsistencyLevel()
             .build())
         .build();
     Session session = cluster.connect(KEYSPACE);
     ResultSet rstmax = session.execute("select max(a) as amax from t1");
     long aMax = 0;
     for(Row row : rstmax) {
         aMax = row.getLong("amax");
     }
     session.execute("insert into t1(a) values(" + (aMax + 1) + ")");
     ResultSet rst = session.execute("select a from t1");
     for(Row row : rst) {
         System.out.println(row.getLong("a"));
     }
     cluster.close();
     System.exit(0);
 }
 

}

Il produit une sortie équivalente à celle-ci en ligne de commande :

cassandra@cassandraclt bin]$ java TestCassandra
[main] INFO com.datastax.driver.core.NettyUtil - Found Netty's native epoll transport in the classpath,
       using it
[main] INFO com.datastax.driver.core.policies.DCAwareRoundRobinPolicy -
       Using provided data-center name 'dc1' for DCAwareRoundRobinPolicy
[main] INFO com.datastax.driver.core.Cluster - New Cassandra host /192.168.1.102:9042 added
[main] INFO com.datastax.driver.core.Cluster - New Cassandra host /192.168.1.103:9042 added
[main] INFO com.datastax.driver.core.Cluster - New Cassandra host /192.168.1.104:9042 added
[main] INFO com.datastax.driver.core.Cluster - New Cassandra host /192.168.1.105:9042 added
[main] INFO com.datastax.driver.core.Cluster - New Cassandra host /192.168.1.106:9042 added
[main] INFO com.datastax.driver.core.Cluster - New Cassandra host /192.168.1.101:9042 added
2
3
7
4
8
5
6
1