segunda parte: homero - cassandra

Anuncio
Proyecto Final
HOMERO
Índice
PRIMERA PARTE: CASSANDRA ...........................................................................................................3
Breve descripción ............................................................................................................................. 3
Historia ............................................................................................................................................. 3
Modelo de Datos .............................................................................................................................. 3
Limitaciones de Cassandra ............................................................................................................... 7
Usuarios / Implementaciones (actuales y no actuales) ..................................................................... 7
Atributos de las ColumFamilies: ...................................................................................................... 8
Cómo Conectarse a la Base de Datos ............................................................................................. 10
Thrift: ............................................................................................................................................. 10
SEGUNDA PARTE: HOMERO .............................................................................................................. 11
¿Qué es un Framework? ................................................................................................................. 11
¿Por qué “Homero”? ...................................................................................................................... 11
Nuestra Propuesta: Framework Homero ........................................................................................ 11
Implementación JPA y Thrift: ............................................................................................... 11
TERCERA PARTE: CONCLUSIÓN .......................................................................................................12
Conclusión ...................................................................................................................................... 12
Bibliografía..................................................................................................................................... 12
PRIMERA PARTE: CASSANDRA
Breve descripción
Cassandra es un motor de base de datos open source. Actualmente es un proyecto desarrollado por la
Apache Software Foundation. Está desarrollado en lenguaje Java.
Para este Proyecto de Ingeniería usaremos la versión 0.6.6. de Cassandra.
En la mitología griega, Cassandra era hija de Hécuba y Príamo, reyes de Troya. Vaticinó la caída de
Troya, aunque nadie le creyó, ya que su don de profecía había sido maldito por el dios Apolo al no
corresponderle el amor.
Historia
Inicialmente, Cassandra es desarrollado por Facebook con la idea de potenciar las búsquedas en el
Inbox. En el mes de Julio, año 2008, se libera su código en Google Code.
En Marzo del 2009 se transforma en un proyecto de Apache, y el 17 de Febrero del corriente año, 2010,
se lo cataloga como un proyecto de alto nivel de Apache (Apache Software Foundation top-level
project).
Modelo de Datos
Se detallaran brevemente los distintos elementos que componen el Modelo de Datos de Cassandra, a
modo introductorio. Algunos de estos elemntos serán tratados más adelante con mayor profundidad, ya
que consideramos que requieren un nivel de análisis distinto, dado el propósito de este Proyecto.
Los conceptos básicos de este modelo de datos son:
Cluster: son los nodos en una instancia lógica de Cassandra. Cada cluster puede contener múltiples
keyspaces.
Keyspace: es el contenedor de ColumnFamilies, uno por aplicación.
ColumnFamilies: contiene múltiples columnas, cada una con nombre y valor (y timestamp), y son
referencias por filas de datos.
Column: es el menor tipo de dato, un arreglo nombre-valor
SuperColumns: arreglo de Columns.
En detalle, encontramos:
(http://www.javageneration.com/?p=70) (http://wiki.apache.org/cassandra/DataModel)
Column: Contiene un nombre, valor y timestamp. Todos estos datos son provistos por el
usuario. Es por ello que los relojes de los clientes deberían estar sincronizados, para evitar
conflictos. A los propósitos de esta documentación, el timestamp no será representado.
En resumen, es un par nombre-valor, la representación más pequeña de un dato en el modelo
Cassandra.
{ //Esto es una Column
name: “email”,
value: “[email protected]”
}
Ambos valores son binarios (técnicamente byte[]), y pueden tener prácticamente cualquier
longitud.
SuperColumn: Así como las Columns son arreglos nombre-valor, las SuperColumns también
son arreglos nombre-valor, con la particularidad de que el “valor” es un mapeo (o arreglo) de
columnas.
Vale aclarar que las SuperColumns no poseen timestamp.
{ //Esto es una SuperColumn
name: “usuarios”,
value: { //Con un arreglo de Columns
{ name: “nickname” , value: “JuanM” },
{ name: “nombre” , value: “Juan” },
{ name: “apellido” , value: “Martinez” }
}
}
Agrupamiento: existe una estructura para agrupar Columns y SuperColumns, llamada
ColumnFamily. Esta estructura puede ser del tipo Standard (simplemente la llamaremos
ColumnFamily) y del tipo Super (que la llamaremos SuperColumnFamily).
ColumnFamily: una ColumnFamily es una estructura que contiene una infinita cantidad de filas.
Para entender lo que son las “filas” en el modelo Cassandra, podemos pensar en ellas como las
“tablas” del clásico modelo relacional de base de datos (RDBMS).
Cada fila tiene una clave provista por el usuario, y las filas tienen un arreglo ordenado de
columnas.
Las ColumnFamilies son definidas en el archivo storage-conf.xml. Más adelante
profundizaremos sobre las ColumnFamilies, el ordenamiento de columnas y sus los atributos.
Alumnos = { //Esta es la ColumnFamily
123321: { //Esta es la clave para la fila detalla a continuación
//Un infinito arreglo de columnas...
legajo: “123321”,
nombre: “Martín”,
apellido: “Pérez”
}, //fin de la fila
135791: { //Otra clave para una nueva fila en la ColumnFamily...
//Un nuevo conjunto de columnas...
legajo: “135791”,
telefono: “47996543”,
nombre: “Juan”,
edad: “33”
} //fin de la fila
} //fin de la CF.
Es un punto a notar que no existe un arreglo pre-definido de las columnas que debe contener
una fila dentro de una ColumnFamily, ni en el nombre de las columnas, ni en la cantidad. Esto
es lo que da a Cassandra la propiedad de “schemaless” (sin esquema).
SuperColumnFamily: así cómo las ColumnFamilies contienen filas, y éstas contienen claves y
arreglos de columnas, las SuperColumnFamilies también contienen filas, y éstas contienen
claves. La diferencia es que las claves no tienen arreglos de columnas, sino que tienen arreglos
de SuperColumns.
(poner un ejemplo)
Keyspaces: contenedor de ColumnFamilies. En el modelo relacional de base de datos, sería una
colección lógica de base de datos.
Ordenamiento:
Ejemplos completos:
(HACER!!)
Limitaciones de Cassandra



El valor de una Column no puede ser mayor a 2GB.
Cassandra tiene dos niveles de indexación: clave y columna. Pero en Super ColumnFamilies
hay un tercer nivel de subcolumnas, y estas no son indexadas. Cualquier pedido por una
subcolumna des-serializa todas las subcolumnas de esa SuperColumn. Se invita a no crear un
modelo de datos que requiera una gran cantidad de subcolumnas. Los desarrolladores trabajan
para eliminar esta limitación (https://issues.apache.org/jira/browse/CASSANDRA-598).
(completar)
Usuarios / Implementaciones (actuales y no actuales)
Despegar (http://www.despegar.com): utiliza un pequeño cluster de Cassandra para almacenar
información de la sesión de usuario en el sistema de reserva de hoteles. Planean migrar a un cache
persistente el itinerario de vuelos.
Digg: su re-lanzamiento es “100% Cassandra”. Internamente implmentan múltiples clusters, y el más
grande es de 40 nodos.
Facebook: utiliza la versión de Cassandra que desarrollaron internamente, y posee el cluster de
implementación más grande que se conoce, con 150 nodos.
Twitter: se utiliza Cassandra en diversos ámbitos, por ejemplo, para guardar lugares de interés, para
hacer operaciones de data mining en toda la base de datos de usuarios, mostrar resultados de los
principales tweets y tendencias locales. Se implementa para analizar en tiempo real a gran escala. Por el
momento no se utiliza Cassandra para almacenar Tweets (que se almacenan en una base de datos
MySQL)
Otros: Imagini, Ooyala, Rackspace, reddit, SimpleGEO, Cisco, IBM
Atributos de las ColumFamilies
A continuación se detallarán los atributos de las ColumnFamilies, indicando si es requerido u opcional.
Trabajaremos con los nombres en inglés, para preservar la integridad de la documentación. El origen de
esta información, en su gran mayoría, es de la documentación provista por Apache, en el archivo
storage-conf.xml de la base de datos Cassandra, versión 0.6.6. El resto es complemento de distintas
fuentes de datos.
Estos atributos deben definirse para cada <Keysapce>, dentro del elemento <Keyspaces>.
Name: atributo requerido; indica el nombre de la ColumnFamily.
ColumnType: (completar)
CompareWith: atributo opcional; éste atributo indica a cassandra cómo ordenar las columnas,
necesario a la hora de hacer las “tajadas” (slicing). El valor por default es BytesTypes, una
comparación léxica directa de bytes en cada columna. Otras opciones son AsciiType,
UTF8Type, LexicalUUIDType, TimeUUIDType, y LongType. También se puede el nombre de
una clase que extienda de org.apache.cassandra.db.marshal.AbstractType.
CompareSubColumnsWith: atributo opcional; es el atributo que se define para comparar las
Columns en las SuperColumns.
BytesType: simple ordenamiento por bytes. No se efectua ninguna validación.
AsciiType: como BytesType, pero se valida que la entrada pueda ser “convertida”
(parsed) a US-ASCII.
UTF8Type: un String codificado como UTF8.
LongType: 64 bits
LexicalUUIDType: un UUID de 128 bits, comparación léxica por valor en bytes.
TimeUUIDType: un UUID version 11 de 128 bits.
RowsCached: atributo opcional; especifica el número de filas cuyos contenidos son guardados
en memoria (en cache). No debe usarse en ColumnFamilies con largas filas, o ColumnFamilies
con grandes ratios de escritura/lectura. Debe especificarse una fracción (un valor menor a 1), un
porcentaje (terminar el valor con el símbolo %), o un valor absoluto de filas a guardar en cache.
El valor por default es 0, es decir, RowChached no está activado por default.
RowCacheSavePeriodInSeconds: atributo opcional;
KeysCached: atributo opcional; the number of keys per sstable whose locations we keep in
memory in "mostly LRU" order. (JUST the key locations, NOT any column values.). Debe
especificarse una fracción (un valor menor a 1), un porcentaje (terminar el valor con el símbolo
%), o un valor absoluto de filas a guardar en cache. El valor por default es de 200000 claves.
KeyCacheSavePeriodInSeconds: atributo opcional;
1 Versión original de UUID, donde se concatena la version de UUID, con la dirección MAC de la computadora que genera
el UUID, y el número de 100-nanosegundos de intervalos desde la adopción del Calendario Gregoria en el Oeste.
Versión criticada, ya que revela la identidad de quien genera el UUID, y el momento.
Comment: atributo opcional; útil para añadir comentarios “humanamente” legibles, a fin de
proveer información sobre la ColumnFamily.
Ejemplo tomado del storage-conf.xml de Cassandra 0.6.6. :
<Keyspaces>
<Keyspace Name="Keyspace1">
<ColumnFamily Name="Standard1" CompareWith="BytesType"
KeysCached="1000"
RowsCached="100"
RowCacheSavePeriodInSeconds="0"
KeyCacheSavePeriodInSeconds="3600"/>
<ColumnFamily Name="Standard2"
CompareWith="UTF8Type"
KeysCached="100%"/>
<ColumnFamily Name="StandardByUUID1" CompareWith="TimeUUIDType" />
<ColumnFamily Name="Super1"
ColumnType="Super"
CompareWith="BytesType"
CompareSubcolumnsWith="BytesType" />
<ColumnFamily Name="Super2"
ColumnType="Super"
CompareWith="UTF8Type"
CompareSubcolumnsWith="UTF8Type"
RowsCached="10000"
KeysCached="50%"
Comment="A column family with supercolumns, whose column and subcolumn names are UTF8 strings"/>
</Keyspace>
</Keyspaces>
Nota: en el ejemplo se omiten algunos elementos de Keyspace, preservando sólo los pertinentes a ColumnFamily.
Cómo Conectarse a la Base de Datos
(HACER!!)
Thrift:
(Completar)
Thrift es un framework, originalmente desarrollo en Facebook, para desarrollo de servicios escalable de
lenguaje cruzado. Combina una pila de softeware (software stack) con un motor de generación de
código para construir servicios que funcionan eficientemente y sin problemas entre C++, Java, Python,
PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and Ocaml.
En el 2007 se realización la transición de Facebook a apache. Hoy en día es un proyecto open source en
el Apache Software Foundation Incubation (http://incubator.apache.org/thrift/).
El cliente API de Cassandra está construido encima de Thrift. El release de Thrift vinculado a
Cassandra 0.6.6. es el r917130 y se implementa como una librería JAR.
SEGUNDA PARTE: HOMERO
¿Qué es un Framework?
En el desarrollo de software, un framework es una abstracción en la que el código común provee
funcionalidades genéricas que pueden ser sobre-escritas (overridden) or especializadas de manera
selectiva por código provisto por el usuario que utiliza el framework.
Son un caso especial de librerías, donde la abstracción de código puede ser re-utilizada. Un framework
puede incluir soporte de programas, bibliotecas, y hasta un lenguaje interpretado.
La idea es que el framework provea un marco de desarrollo para quien construye y desarrolla
aplicaciones.
¿Por qué “Homero”?
Homero fue un poeta griego del Siglo VIII a.C., autor de las épicas La Ilíada y La Odisea. En su
biografía se confunden hechos reales con leyendas. Se duda sobre su lugar de nacimiento y sobre si era
ciego o no.
El mundo que rodea a Cassandra está marcado por personajes de origen mitológico griego, y decidimos
mantenernos en esa linea, eligiendo a un poeta épico, cuya historia se mezcla en realidad y fantasía.
Nuestra Propuesta: Framework Homero
Con este Proyecto Final de Ingeniería, proponemos construir una librería Java de mapeo ObjetoCassandra, proveyendo un framework para realizar las operaciones comunes como inserciones,
actualizaciones, búsquedas, y borrados contra la base de datos.
Siendo concientes de la existencia de otros frameworks Java-Cassandra, como por ejemplo Pelops2 o
Hector3, nos encontramos con que dichas librerías presentan ciertas limitaciones tales como, el no
haber logrado una buena abstracción, estar incompletos o no estar activos.
Implementación estilo JPA y Thrift
(completar)
Nuestra propuesta plantea la creación de una librería en el mismo espíritu de cualquier implementación
de la Java Persistance API4.
Es decir, se implementarán mecanismos para identificar las entidades y sus relaciones, y herramientas
para las operaciones contra la base de datos, tales como inserts, updates, deletes y mecanismos de
búsquedas.
Se utilizarán anotaciones para definir: Column, ColumnFamily, Key, TimeStamp y Value.
Se planea utilizar para las conexiones a Cassandra, los métodos ofrecidos por la librería Thrift.
2 http://code.google.com/p/pelops/
3 http://github.com/rantav/hector
4 http://www.oracle.com/technetwork/articles/javaee/jpa-137156.html http://en.wikipedia.org/wiki/Java_Persistence_API
TERCERA PARTE: CONCLUSIÓN
Conclusión
(hacer)
Bibliografía
http://en.wikipedia.org/wiki/Apache_Cassandra
http://wiki.apache.org/cassandra/
http://cassandra.apache.org/
http://uvedobles.com/base-de-datos-cassandra/
http://www.javageneration.com/?p=70
http://wiki.apache.org/cassandra/DataModel
ver: http://wiki.apache.org/cassandra/API
ver: http://sentidoweb.com/tag/cassandra
ver: http://www.riptano.com/docs/0.6.5/getting_started/index
Cassandra GUI: http://code.google.com/p/cassandra-gui/
http://theagileadmin.com/2010/06/22/velocity-2010-cassandra-workshop/
A browser for Cassandra using GTK: http://github.com/driftx/chiton
http://wiki.apache.org/cassandra/CassandraUsers
http://engineering.twitter.com/2010/07/cassandra-at-twitter-today.html
http://wiki.apache.org/cassandra/CassandraLimitations
http://incubator.apache.org/thrift/
http://en.wikipedia.org/wiki/Apache_Thrift
http://en.wikipedia.org/wiki/Software_framework
http://www.codebox.es/glosario
http://en.wikipedia.org/wiki/Universally_unique_identifier
http://es.wikipedia.org/wiki/Cassandra
http://es.wikipedia.org/wiki/Homero
Descargar