Tutorial de Tecnologias NoSQL
Tutorial de Tecnologias NoSQL
Tutorial de Tecnologias NoSQL
Julio de 2017
1
https://github.com/dsevilla/jisbd17-nosql
¿Qué veremos aquí?
¿Qué es NoSQL?
Desventajas de NoSQL
¿Qué veremos aquí? (II)
Tipos de BBDD NoSQL
▶ Key/Value
▶ Documentos
▶ Columnares (wide column)
▶ Grafos
Academia y NoSQL
NewSQL
¿Qué NO veremos aquí?
Tecnologías en profundidad
Por falta de tiempo
Cuestiones avanzadas
Replicación, seguridad, etc.
Pero antes, un inciso
db = client.presentations
jisbd17 = db.jisbd17 # colección jisbd17
Pero antes, un inciso (III)
▶ Datos para una diapositiva:
jisbd17.insert_one(
{’_id’: ’jisbd17-000’,
’title’: ’blah’,
’text’ : ’’,
’image’: None,
’references’:
[{’type’: ’web’,
’ref’: ’http://nosql-database.org’
},
{’type’ : ’book’,
’ref’: ’Sadalage, Fowler. NoSQL
Distilled, 2009’}
],
’xref’: [’jisbd17-010’, ’jisbd17-002’],
’notes’: ’blah blah’
})
Pero antes, un inciso (IV)
▶ ¡Las imágenes!
import os
import glob
files = glob.glob(’slides/slides-dir/*.png’)
for file in files:
img = load_img(file)
img_to_thumbnail(img)
slidename = os.path.basename(
os.path.splitext(file)[0])
jisbd17.update_one(
{’_id’: slidename},
{’$set’ : {’image’:
img_to_bytebuffer(img)}},
True)
Pero antes, un inciso (V)
¿Y el modelado de datos?
Pero antes, un inciso (VI)
Pero antes, un inciso (VII)
▶ OK, pensemos en relacional
▶ CREATE TABLE ...
▶ ¿Cuántas tablas?
▶ Claves ajenas, restricciones de integridad...
▶ Gap semántico:
▶ La tabla Reference no está contenida sino
enlazada (por clave ajena)
▶ O bien se crea la tabla Slide_Reference
▶ ID Artificial para referencias
▶ Se tiene que crear la tabla Slide_xref
▶ ¿xref? ¿references?
SELECT * FROM Slides s
JOIN References r ON ‘s._id‘ = r.slide_id
JOIN Slide_xref x ON ‘s._id‘ = x.slide_id
WHERE ‘s._id‘ = ’jisbd17-000’;
MongoDB
slide = jisbd17.find_one({’_id’: ’jisbd17-000’})
Introducción a NoSQL
Categorías de NoSQL
▶ Bases de datos Key-Value
▶ Bases de datos Documentales
▶ Bases de datos columnares
▶ Bases de datos de grafos
▶ Bases de datos de arrays
Evolución desde el modelo relacional
▶ El modelo relacional ⇒ predominante en
los últimos ~30 años
▶ Tiene sus raíces en el denominado business
data processing, procesamiento de
transacciones y batch
▶ Propuesto por Codd en los 70, de alto nivel
▶ Actualmente los sistemas SQL están muy
optimizados:
▶ el grado de implantación es mayoritario
▶ para el 99 % de los problemas (que caben en
un ordenador) es eficiente y adecuado
Adopción de NoSQL
Twitter cambiando a Cassandra por 2010
Cassandra desarrollada en Facebook en 2009
Adopción NoSQL. Ranking julio 2017
Fuente: http://db-engines.com/en/ranking/
Adopción NoSQL.Tendencia julio 2017
Fuente: http://db-engines.com/en/ranking/
Adopción NoSQL. Análisis
Análisis
▶ Dominan los grandes SGBDR
▶ El Open Source tiene una importancia
crucial (MySQL, MongoDB, etc.)
▶ Varias bases de datos NoSQL entre las 10
primeras. Muchas en las 20 primeras
▶ La distancia entre los grandes SGBDR y el
primer NoSQL (MongoDB) es de 5×
▶ Paradigmas más “atrevidos” como el de
grafos están entre los 20 primeros (Neo4j)
Cambio de perspectiva: Red
Cambio de perspectiva: Red
Almacenamiento distribuido
▶ Desde los 90’s: Clústers/NOC/COW:
procesamiento masivamente paralelo
SIN EMBARGO...
▶ Almacenamiento no distribuido
▶ Ahora los nodos ⇒ también
almacenamiento
▶ Minimizar el verdadero cuello de botella:
trasiego de información por la red
Cambio de perspectiva: Red
Procesamiento distribuido
▶ Necesidad de paralelización máxima
▶ Escalabilidad
▶ Explotación de la localidad de los datos:
▶ Datos producidos se utilizan en siguientes
iteraciones
▶ Datos recibidos directamente (clientes
simultáneos)
Cambio de perspectiva: Red
Procesamiento distribuido
▶ Vuelta al modelo funcional inherentemente
paralelo: (e.g. Map-Reduce)
▶ Almacenamiento distribuido: (e.g. HDFS)
▶ Coordinación distribuida: (e.g. Zookeeper)
Cambio de perspectiva: Red
Modelo de datos
▶ El modelo relacional limita a tablas con
valores primitivos y relaciones Primary
Key/Foreign Key
▶ Pero en programación se utilizan listas,
arrays, tipos de datos compuestos (gap
semántico)
▶ ACID es muy compleja y costosa en
ambientes distribuidos (quizá no
necesaria en algunas aplicaciones)
Cambio de perspectiva: Red
SCHEMALESS
▶ Flexibilidad: Posibilidad de almacenar
documentos con una estructura diferente
▶ Tratar información incompleta
▶ Evolucionar la base de datos/esquema
▶ Añadir nuevas características a las
aplicaciones
Schemaless (II)
schema-on-write ⇒ schema-on-read
SQL NoSQL
Los datos conforman Los datos leídos confor-
cuando se escriben man a un esquema im-
plícito
Tipado estricto (estáti- Duck-Typing (dinámico)
co)
Datos homogéneos Datos heterogéneos
Proceso analítico a tra- Use as read
vés de consultas
Schemaless (III)
▶ Ejemplo: Añadir el campo first_name a
partir del campo name
▶ Los nuevos objetos se crean con el nuevo
formato
▶ A la hora de leerlos, se puede hacer:
if (user && user.name && !user.first_name) {
// Docs anteriores a 2013 no tienen first_name
user.first_name = user.name.split(” ”)[0];
}
Schemaless (IV)
SQL
NoSQL
Polyglot
Persistence
Modelado de datos en NoSQL
posible
▶ Independiente de la tecnología subyacente
distribuido
▶ Optimización guiada por las consultas
Modelado de datos en NoSQL (II)
Con respecto al modelo de datos:
▶ Se mantienen los conceptos de entidad,
relación, cardinalidades, etc.
▶ El modelado relacional se centra en
especificar qué datos tenemos y
podemos ofrecer
▶ El modelo NoSQL se centra en optimizar
qué consultas vamos a servir
▶ Es “barato” duplicar (desnormalizar) los
datos si con ello se consigue mayor
eficiencia de acceso
Representación relacional de un CV
Kleppmann, 2016. Designing Data Intensive Applications
Representación de relaciones
Relaciones uno a muchos
duplicación (y a problemas de
sincronización)
▶ ⇒ Referencias (sobre el ID), similar a una
FK en el modelo relacional
▶ ⇒ al no haber JOINs la aplicación tiene que
hacer más de una petición a la BD
Muchos a muchos – referencia
Eficiencia raw
2
http://bonesmoses.org/2016/07/15/
pg-phriday-a-postgres-persepctive-on-mongodb/.
3
Datos disponibles en: https:
//github.com/dsevilla/bdge/tree/master/addendum.
Key-Value Stores y Documentales
Key-Value Stores y Documentales
{< key1, {val1, val3, ...} >, < key2, {val2, val4, ...} >, ...}
Framework de agregación:
https://docs.mongodb.com/manual/
reference/operator/aggregation/.
jisbd17.aggregate( [ {’$project’ : { ’Id’ : 1 }},
{’$limit’: 20} ])
Framework de agregación (II)
hbase_by_length = jisbd17.aggregate( [
{’$project’: {
’text’ : {’$ifNull’ : [’$text’, ’’]}
}},
{’$project’ : {
’id’ : {’$strLenBytes’: ’$text’},
’value’ : {’$literal’ : 1}
}},
{’$group’ : {
’_id’ : ’$id’,
’count’ : {’$sum’ : ’$value’}
}},
{’$sort’ : { ’_id’ : 1}}
])
Framework de agregación (III)
4
Chang, Fay; Dean, Jeffrey; Ghemawat, Sanjay; Hsieh, Wilson C;
Wallach, Deborah A; Burrows, Michael ‘Mike’; Chandra, Tushar; Fikes,
Andrew; Gruber, Robert E (2006), Bigtable: A Distributed Storage
System for Structured Data, (PDF), Google.
Introducción a HBase
forma distribuida
▶ HDFS permite acceso secuencial eficiente y
trabajos batch
▶ HBase implementa acceso random access
muy rápido
▶ Map/Reduce para realizar búsquedas
independientemente
▶ El diseño correcto de la clave es crítico
Introducción a HBase (IV)
HBase is a sparse,
distributed,
persistent,
multi-dimensional
sorted map (or Key/Value)
store
¿Cuándo usar HBase?
▶ Versión, estado:
hbase(main):002:0> version
1.1.3,
r72bc50f5fafeb105b2139e42bbee3d61ca724989
, Sat Jan 16 18:29:00 PST 2016
hbase(main):001:0> status
3 servers, 0 dead, 0.3333 average load
Hbase Shell (II)
Comandos básicos CRUD
▶ Creación de tablas, especificando las
column families iniciales:
hbase> create ’slides’, ’slide’, ’image’, ’
text’, ’xref’
0 row(s) in 1.3810 seconds
=> Hbase::Table - slides
▶ Obtener el documento:
hbase> get ’slides’, ’jisbd17-000’
COLUMN CELL
slide:notes timestamp=1500300013076, value=Notas iniciales
slide:title timestamp=1500299771997, value=Portada
2 row(s) in 0.1700 seconds
▶ O toda la tabla:
base> scan ’slides’
ROW COLUMN+CELL
jisbd17-000 column=slide:notes, timestamp=1500300013076, value=
Notas i
niciales
jisbd17-000 column=slide:title, timestamp=1500299771997, value=
Portada
1 row(s) in 0.0400 seconds
Opciones de creación de tablas
▶ ColumnPrefixFilter – Prefijo de
columna dado:
hbase> scan ’jisbd17’, {FILTER => ”ColumnPrefixFilter(’t’)”}
...
jisbd17-159 column=slide:title, timestamp=1500328162182, value=
jisbd17-160 column=slide:title, timestamp=1500328162182, value=
jisbd17-161 column=slide:title, timestamp=1500328162182, value=
jisbd17-162 column=slide:title, timestamp=1500328162182, value=
Filtros (III)
▶ MultipleColumnPrefixFilter – (lista)
▶ ColumnCountGetFilter – Retorna hasta
el número n de columnas dado
▶ PageFilter – Permite paginación de
resultados por clave de fila
Filtros (IV)
Y en happybase:
table.scan(row_start=’19’, row_stop=’20’,
columns=[’from’])
Bases de Datos de Grafos
CREATE
(NAmerica:Location {name:’North America’, type:
’continent’}),
(USA:Location {name:’United States’, type:’
country’ }),
(Idaho:Location {name:’Idaho’, type:’state’ }),
(Lucy:Person {name:’Lucy’ }),
(Idaho)-[:WITHIN]->(USA)-[:WITHIN]-> (NAmerica)
,
(Lucy) -[:BORN_IN]-> (Idaho)
Ejemplo de datos y consulta en
Neo4J (II)
Y de consulta:
MATCH
(person) -[:BORN_IN]-> () -[:WITHIN*0..]-> (us:
Location {name:’United States’}),
(person) -[:LIVES_IN]-> () -[:WITHIN*0..]-> (eu:
Location {name:’Europe’})
RETURN person.name
▶ Es sencilla y no es computacionalmente
muy compleja
▶ Como la relación de amistad no es
recíproca siempre, a veces hay que hacer
la búsqueda inversa:
Flexibilidad y eficiencia (IV)
SELECT p1.Person
FROM Person p1 JOIN PersonFriend
ON PersonFriend.PersonID = p1.ID
JOIN Person p2
ON PersonFriend.FriendID = p2.ID
WHERE p2.Person = ’Bob’
o incluso:
MATCH (nieto)-[:HIJO_DE]->()-[:HIJO_DE]->(
abuelo)
RETURN abuelo, nieto
https://github.com/catedrasaes-umu/
NoSQLDataEngineering
cátedrasaeslabs
www.catedrasaes.org
BBDD NoSQL sin esquema explícito
El esquema se encuentra implícito en los datos
{
”person_id”: ”123”,
”type”: ”Person”,
”lastName”: ”Rush”,
”firstName”: ”Christopher”,
”address”: ”C/Gran Via, 13, Madrid”
},
{
”person_id”: ”456”,
”type”: ”Person”,
”lastName”: ”England”, Base de datos
”firstName”: ”Wayne”,
”address”: { NoSQL
”street”: ”Av. Pinos, 24”,
”city”: ”Murcia” }
},
{
”person_id”: ”789”, ▶ Datos no uniformes
”type”: ”Person”,
”lastName”: ”Hoover”,
”firstName”: ”Quinton”,
”address”: ”Ronda Norte, 15, Murcia”,
▶ Existencia de
}
”age”: 35 distintas versiones
Proceso de inferencia NoSQLSchema
Vista general de la arquitectura MDE empleada
Base de Colección
Transformación
datos Map-reduce de objetos
de objetos
NoSQL JSON
Colección
de versiones
⇒Visualización
de esquemas
⇒Validación Generación Proceso de
Modelo
de datos de ingeniería
NoSQLSchema
⇒Asistencia herramientas inversa
a la
«conforma»
migración
Metamodelo
Herramientas NoSQLSchema
Metamodelo NoSQLSchema
Visualizaciones (i)
Visualizaciones (ii)
Referencias
2012.berlinbuzzwords.de/files/
slides/hbase-lgeorge-bbuzz12.pdf