Cassandra PDF
Cassandra PDF
ndice
Introduccin a Cassandra Modelo de datos Instalacin y configuracin Cassandra command line interface CQL 3 (Cassandra Query Language) Clientes Cassandra: kundera Ejemplos Cluster multinodo
Apache Cassandra es un motor de bases de datos NoSQL, Open Source e implementado en Java. Fue originalmente creada por Facebook y donada a Apache como software libre en 2009. Es una de las base de datos NoSQL ms relevantes a nivel mundial: Netflix, eBay, Twitter, Urban Airship, Constant Contact, Reddit, Cisco, OpenX, Digg, CloudKick, Ooyala, Cassandra puede manejar varios terabytes de datos si lo necesita y puede, fcilmente, manejar millones de ficheros, incluso en un clster pequeo (Big Data). La informacin en las bases de datos relacionales, se almacenan en forma de filas, pero en Cassandra la informacin se almacena en columnas con pares key-value.
Caractersticas de Cassandra I
Introduccin
Esquema dinmico. El esquema que define la estructura de los datos puede cambiar en tiempo de ejecucin. No hay un nico punto de fallo. Los datos se replican automticamente a varios nodos. Perder un nodo no causa la baja del clster. Alta disponibilidad. Los datos ests disponibles la mayor parte del tiempo gracias a la redundancia que introduce la replicacin de datos. Particionamiento de los datos. La topologa de Cassandra es la de un anillo a travs del cual se distribuyen los datos para minimizar cuellos de botella en el acceso a los mismos. Escalabilidad horizontal. Hasta un alto nmero de mquinas la capacidad de cmputo aumenta linealmente con el nmero de mquinas. Capacidad para manejar cientos de gigabytes de datos.
Caractersticas de Cassandra II
Introduccin
Soporte profesional: varias empresas dan soporte y construyen productos sobre Cassandra: Datastax, Acunu,
Terminologa de Cassandra
Modelo
Column. Es la unidad mas bsica en el modelo de datos de Cassandra. Una column es un triplete de un key (un nombre) un value (un valor) y un timestamp. Los valores son todos suministrados por el cliente. El tipo de dato del key y el value son matrices de bytes de Java, el tipo de dato del timestamp es un long primitive. Las column son inmutables para evitar problemas de multithreading. Las column se organizan dentro de las columns families. Las column se ordenan por un tipo, que pueden ser uno de los siguientes:
AsciiType BytesType LongType TimeUUIDType UTF8Type
Terminologa de Cassandra
Modelo
SuperColumn. Es una column cuyos values son una o ms columns, que en este contexto se llamaran subcolumns. Las subcolumns estn ordenadas, y el numero de columnas que se puede definir es ilimitada. Las Super columns, a diferencias de las columns, no tienen un timestamp definido. Column Family. Es mas o menos anlogo a una tabla en un modelo relacional. Se trata de un contenedor para una coleccin ordenada de columns. Cada column family se almacena en un archivo separado Keyspace. Es el contenedor para las column family. Es mas o menos anlogo a una base de datos en un modelo relacional, usado en Cassandra para separar aplicaciones. Un keyspace es una coleccin ordenada de columns family. Clster. Conjunto de mquinas que dan soporte a Cassandra y son vistas por los clientes como una nica mquina.
7
Modelo de datos
Modelo
Modelo de datos
Modelo
Relaciones
Modelo
Entidad
People: { John Dow: { twitter: jdow, email: [email protected], bio: bla bla bla, ... }, }
One to one
People: { John Dow: { twitter: jdow, email: [email protected], bio: bla bla bla, marriedTo: Mary Kay, ... }, Mary Kay: { marriedTo: John Dow, ... }, ... }
People John Dow Twitter Jdow Email jdow@ bio Bla, bla
10
Relaciones
Modelo
One to many
Children: { John Dow: { 01/18/1976: John Dow Jr, 05/27/1982: Kate Dow }, ... } People: { John Dow Jr: { father: John Dow, ... }, ... }
Many to many
Friendship: { John Dow: { 10: Mark Seldon, 8: Julian Hendrix, ... }, Mark Seldon: { 9: John Dow, ... }, ... }
11
Descargar e instalar
Instalacin
Se obtiene la ltima versin de Apache Cassandra (actualmente 1.2.6) de http://cassandra.apache.org/download/ Se descarga al ordenador y se descomprime dentro de un directorio:
tar xvf apache-cassandra-1.2.6-bin.tar.gz
Cassandra-cli
Introduccin
Principales comandos:
help connect create/drop keyspace <keyspace_name> use <keyspace_name> create/drop column family <column_family> set get list update truncate show
13
Cassandra-cli
Introduccin CREATE KEYSPACE demo; USE demo; CREATE COLUMN FAMILY users WITH comparator = UTF8Type AND key_validation_class=UTF8Type AND column_metadata = [ {column_name: full_name, validation_class: UTF8Type} {column_name: email, validation_class: UTF8Type} {column_name: state, validation_class: UTF8Type} {column_name: gender, validation_class: UTF8Type} {column_name: birth_year, validation_class: LongType} ]; CREATE COLUMN FAMILY blog_entry WITH comparator = TimeUUIDType AND key_validation_class=UTF8Type AND default_validation_class = UTF8Type;
14
Cassandra-cli
Introduccin SET users['A']['full_name']='Robert Jones'; SET users['A']['email']='[email protected]'; SET users['A']['state']='TX'; SET users['A']['gender']='M'; SET users['A']['birth_year']='1975'; SET users['B']['full_name']='Cathy Smith'; SET users['B']['state']='CA'; SET users['B']['gender']='F'; SET users['B']['birth_year']='1969';
SET blog_entry['user'][timeuuid()] = 'I love my new shoes!'; LIST users; LIST blog_entry;
15
Cassandra-cli
Introduccin CREATE COLUMN FAMILY page_view_counts WITH default_validation_class=CounterColumnType AND key_validation_class=UTF8Type AND comparator=UTF8Type; INCR page_view_counts['www.datastax.com'][home] BY 1; LIST page_view_counts; GET users[utf8('A')][utf8('full_name')]; UPDATE COLUMN FAMILY users WITH comparator = UTF8Type AND column_metadata = [{column_name: birth_year, validation_class: LongType, index_type: KEYS } ]; GET users WHERE birth_year = 1969;
16
Cassandra-cli
Introduccin DEL users [B][gender]; GET users [B]; DEL users [B]; DROP COLUMN FAMILY users; DROP COLUMN FAMILY blog_entry; CREATE COLUMN FAMILY SuperExample with column_type = Super AND comparator= UTF8Type AND subcomparator = UTF8Type; SET SuperExample[utf8('Key1')]['A']['B']=utf8('Valor1'); SET SuperExample[utf8('Key1')]['A']['C']=utf8('Valor2'); DROP KEYSPACE demo;
17
CQL3
Introduccin
Cassandra Query Language <cassandra_path>/bin/cqlsh =>consola de lnea de comandos realizada en Python para interactuar de forma similar a los sistemas SQL.
CREATE KEYSPACE demo WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1} ; USE demo ; CREATE TABLE users(user_name varchar PRIMARY KEY , password varchar ,gender varchar , state varchar , birth_year bigint ); CREATE TABLE emp ( empID int, deptID int, first_name varchar, last_name varchar, PRIMARY KEY (empID, deptID)); INSERT INTO emp (empID, deptID, first_name, last_name) VALUES (104, 15, 'jane', 'smith'); INSERT INTO emp (empID, deptID, first_name, last_name) VALUES (105, 16, 'john', 'smith'); SELECT * FROM emp;
18
20
Map
ALTER TABLE users ADD todo map<timestamp, text>; INSERT INTO users (user_id, todo) VALUES ( 'frodo',{ '2013-9-22 12:01' : 'birthday wishes to Bilbo', '2013-10-1 18:00' : 'Check into Inn of Prancing Pony' }); SELECT user_id, todo FROM users WHERE user_id = 'frodo'; UPDATE users SET todo = { '2012-9-24' : 'enter mordor', '2012-10-2 12:00' : 'throw ring into mount doom' } WHERE user_id = 'frodo'; SELECT user_id, todo FROM users WHERE user_id = 'frodo'; DELETE todo['2012-9-24'] FROM users WHERE user_id = 'frodo'; SELECT user_id, todo FROM users WHERE user_id = 'frodo';
21
Index
DROP TABLE users; CREATE TABLE users( user_name varchar PRIMARY KEY , password varchar , gender varchar , state varchar , birth_year bigint ); INSERT INTO users (user_name, state , birth_year ) VALUES ( 'david','TX',1980); CREATE INDEX state_key ON users (state); CREATE INDEX birth_year_key ON users (birth_year); SELECT * FROM users WHERE state='TX' AND birth_year > 1968 ALLOW FILTERING;
22
Clientes/APIs
Cassandra tiene clientes para diferentes tecnologas Python Java Node.js Clojure .NET Ruby PHP Perl Go Haskell C++ En el caso de Java una alternativa interesante es Kundera, basada en el paradigma JPA 2.0.
23
Kundera: introduccin
Kundera es una libreria java con soporte para JPA 2.0 orientada a base de datos tanto de tipo relacional comom de tipo NoSQL. Web: https://github.com/impetus-opensource/Kundera/wiki Actualmente da soporte para las siguientes DB:
Bases de datos relacionales: MySQL, PostgreSQL, ... Apache Cassandra. Apache HBase MongoDB Oracle NoSQL Neo4j
24
Kundera: arquitectura
25
Kundera: configuracin
Configuracion: persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="cassandra_pu"> <provider>com.impetus.kundera.KunderaPersistence</provider> <properties> <property name="kundera.nodes" value="localhost" /> <property name="kundera.port" value="9160" /> <property name="kundera.keyspace" value="demo" /> <property name="kundera.dialect" value="cassandra" /> <property name="kundera.client.lookup.class" value="com.impetus.client.cassandra.pelops.PelopsClientFactory" /> <property name="kundera.cache.provider.class" value="com.impetus.kundera.cache.ehcache.EhCacheProvider" /> <property name="kundera.cache.config.resource" value="/ehcache-test.xml" /> </properties> </persistence-unit> </persistence>
26
Ejemplos Kundera
Ejemplos
27
Clster Multinodo
Multinodo
28
29