Download - Gorm for cassandra
❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example
❏ Groovy + Cassandra
APACHE CASSANDRAEN
8 PASOS
Intro
❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example
❏ Groovy + Cassandra
● Sistema NoSQL, distribuído y open source
● Objetivo: Big Data○ Escalabilidad y Disponibilidad
● Topología en Anillo○ Masterless ○ Clustering Column
● INSERT Y DELETE○ INSERT = UPDATE (casi)
● CQL (Cassandra Query Language)
Row oriented or column oriented?
❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example
❏ Groovy + Cassandra
● rows oriented○ Row id, Columnas diferentes
apple -> colour weight price variety
"red" 100 40 "Cox"
orange -> colour weight price origin
"orange" 120 50 "Spain"
● column oriented○ Column id, 1 fila y millones de columnas
temperature -> 2012-09-01 2012-09-02 2012-09-03 ...
40 41 39 ...
● CASSANDRA = rows contain columns!!○ Idénticas columnas○ Acceso fila + columna
CAP Theorem
❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example
❏ Groovy + Cassandra
¿Aquí?
● PRIMARY KEY○ Clave primaria○ Simple o compuesta
● PARTITION KEY○ Distribuye los datos por los nodos○ primary key simple = partition key○ primary key compuesta = 1er atributo es la partition key
● CLUSTERING COLUMN○ Define cómo se ordenan los datos en el nodo○ son los siguientes atributos de una primary key compuesta
Distribución de los datos en el anillo
❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example
❏ Groovy + Cassandra
Replication factor = 1
❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example
❏ Groovy + Cassandra
Replication factor = multi
❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example
❏ Groovy + Cassandra
Consistency Level
❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example
❏ Groovy + Cassandra
● N = Determina el número n de réplicas que tienen que validar una lectura
○ N = QUORUM = mayoría simple
Un poquito más complejo...y eficaz
❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example
❏ Groovy + Cassandra
● Realmente usa virtual nodes
¡No muerde!
❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example
❏ Groovy + Cassandra
● CREATE TABLECREATE TABLE users (
user_name varchar PRIMARY KEY,
password varchar,
gender varchar,
birth_year bigint
);
● SELECTSELECT * FROM users
WHERE gender = 'male' LIMIT 50000;
● UPDATEUPDATE users SET password = '123456' WHERE user_name = 'rafbermudez'
❏ Apache Cassandra
❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra
CASSANDRA Y GROOVY
● Astyanax Cassandra Java Client (Netflix)
● Datastax Cassandra Java driver
● GORM 5 for Cassandra○ Basado en últimos drivers de Datastax○ Soporte para:
■ Grails 2, Grails 3, SpringBoot■ dynamic finders, criteria and named queries■ Cassandra schema creation■ Marshalling from Cassandra to Groovy/Java types and back again■ ...
Posibilidades
❏ Apache Cassandra
❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra
● GORM for Hibernate○ Soporta Hibernate 3,4 y 5○ Reescrito basándose en Traits
● GORM for Neo4j○ Neo4j 2.3.x○ Mapea “trivialmente” modelos de dominio a grafos
● MongoDB○ Reescrito basándose en MongoDB 3.x driver○ Mejora en la conversión: documento <-> objeto
● GORM 5 for Cassandra
GORM 5
❏ Apache Cassandra
❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra
● Domain Class○ Crea un UUID autoincremental internamente
class Person { String firstName String lastName}
new Person(firstName: "Fred", lastName: "Flintstone").save()
● Cassandra e Hibernateclass Person {
UUID id String firstName String lastName
static mapping = { id generator:’uuid2’ }
}static mapWith = "cassandra"
Clases de dominio
❏ Apache Cassandra
❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra
class Person { String firstName String lastName
}
● Caso 1: 72% de Juanes en Españadef people = Person.findAllByFirstName("Juan")
def people = Person.findAllByFirstName("Juan", [allowFiltering:true])
def people = Person.findAllByFirstName("Juan", [allowFiltering:true, fetchSize: 200])
● Caso 2: Muy pocos Wallys
def wallys = Person.
findAllByFirstNameAndAgeLessThanEquals('Wally', [allowFiltering:true])
def wallys = Person.
findAllByFirstNameAndAgeLessThanEquals('Wally', [allowFiltering:true, max:5])
Crea un índice
Consultas
❏ Apache Cassandra
❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra
● FetchSize y AllowFiltering
● No existe offset
● También provee una low-level APIdef cassandraTemplate
String personCQL = "SELECT firstName FROM person"List personList = cassandraTemplate.select(personCQL, Person.class)
Consultas
❏ Apache Cassandra
❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra