Extremadura Ayuntamiento de Trujillo Establecer puentes, “unir está en nuestras manos” Computación y Ciencia (E-Ciencia) Ciencia, Industria y Sociedad América Latina ßà Extremadura ßàCIEMAT Fondo Europeo de Desarrollo Regional (FEDER) Obra Civil Infraestructura tecnológica Colaboraciones y proyectos de I+D
salas Vigilancia 24x7 Centro de Procesamiento de Datos > 1 PB almacenamiento (+ 60Gbps) > 140 TFlops (HPC, GPGPU, MPI, NUMA) 3.000 cores CPU; 125.000 cores GPU Conectividad Regional (RCTex) y nacional (RedIRIS-NOVA) 2x10 Gbps Referente nacional e internacional Nvidia Research Center (desde 2013) IBERGRID – España y Portugal SCALAC – América Latina y Caribe Iniciativas Grid y Cloud Europeas (EGI, EFC)
Investigación Ministerio de Economía y Competitividad Secretaría de Estado de I+D+i I+D+i en… Energía Medioambiente Tecnología Investigación básica Algunos datos… Recursos humanos: 1.326 personas Presupuesto (2013): 98,3M € Ingresos actividades I+D+i (2013): 44,21M € CIEMAT
User generated content Leer reviews Preguntar a amigos Ver tráiler Comprar entradas Publicar en RRSS Ver camino más rápido Comentar impresiones Subir fotos Escribir reseñas
Douglas, Laney. “3D Data Management: Controlling Data Volume, Velocity and Variety”. Gartner, 2001 2 Image from Alison Bolen’s blog. “Marketing optimization is a big data problem”
Latencia 1 min – 100 min 1 ms – 100 ms Concurrencia 1 - 10 1000 - 100,000 Tipo de acceso Lectura Lectura y escritura Consultas No selectivas Selectivas Ámbito de los datos Retrospectiva Operacional Usuario final Ingeniero de datos Cliente Tecnología MapReduce, MPP NoSQL
puede garantizar como mucho dos de las siguientes propiedades: Consistencia (Consistency) Disponibilidad (Availability) Tolerancia al particionado (Partition tolerance) 1 Eric Brewer “Towards Robust Distributed Systems” (2000). 2 Gilbert, S., & Lynch, N. (2002). “Brewer's conjecture and the feasibility of consistent, available, partition-tolerant web services”. ACM SIGACT News, 33(2), 51-59.
state El estado del sistema puede cambiar a lo largo del tiempo, incluso sin entradas Eventual consistency El sistema será consistente con el tiempo, siempre y cuando no reciba una entrada La implementación puede variar para cada base de datos NoSQL
y administración Recuperación automática de fallos, datos distribuidos, modelos de datos más simples. Costes reducidos Diseñadas para trabajar en clústeres de servidores Modelos de datos flexibles Los cambios de modelo son fácilmente implementados
source. Falta de soporte a nivel global Capacidad de consulta limitada Algunas consultas pueden implicar conocimientos de programación Administración Pocas herramientas de administración Expertise Encontrar a profesionales con experiencia es más complicado
rígido Consecuencias: Mayor latencia Aplicación lenta Agravado por replicación blogID Name 1 Bla bla 2 Ble ble tagID tag 33 tag1 34 tag2 blogID tagID 1 33 2 33 2 34
(open source) MongoDB viene del inglés “humongous” Sin esquema, no ACID, no JOINs, sin claves externas,… Almacena los datos en documentos BSON (Binary JSON) Diseñada para escalabilidad, rendimiento, alta disponibilidad
quisieron desarrollar un servicio online. Plataforma para el desarrollo y hosting de aplicaciones web auto-escalable (GAE o MA) “We felt like a lot of existing databases didn’t really have the ‘cloud computing’ principles you want them to have: elasticity, scalability, and … easy administration, but also ease of use for developers and operators,” Merriman said. “[MySQL] doesn’t have all those properties.”1 1 The Register, Cade Metz, “MongoDB daddy: My baby beats Google BigTable”, May 25, 2011.
JOINs NO soporta transacciones (estilo RDBMS) Soporte a índices secundarios Consultas con documentos Atomicidad a nivel de documento Replica set: replicación maestro-esclavo con recuperación automática de fallos Escalabilidad horizontal Escrita en C++: Portabilidad
con documentos sin necesidad de columnas predefinidas o tipos de datos (a diferencia de las bases de datos relacionales), por lo que el modelo de datos es extremadamente flexible1” 1 S.G. Edward and N. Sabharwal, Practical MongoDB, DOI 10.1007/978-1-4842-0647-8_1
la web Alternativa a XML Human y Machine readable Soporta los tipos básicos: Cadenas, números, booleanos, arrays,… Bueno para almacenar datos Almacena toda la información relacionada en una sola estructura 1 RFC 4627, RFC 5179 y ECMA-404
eficiente Ligero Fácil navegación Eficiente Permite a MongoDB procesar los objetos para construir índices y emparejar objetos partiendo de consultas, tanto para claves de primer nivel como embebidas
No es necesario un índice (consultas) Tamaño limitado Eliminación según FIFO (First in, first out) No se pueden borrar elementos Si actualizamos un documento con otro de mayor tamaño à Error Caso de uso Gestión de logs
en una colección? Esquema polimórfico: Los documentos de una colección son similares, pero no idénticos Casos de uso: Programación orientada a objetos Actualizaciones del esquema en el tiempo
64 bits Versión de 32 bits limitada a 2GB de datos Instalación: Linux : Ubuntu (https://goo.gl/0pJG5G), RedHat (https://goo.gl/U56FsT) Windows: https://goo.gl/0myHWp MacOS X: https://goo.gl/s7k7Zq Prerrequisitos: Directorio /data/db* creado y con permisos R/W * C:\data\db en Windows
formato de los datos y ejecuta operaciones de mantenimiento Por defecto Escucha en el puerto 27017 Utiliza el directorio /data/db (C:\data\db en Windows) Interfaz web en 28017 (http://localhost:28017) Problemas comunes: Si no tiene permisos de R/W a /data/db Si no puede usar el puerto 27017
comandos para… Desarrolladores: Lanzar consultas y ejecutar comandos Administradores: Gestionar la base de datos Al inicio se conecta a la base de datos: test Variable global db referencia a la bbdd en uso
datos a un fichero binario mongorestore: Permite importar el fichero de mongodump a una base de datos bsondump: Convierte contenido BSON en JSON o CSV mongoimport, mongoexport: permiten importar y exportar datos en una instancia JSON, CSV y TSV mongotop, mongostat, mongosniff: Proporcionan información de diagnóstico relacionada con la operación actual
Función [ß][à] Mover cursor izquierda/derecha [Ctrl] + [ß], [Ctrl] + [à] Mover cursor izquierda/derecha [][] Histórico de comandos [Home] o [Ctrl] + [a] Ir al comienzo de línea [End] o [Ctrl] + [e] Ir al final del línea [Ctrl] + [k] Borrado hasta el final de línea [Ctrl] + [l] Limpiar la pantalla
update: cambios a realizar options: número de documentos a actualizar, upsert,… Por defecto: Solo se actualiza uno y no se inserta si no existe db.products.update({ item : "card" }, { $set: { "qty" : 10 }}) db.products.update({ item : "card" }, { $inc: { "qty" : 1 }})
Elimina un campo de un documento $rename: Actualiza el nombre de un campo $push: Añade un nuevo elemento a un array $addToSet: Añade un nuevo elemento a un array (si no existe ya) $pull: Elimina los elementos de un array que cumplen una determinada condición $pop: Elimina el primer o último elemento de un array
base de datos “demo”. 2. Crear un documento vacío con el _id=1 en la colección “foo”. Mostrar el documento. 3. Añadir un campo “n” al documento creado anteriormente y asignarle un valor de 12. Mostrar el documento.
cuyo valor sea menor que 16. Ejecutarlo varias veces. Mostrar el documento. 5. Añadir un campo array llamado “tags” al documento. Añadir el elemento “a” a dicho campo. Mostrar el documento. 6. Añadir los elementos “b” y “c” al array “tags”, pero asegurándote que la ejecución repetida del comando solo los insertará una vez.
del 2 al 10. Usar un bucle for de JavaScript. 8. Añadir un campo “early” a todos los documentos con _id <= 5 y asignarle el valor true. Deberás actualizar varios registros a la vez. 9. Eliminar el array del documento con id=1 con findAndModify(). Devolver el documento modificado.
a null y los que no lo tienen db.animals.find({ "info.canFly": null }) $exists: Devuelve documentos que tengan ese campo db.animals.find({ "info.canFly": { $exists: true } })
que se quieren recuperar y un 0 los que no db.animals.find({ _id: 1 }, { _id: 1 }) Si no se especifica lo contrario, el _id siempre se devuelve db.animals.find({ _id: 1 }, { name: 1 }) No es posible mezclar campos a incluir y a excluir (excepto para el _id) // Ok db.animals.find({ _id: 1 }, { _id: 0, name: 1 }) // Error db.animals.find({ _id: 1 }, { _id: 0, name: 1, info: 0 })
con find Operaciones: size: Devuelve el número de elementos del cursor. hasNext: Devuelve true si hay más elementos. forEach: Aplica una función sobre los elementos del cursor. sort: Permite ordenar los resultados. Positivo ascendente y negativo descendente. limit: Limita el número de resultados devueltos. skip: Permite saltar los primeros resultados de una consulta. db.animals.find({}).sort({_id: -1}).limit(10).skip(3)
4. Encontrar todos los animales de color gris "grey". Devolver solo su nombre 5. Encontrar todos los animales que pueden volar 6. Encontrar todos los animales que no tienen el campo 'info.canFly’ 7. Encontrar todos los animales que tengan el campo "info.canFly" a null o que no lo tengan 8. Encontrar todos los documentos, ordenados por _id de manera descendente. Devolver el _id solo 9. Repetir la última consulta, pero esta vez devolver solo el segundo y tercer documento
con un solo parámetro representando cada documento. Obtener los nombres de todos los animales Almacenarlos en un array en el shell Ayuda: Los arrays en JavaScript tienen el método push() Por ejemplo: db.animals.find({}).forEach(function(r){ print(r._id)})
las operaciones de lectura que se usan con frecuencia Por defecto, cuando se crea una colección y se añaden documentos a ésta, se crea un índice sobre el campo _id Ejemplo: Insertar 1.000.000 de documentos en una colección con un bucle JavaScript for (i = 0; i < 1000000; i++) { db.testindx.insert({ "name": "user" + i, "age": Math.floor(Math.random() * 120) }) }
pasos llevado a cabo por MongoDB en la ejecución de una consulta Tipos de salida: queryPlanner: Por defecto. Contiene información sobre la selección del plan de ejecución de consultas. executionStats: Incluye información detallada del plan ganador. allPlansExecution: Presenta información parcial de la ejecución de todos los planes de ejecución evaluados.
toda la colección. IXSCAN: Se procesan las entradas de un índice. FETCH: Se recuperan documentos. SHARD_MERGE: Se fusionan resultados de los shards. Ejercicio: Averiguar el número de documentos examinados al ejecutar la consulta: db.testindx.find({ "name": "user100" }); Ayuda: Ejecutar explain a nivel de colección
El valor positivo o negativo indica el orden (1 ascendente y -1 descendente) Ejercicio: Crear el índice sobre el campo “name” y ejecutar la consulta anterior. Consultar los valores de stage, totalDocsExamined y executionTimeMillis
más campos Se deben considerar si cubre la mayoría de las consultas Orden recomendado: igualdad, orden y rango Ejercicio: Crear el índice para optimizar la consulta db.testindx.find({ "name": "user100", "age": { $gt: 25 } });
una base de datos Se crea automáticamente al crear una base de datos Colección reservada, solamente se puede manipular con: createIndex: Crea un índice sobre una colección dropIndexes: Borra todos los índices de una base de datos
índices de esa colección. dropIndex: Elimina un índice sobre una colección. reIndex: Reconstruye los índices de una colección. Consiste en borrar todos los índices y volverlos a crear.
una estructura de árbol B+, por lo que las consultas por rango se soportan automáticamente. La primera vez… MongoDB crea varios planes de ejecución para cada índice disponible y espera a que el más rápido termine. La segunda vez… Se utiliza el índice ganador de la primera hasta que un cierto número de actualizaciones se ejecutan sobre la colección
de la colección que poseen el campo sobre el que se creó el índice Ejemplo: Para el siguiente índice disperso db.users.createIndex({ "LastName": 1}, { sparse: true }) contendrá… { "FirstName": "John", "LastName": "Doe" } { "FirstName": "John", "LastName": null } pero no contendrá… { "FirstName": "John" }
la colección después del período especificado Índice geoespacial: permite encontrar documentos que estén “cerca” de una localización Índice geoHaystack: índice geoespacial optimizado para áreas pequeñas. Indicados para filtrar adicionalmente por otra dimensión Índice de texto: Permite búsquedas sobre texto.
índices por colección Las claves de los índices no pueden superar los 1024 bytes Un documento no puede ser indexado si los valores de su clave son más grandes que su tamaño El nombre de un índice no puede superar los 128 caracteres (inc. namespace) … 1 Enlace a la documentación de MongoDB: “Limitaciones de los índices”
de tareas en un clúster reduciendo el tiempo de cálculo. Pensado para procesamiento en batch. aggregate(): Permite el cálculo de agregados sin necesidad de utilizar MapReduce. Más rápido Pensado para procesamiento en tiempo real.
divide en subtareas que envía a los workers. Éstos pueden dividir en nuevas subtareas. Una vez completada se devuelven los resultados al máster. Reduce: El nodo máster combina las respuestas recibidas y produce la salida final
para presentarla en pantalla. Ejemplo: Blog Beneficios: Toda la información se obtiene en una sola búsqueda Atomicidad y aislamiento al escribir datos Desventajas: Menor flexibilidad en las consultas (Ejemplo: recuperar comentarios de un usuario del blog)
consulta de varias maneras o en relaciones *-to-many. Beneficios: Mejor rendimiento de lectura (respecto a documentos grandes embebidos) Mejor rendimiento en escritura (menos probabilidad de reubicar el documento) Desventajas: Atomicidad y aislamiento Recuperación de información relacionada
de TTL si los datos caducan. Considerar capped collections si solo se trabaja con los últimos documentos insertados. Índices: El uso de índices para consultas mejora el rendimiento de la aplicación. Para escrituras en masa, tiene un impacto negativo (hay que añadir las claves al índice). Sharding: El particionamiento de datos puede incrementar el rendimiento de la aplicación.
si la base de datos tiene más o menos colecciones. Tener varias colecciones para diferentes tipos de datos puede ser beneficioso en procesos batch. Hay que tener en cuenta: MongoDB añade un pequeño overhead (KBs) para cada colección. Al menos 8KB de espacio se necesitan para cada índice. Tamaño de los documentos: Las operaciones de escritura pueden provocar que la reubicación del documento, lo que penaliza en el rendimiento de la aplicación.
tamaño máximo de documento BSON (16 MB) Los ficheros se dividen en fragmentos de 255 KB (excepto el último) GridFS usa dos colecciones: files: Almacena los metadatos chunks: Almacena los fragmentos ¡Es necesario un driver de Mongo!
fichero Campos: _id: Identificador único del documento files_id: _id del documento padre (files) n: Número de secuencia del fragmento (comienza en 0) data: Contenido binario del fragmento
Identificador único del documento length: Longitud en bytes del documento chunkSize: Tamaño de cada fragmento (bytes) uploadDate: Fecha de subida del documento md5: Cadena con el hash MD5 Opcionales: filename, contentType, aliases, metadata,…
para la recuperación eficiente de los ficheros: chunks: Compuesto por file_id y n files: Compuesto por filename y uploadDate Si no existen, se pueden crear desde el shell: db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } ); db.fs.files.createIndex( { filename: 1, uploadDate: 1 } );
mayor a 16 MB (si es menor, usar BinData) En algunos casos, en sustitución de un sistema de ficheros: Si existe un límite de ficheros por directorio Si se desea mantener los ficheros automáticamente sincronizados y replicados Cuando se quiere acceder a ficheros sin cargarlos completamente en memoria No actualizar el fichero por completo (update) Mejor insertarlo como nuevo y usar el campo metadata
y fs.chunks Leer el fichero subido y mostrarlo por pantalla Ayuda: Instalación de PyMongo: pip install pymongo Ejemplos documentación PyMongo: http://api.mongodb.org/python/current/examples/gridfs.html