Installer Cassandra en 10 minutes

La présentation de Sylvain Lebresne sur Cassandra lors du dernier noSql User Group @Paris était excellente, encore bravo a Sylvain. Si bien qu'en bon geek, j'ai voulu essayer tout de suite, ce qui m'a encore valu une courte nuit de sommeil. Conclusion : si vous voulez faire tourner Cassandra en dix minutes, voila comment faire... Tout d'abord, le site sur Cassandra est très bien fait, et c'est là que j'ai pris mes informations. Si vous n'êtes pas aussi fainéants que moi, vous pouvez aller directement sur le site... sinon, continuons :

1. Installer Java 6

c'est obligatoire... Vérifiez que vous avez bien cette version en utilisant la ligne commande java -version, la réponse doit ressembler à :

java version "1.6.0_20" Java(TM) SE Runtime Environment (build 1.6.0_20-b02-279-10M3065) Java HotSpot(TM) 64-Bit Server VM (build 16.3-b01-279, mixed mode)

2. Télécharger la version de Cassandra

Pour débuter la version stable semble un bon choix et pour l'instant c'est la version 0.6.1, voici la page de téléchargement.

Dézippez le fichier dans un répertoire de votre choix que l'on nommera . Exemples :

  • Windows : C:\myapps\apache-cassandra-0.6.1
  • Linux/MacOS : /myapps/apache-cassandra-0.6.1

3. Configurer les répertoires de travail de Cassandra

Cassandra a besoin de 3 répertoires : commitlog, data et log. Les deux premiers peuvent se configurer dans le fichier /conf/storage-conf.xml, et le deuxième plus classique dans /conf/log4j.properties

Les répertoires configurés par défaut sont respectivement

**

  • /var/lib/cassandra/commitlog
  • /var/lib/cassandra/data
  • /var/log/cassandra/

**

Linux/MacOS

Chouette, vous pouvez continuer à être fainéants en créant directement ces répertoires (attention aux droits) puis en exécutant les commandes suivantes : **>sudo mkdir /var/lib/cassandra/ >sudo mkdir /var/lib/cassandra/commitlog >sudo mkdir /var/log/cassandra/ >sudo chown -R your_username /var/lib/cassandra/ /var/log/cassandra/**

Windows

Dommage, vous êtes obligés d'ouvrir les fichiers et de remplacer le chemins par ceux que vous aurez choisis. Modifier /conf/storage-conf.xml (ligne 193), pour obtenir par exemple :

<commitlogdirectory>C:/cassandra/commitlog</commitlogdirectory>
  <datafiledirectories>
      <datafiledirectory>C:/cassandra/data</datafiledirectory>
  </datafiledirectories>

et /conf/log4j.properties, (vers la ligne 35) pour obtenir : log4j.appender.R.File=c:/cassandra/log/system.log

N'oubliez pas de créer ces répertoires.

4. Démarrer Cassandra

En ligne de commande, sous le répertoire , exécutez la commande > bin/cassandra -f

Si tout ce passe bien, vous devriez voir une sortie comme cellle-ci : /apps/apache-cassandra-0.6.1$ bin/cassandra -f INFO 23:31:33,719 Auto DiskAccessMode determined to be mmap INFO 23:31:33,959 Replaying /var/lib/cassandra/commitlog/CommitLog-1274995850315.log INFO 23:31:33,989 Creating new commitlog segment /var/lib/cassandra/commitlog/CommitLog-1274995893989.log INFO 23:31:34,006 LocationInfo has reached its threshold; switching in a fresh Memtable at CommitLogContext(file='/var/lib/cassandra/commitlog/CommitLog-1274995893989.log', position=121) INFO 23:31:34,006 Enqueuing flush of Memtable(LocationInfo)@1723642430 INFO 23:31:34,007 Writing Memtable(LocationInfo)@1723642430 INFO 23:31:34,072 Completed flushing /var/lib/cassandra/data/system/LocationInfo-1-Data.db INFO 23:31:34,081 Log replay complete INFO 23:31:34,137 Saved Token found: 28676587864672638703880761535788705731 INFO 23:31:34,138 Saved ClusterName found: Test Cluster INFO 23:31:34,148 Starting up server gossip INFO 23:31:34,187 Binding thrift service to localhost/127.0.0.1:9160 INFO 23:31:34,190 Cassandra starting up...

4. Créer un projet Java

Dans un premier temps, nul besoin de Maven, les jars de Cassandra ne sont pas sur les repos centraux (en tout cas pas encore). Donc le plus simple est de créer son projet Java avec son éditeur préférer et d'ajouter les jars se trouvant dans le répertoire /lib. Vous pouvez prendre tous les jars présents ou être un peu plus sélectifs, les jars dont vous avez besoin étant :

  • libthrift-r917130.jar
  • apache-cassandra-0.6.1.jar
  • log4j-1.2.14.jar
  • slf4j-api-1.5.8.jar
  • slf4j-log4j12-1.5.8.jar

5. Créer une classe Java

Note : Cassandra Utilise Thrift, donc vous pouvez utiliser un grand nombre de langages, l'exemple suivant est tiré du wiki Cassandra.

Créons une classe Main qui écrit puis lit une valeur dans Cassandra:

import java.io.UnsupportedEncodingException;
import java.util.Date;

import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.ColumnPath;
import org.apache.cassandra.thrift.ConsistencyLevel;
import org.apache.cassandra.thrift.InvalidRequestException;
import org.apache.cassandra.thrift.NotFoundException;
import org.apache.cassandra.thrift.TimedOutException;
import org.apache.cassandra.thrift.UnavailableException;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
public class Main {

public static final String UTF8 = "UTF8";

     public static void main(String[] args) throws UnsupportedEncodingException,
                     InvalidRequestException, UnavailableException, TimedOutException,
                     TException, NotFoundException {
             TTransport tr = new TSocket("localhost", 9160);
             TProtocol proto = new TBinaryProtocol(tr);
             Cassandra.Client client = new Cassandra.Client(proto);
             tr.open();

             String keyspace = "Keyspace1";
             String columnFamily = "Standard1";
             String keyUserID = "user_1";

             // insert data
             long timestamp = System.currentTimeMillis();

             ColumnPath colPathName = new ColumnPath(columnFamily);
             colPathName.setColumn("name".getBytes(UTF8));

             client.insert(keyspace, keyUserID, colPathName, "Joe lind"
                             .getBytes(UTF8), timestamp, ConsistencyLevel.ONE);

             ColumnPath colPathAge = new ColumnPath(columnFamily);
             colPathAge.setColumn("age".getBytes(UTF8));

             client.insert(keyspace, keyUserID, colPathAge, "24".getBytes(UTF8),
                             timestamp, ConsistencyLevel.ONE);

             // read single column
             System.out.println("single column:");
             Column col = client.get(keyspace, keyUserID, colPathName,
                             ConsistencyLevel.ONE).getColumn();

             System.out.println("column name: " + new String(col.name, UTF8));
             System.out.println("column name: " + new String(col.value, UTF8));
             System.out.println("column timestamp: " + new Date(col.timestamp));

             tr.close();
     }

}

En lançant le programme on doit voir dans la console, quelque chose comme : single column: column name: name column name: Joe lind column timestamp: Fri May 28 01:41:14 CEST 2010

Conclusion

Bravo !! Vous avez installé Cassandra et écrit des première requêtes en Java, vous pouvez maintenant jouer un peu avec... puis passer aux choses un peu plus sérieuses :

  • configurer ses ColumnFamily
  • configurer un cluster
  • mettre son commitlog sur un disque séparé
  • ...

Pour ça je vous invite à aller sur le site officiel Cassandra.

A bientôt