Subido por urid sadak lugo aguilar

Estudio y mejora del rendimiento del backend MOLLA SIRVENT RAFAEL ALEJANDRO

Anuncio
 Estudio y Mejora del
Rendimiento del
Backend
Grado en Ingeniería Informática
Trabajo
Fin de Grado
Autor:
Rafael Alejandro Mollá Sirvent
Tutor/es:
Virgilio Gilart Iglesias
Junio 2016
Agradecimientos A Gemalto Alicante por la confianza depositada y por darme la oportunidad de realizar
este trabajo de investigación que me ha hecho crecer como informático y como persona.
En especial al Equipo NxServer por haberme hecho sentir uno más.
A Andrea.
“Los datos pueden revelar secretos
a quienes tengan la humildad, el deseo
y las herramientas para escuchar”
Mayer y Cukier
Índice 1. Justificación y Objetivos ........................................................................................................... 2 2. Introducción ............................................................................................................................. 3 2.1. Big Data ............................................................................................................................. 3 2.2. Gemalto ............................................................................................................................. 3 2.3. Objetivo ............................................................................................................................. 4 3. Fase de Ámbito del Problema .................................................................................................. 6 3.1. Arquitectura Actual del Backend ....................................................................................... 6 3.2. Arquitectura Lambda ......................................................................................................... 7 4. Fase de Formación y Conocimientos Previos ........................................................................... 9 4.1. Vagrant .............................................................................................................................. 9 4.2. Capa de Ingestión ............................................................................................................ 10 ¿Qué son las colas de mensajes? ....................................................................................... 10 4.2.1. RabbitMQ ................................................................................................................. 11 4.2.2. Kafka ......................................................................................................................... 13 4.3. Capa de Procesado .......................................................................................................... 15 4.3.1. Storm ........................................................................................................................ 15 4.3.2. Spark Streaming ....................................................................................................... 16 4.4. Capa de Persistencia ........................................................................................................ 19 ¿Qué es NoSQL? ................................................................................................................. 19 4.4.1. MongoDB .................................................................................................................. 19 4.4.2. Cassandra ................................................................................................................. 22 5. Desarrollo del Prototipo ......................................................................................................... 26 5.1. Elección de las Tecnologías ............................................................................................. 26 5.2. Creación de los Servidores con Vagrant .......................................................................... 27 5.2.1. RabbitMQ ................................................................................................................. 27 5.2.2. Apache Storm ........................................................................................................... 30 5.2.3. Cassandra ................................................................................................................. 34 5.3. Aplicación ........................................................................................................................ 40 5.4. Pruebas ............................................................................................................................ 50 6. Limitaciones y Propuestas ...................................................................................................... 56 7. Bibliografía ............................................................................................................................. 57 1 1. Justificación y Objetivos El presente documento constituye un Trabajo Final de Grado (TFG) que describe el
desarrollo de un prototipo funcional del futuro backend de la empresa líder en seguridad
digital, Gemalto.
La principal motivación para llevar a cabo este proyecto de investigación radica en poder
conocer de primera mano una de las ramas de la informática que más interés genera
actualmente, el Big Data, así como el gran reto que supone trabajar en una empresa de
talla mundial y llevar a cabo un estudio de notable complejidad que contribuirá de forma
significativa a mejorar el funcionamiento de dicha empresa.
De este modo, este TFG se encuentra asociado a la labor desempeñada durante el
desarrollo de las asignaturas Prácticas Externas I y Prácticas Externas II en la delegación
de Gemalto en Alicante.
Los objetivos generales del proyecto se encuentran en consonancia con los establecidos
en la guía docente, entre los que destacan:
• Capacidad para definir, evaluar y seleccionar plataformas hardware y software
para el desarrollo y la ejecución de sistemas, servicios y aplicaciones informáticas.
• Capacidad para concebir y desarrollar sistemas o arquitecturas informáticas
centralizadas o distribuidas integrando hardware, software y redes de acuerdo con
los conocimientos adquiridos.
• Capacidad para resolver problemas con iniciativa, toma de decisiones, autonomía
y creatividad. Capacidad para saber comunicar y transmitir los conocimientos,
habilidades y destrezas de la profesión de Ingeniero/a Técnico en Informática.
El objetivo principal de este trabajo es el desarrollo de un prototipo funcional del futuro
backend de la empresa, siguiendo el patrón de la “Arquitectura Lambda”. Este prototipo
sirve como prueba de concepto para la implantación del nuevo backend.
2 2. Introducción 2.1. Big Data El término Big Data hace referencia a la técnica de tratamiento de ingentes cantidades de
datos las cuales son imposibles de tratar con los métodos y herramientas de análisis de
datos habituales.
Esta nueva técnica surge debido al aumento del tráfico de datos en internet procedentes
de páginas web, aplicaciones de imagen y vídeo, redes sociales, dispositivos móviles,
apps, sensores, internet de las cosas, etc. capaces de generar, según IBM, más de 2.5
quintillones de bytes al día, hasta el punto de que el 90% de los datos del mundo han sido
creados durante los últimos dos años.
Muchas empresas basan sus casos de negocio en las siguientes ventajas que se pueden
derivar del Big Data (IBM, 2012):
• Decisiones más inteligentes – Aprovechar nuevas fuentes de datos para mejorar
la calidad de la toma de decisiones.
• Decisiones más rápidas – Permitir una captura y análisis de datos en tiempo más
real para respaldar la toma de decisiones en el “punto de impacto”, por ejemplo
cuando un cliente está navegando por su sitio web o al teléfono con un
representante del servicio de atención al cliente.
• Decisiones que marquen la diferencia – Centrar las iniciativas de Big Data en
ámbitos que proporcionen una verdadera diferenciación.
2.2. Gemalto Gemalto es líder mundial en seguridad digital.
La compañía fue creada en junio de 2006 por la fusión de las compañías de Axalto y
Gemplus International.
Permite a empresas y gobiernos de todo el mundo ofrecer servicios digitales confiables y
convenientes a miles de millones de personas.
Su gran experiencia abarca todo el proceso de creación de soluciones de seguridad digital
para los clientes de otras empresas y sus clientes. Desarrollan aplicaciones de software y
sistemas operativos seguros que incorporan en muchos tipos de dispositivos, como las
3 tarjetas UICC o SIM, las tarjetas bancarias, los tokens, los pasaportes electrónicos y las
tarjetas de identificación electrónicas.
Gemalto N.V. es una sociedad que cotiza en bolsa, constituida en los Países Bajos. Tiene
sus oficinas centrales en Ámsterdam y cuenta con filiales y empresas del grupo en todo
el mundo.
Ingresó en 2015 3.100 millones de euros, cuenta un sitio operativo en 49 países de todo
el mundo y 14.000 empleados de 117 nacionalidades distintas.
La función principal de la oficina de Alicante es medir la calidad de experiencia (QoE) y
la calidad de servicio (QoS) de usuarios de compañías telefónicas. Para ello se recolectan
datos de los dispositivos móviles a través de aplicaciones móviles y aplicaciones
instaladas en tarjetas SIM. Los datos llegan al backend, donde se les extrae información.
Esta información obtenida se muestra a través de una aplicación web a las compañías
telefónicas que tengan contratado el servicio.
2.3. Objetivo El objetivo de este trabajo es la investigación y el desarrollo de un prototipo de
Arquitectura Lambda que sirva como primera fase para la implantación de un nuevo
backend en Gemalto. El motivo de este cambio radica en que actualmente se emplea una
solución Big Data hecha a medida, lo cual es costoso de mantener y de mejorar. La
principal idea es migrar a un backend compuesto por tecnologías modernas y estándar
con el que se pueda sacar más provecho al producto con un menor coste en hardware y
en recursos humanos.
Objetivos específicos:
• Analizar la arquitectura actual.
• Analizar las tecnologías propuestas por la empresa según la Arquitectura Lambda.
• Crear máquinas virtuales para cada una de las tecnologías analizadas.
• Seleccionar las tecnologías más adecuadas para el prototipo.
• Desarrollar el prototipo.
4 Para la consecución de los objetivos establecidos, se ha dividido el trabajo en varias fases,
las cuales se describen a continuación:
Fase de Ámbito del Problema
En esta primera fase se analiza la arquitectura actual del backend, atendiendo
especialmente las limitaciones que la empresa encuentra en ella, para poder así delimitar
las necesidades de la misma y determinar las características de la nueva arquitectura.
Además se realizará un análisis exhaustivo de la nueva arquitectura elegida.
Fase de Formación y Conocimientos Previos
Una vez determinada la nueva estructura, se procederá a realizar una fundamentación
teórica de la herramienta Vagrant, que será empleada para la creación de máquinas
virtuales. Además, también se llevará a cabo el estudio de las tecnologías propuestas por
la empresa que formarán las diferentes capas del prototipo del nuevo backend.
Desarrollo del Prototipo
Tras concluir la fase de formación, se dispondrá de los datos necesarios para poder
realizar la selección de las tecnologías que formarán el prototipo. Por último, se procederá
a explicar cómo se ha llevado a cabo dicho prototipo, entrando en detalle en cada una de
las partes que lo componen.
5 3. Fase de Ámbito del Problema En esta fase se llevará a cabo el estudio de la arquitectura actual del backend de la
empresa, con el objetivo de fundamentar las necesidades de ésta para poder realizar una
adecuada elección de la nueva arquitectura a emplear.
Así pues, el sistema actual del que hace uso Gemalto es altamente personalizado, lo que
supone realizar tareas de mantenimiento de forma continua que no tendrían lugar si se
trabajara con tecnologías estándar. Además, la empresa debe ser capaz de soportar un
aumento significativo del número de clientes respecto al actual, por lo que necesita una
estructura que le aporte la capacidad de atender a un mayor número de peticiones.
Igualmente se pretende que esta nueva arquitectura permita el desarrollo de nuevos
productos, que a día de hoy serían imposibles de crear.
Por tanto, la necesidad es la creación de un sistema que fundamentalmente cumpla las
siguientes premisas:
• Alta disponibilidad
• Escalabilidad
• Fácil mantenimiento
3.1. Arquitectura Actual del Backend El backend actual de Gemalto es una solución Big Data personalizada y hecha a medida,
la cual es difícil de mejorar y mantener.
Los componentes principales de esta arquitectura son:
Base de datos Company/Project: se trata de una base de datos MySQL multi-tenant
en la que se almacenan los datos de las compañías que tienen contratado el servicio.
El hecho de ser multi-tenant hace que parezca que exista una aplicación para cada
cliente pero en realidad es la misma.
Base de datos Shard: se trata de una base de datos MySQL en la que se guardan
todos los datos que envían los dispositivos móviles en bruto.
Base de datos Summary: se trata de una base de datos multidimensional (cubos
OLAP) la cual se utiliza para hacer reportes que son utilizados en el frontend.
6 Memcached: como sistema de caché.
Mule ESB: es un framework de mensajería Enterprise Service Bus que se utiliza
como endpoint para los terminales que envían datos y como intermediario entre el
backend y el frontend.
A parte de los problemas que acarrea ser una solución Big Data personalizada existe el
problema del gran número de escrituras por parte de los dispositivos móviles que tiene
que soportar este servicio, este sería el mayor cuello de botella del sistema actual.
3.2. Arquitectura Lambda La Arquitectura Lambda es un modelo de procesado de datos diseñado por Nathan Marz
para soportar enormes cantidades de datos.
Los objetivos de este modelo es construir un sistema con las siguientes características:
• Tolerante a fallos, tanto a fallos de hardware como a errores humanos.
• Alto rendimiento
• Escalabilidad horizontal, con lo que añadiendo más máquinas se conseguiría una
mayor capacidad de procesado.
• Extensibilidad de manera que al sistema se le pueda añadir nuevas características.
Ilustración 1 – Esquema Arquitectura Lambda 7 Este modelo lo forman principalmente tres componentes o capas (layers):
Capa Batch: es la parte encargada de pre-procesar las vistas Batch. Esta capa
almacena todo el "Dataset Maestro" y le aplica las vistas Batch accediendo a datos de
manera aleatoria.
Capa de Servicio: proporciona acceso a datos a través de una selección aleatoria de
las vistas Batch. Esta capa ofrece: robustez y tolerancia a fallos, escalabilidad,
extensibilidad, queries Ad-hoc y mantenimiento mínimo.
Capa de Velocidad: Los datos de entrada se van almacenando de manera incremental
en el dataset, esto quiere decir que según se vaya recibiendo, leyendo y procesando,
se irá escribiendo. La lectura y escritura de datos se realiza de manera aleatoria. La
idea es que cuando se necesite acceder a datos, se realice tanto a través de la capa de
Servicio como a través de la capa de Velocidad.
Para hacer el prototipo de la prueba de concepto, en Gemalto se decidió simplificar la
Arquitectura Lambda en tres capas:
Capa de Ingestión: se encarga de recibir y mantener los mensajes que envía la
aplicación hasta ser consumidos por la Capa de Procesado. Se estudiarán las
tecnologías: RabbitMQ y Apache Kafka.
Capa de Procesado: se encarga de obtener los mensajes de la capa de ingestión,
procesarlos y almacenarlos en la Capa de Persistencia. Se estudiarán las tecnologías:
Apache Storm y Apache Spark Streaming.
Capa de Persistencia: se encarga de almacenar los datos que se escriben desde la
Capa de Procesado y de servirlos cuando le sean requeridos. Se estudiarán las
tecnologías: MongoDB y Cassandra.
Ilustración 2 – Esquema de la simplificación de la Arquitectura Lambda que se va a utilizar. 8 4. Fase de Formación y Conocimientos Previos En esta fase se explicarán las herramientas y servicios (separados por las capas de la
Arquitectura Lamba) que han requerido formación así como los conocimientos que se
han ido adquiriendo a lo largo de la elaboración de este trabajo. Gracias a este estudio
previo y al conocimiento que se ha extraído de él, se ha podido decidir con qué tecnologías
desarrollar finalmente el prototipo de la nueva arquitectura de backend.
4.1. Vagrant Vagrant es una herramienta diseñada para crear y aprovisionar máquinas virtuales de
manera automática a partir de ficheros de configuración. De este modo, permite compartir
entornos de desarrollo completos simplemente distribuyendo los ficheros de
configuración.
Comenzó a desarrollarse en 2010 por Mitchell Hashimoto como un proyecto secundario.
Este proyecto secundario adquirió relevancia tras convertirse en el año 2012 en la empresa
HashiCorp, consolidando así el interés y el éxito de esta herramienta entre la comunidad
de desarrolladores.
Se trata de una herramienta con licencia Open Source disponible para Windows, Mac OS
X y GNU/Linux. Originalmente fue desarrollada para trabajar sobre Oracle VirtualBox y
sistemas de aprovisionamiento como Chef, Salt y Puppet. A partir de la versión 1.1,
Vagrant es capaz de trabajar sobre múltiples proveedores como VMware, DigitalOcean
o Amazon EC2.
Gracias a esta herramienta, se ha podido desplegar y destruir los servidores necesarios
para la realización de este trabajo con un simple comando.
La configuración más básica cuenta con un único fichero llamado “Vagrantfile”, el cual
se genera una única vez durante el proceso de creación de una nueva máquina ejecutando
el comando: vagrant init.
Una vez creado el Vagrantfile podemos comenzar a personalizar la máquina en relación
al tipo de máquina que queramos desplegar.
Las máquinas virtuales creadas mediante Vagrant utilizan la imagen de un sistema
operativo o de otra máquina ya generada, a la que llaman box. A partir de esta imagen se
crea la nueva máquina virtual.
9 Existen multitud de “cajas” disponibles con los sistemas operativos más utilizados.
Además, existe la posibilidad de crear tus propias imágenes una vez tengas finalizado el
aprovisionamiento de la máquina. Gracias a esto se puede crear, por ejemplo, una imagen
base con todas las herramientas genéricas de desarrollo y a partir de esta, instalar las
herramientas específicas para cada componente de un equipo de desarrollo.
Dentro del Vagrantfile indicaremos el tipo de “caja” que queremos utilizar y añadiremos
todas las configuraciones de la máquina: nombre del equipo, número de procesadores,
cantidad de memoria RAM, configuraciones de red…etc.
El siguiente paso será crear un script con los comandos necesarios para aprovisionar la
máquina, al cual llamaremos desde el propio Vagrantfile.
Para iniciar la nueva máquina simplemente ejecutamos el comando vagrant up dentro
de la carpeta donde se encuentre el archivo Vagranfile. Al ejecutar este comando, se
desplegará la máquina ejecutando todos los comandos y configuraciones que hayamos
definido.
Una vez creada podremos trabajar con ella mediante SSH o si instalamos una interfaz
gráfica, como si de una máquina virtual corriente se tratara. Las máquinas que hayamos
creado podemos gestionarlas desde la aplicación de VirtualBox o con los comandos que
ofrece Vagrant: vagrant suspend para ponerla en reposo, vagrant halt para
apagarla y vagrant destroy para eliminarla.
4.2. Capa de Ingestión ¿Qué son las colas de mensajes?
Básicamente son un intermediario entre clientes y servidores o, dicho de otro modo,
publicadores y consumidores.
Si recordamos los conceptos elementales de la programación de pilas y colas veremos
que es un concepto sencillo donde los emisores producen mensajes y para que estos
lleguen a su destinatario deben ser entregados a un intercambiador que los colocará en la
cola del respectivo destinatario, finalmente el destinatario puede ir progresivamente
desencolando y procesando los mensajes.
10 Ventajas que ofrecen:
• Redundancia
• Naturaleza asíncrona
• Garantía de entrega y orden
• Disponibilidad
• Elasticidad
• Desacoplamiento
• Escalabilidad
4.2.1. RabbitMQ
RabbitMQ es un servicio de colas de mensajes Open Source liberado bajo la licencia
Mozilla Public License. Este software fue desarrollado inicialmente por Rabbit
Technologies Ltd. la cual fue comprada en 2010 por la división SpringSource de
VMware. Debido a la unión de empresas, desde mayo de 2013 el responsable del servicio
es Pivotal Software.
Está escrito en Erlang, un lenguaje funcional con reputación para sistemas distribuidos,
con alta disponibilidad y tolerantes a fallos. Utiliza el framework Open Telecom Platform
(OTP) para construir sus capacidades de ejecución distribuida y conmutación ante errores.
Está disponible para Windows, Mac OS X, GNU/Linux y plataformas en la nube como
Amazon Web Services. Además, existe un API cliente para los lenguajes más relevantes:
Python, Java, Ruby, PHP, C#, Javascript, Go, Elixir y Objective-C.
Este software proporciona las ventajas de las colas de mensajes además de otras: (Wiesel,
Codehero, 2014)
• Soporta múltiples protocolos, muchas soluciones solo manejan uno solo como
AMQP.
• Dispone de librerías en casi todos los lenguajes de programación.
• Rastreo de mal comportamiento en las colas.
11 • Clusterización de varios servidores de colas para evitar que el sistema de
encolamiento falle.
• Múltiples tipos de enrutamiento, incluso puedes crear tu propia ruta.
• Soporta plugins para extender su comportamiento.
• Amigable interfaz gráfica.
A continuación se describirán los conceptos más importantes de RabbitMQ:
Producer: Aplicación que envía mensajes. RabbitMQ soporta la mayoría de los
lenguajes de programación más populares.
Consumer: Aplicación que recibe mensajes.
Queue: Buffer que almacena mensajes.
Message: Información que se envía desde el Producer al Consumer a través de
RabbitMQ.
Channel: Es una conexión virtual dentro de una conexión. Cuando se publican o
consumen mensajes se hace a través de un “canal”.
Exchange: Recibe mensajes de productores y los publica en colas dependiendo del
tipo de “intercambiador” que sea.
Binding: Es un enlace entre un intercambiador y una cola de mensajes
Routing key: Es una clave que el intercambiador utiliza para decidir cómo redirigir
los mensajes a las colas. Es como la dirección de destino del mensajes.
En Rabbit los mensajes no son publicados directamente a la cola de mensajes sino que el
productor envía el mensaje a un “exchange” (intercambiador). El intercambiador es el
responsable de dirigir los mensajes a las diferentes colas.
Existen cuatro tipos de intercambiadores:
Direct: dirige el mensaje a una cola basándose en el “routing key”. El mensaje es
llevado a las colas cuyo “binding key” coincide exactamente con el routing key del
mensaje.
Fanout: dirige los mensajes a todas las colas con a las que esté ligado.
12 Topic: dirige los mensajes a una o más colas de mensajes basándose en la
coincidencia entre el routing key del mensajes y el patrón usado para enlazar una cola
a un intercambiador.
Headers: utiliza los atributos de la cabecera del mensajes para redireccionar los
mensajes a las colas correspondientes.
4.2.2. Kafka
Apache Kafka es un sistema de mensajería publicación/suscripción distribuida de alto
rendimiento. Fue desarrollado inicialmente por LinkedIn y actualmente por Apache
Software Foundation. Está escrito en Scala y se distribuye bajo licencia Apache License
2.0.
El diseño de este sistema responde a las siguientes características, señaladas por Luis
Miguel García (2012)
• Rápido: un solo Broker puede trabajar con cientos de megabytes de lecturas y
escrituras por segundo desde miles de clientes.
• Escalable: está diseñado para permitir que un único cluster funcione como el eje
central de datos, el cual puede ser ampliado sin tiempo de inactividad.
• Mensajería persistente a estructuras de disco O1. Esto suministra un rendimiento
persistente en el tiempo, incluso cuando se produce el almacenamiento de varios
TB de mensajes.
• Alto rendimiento: Kafka tiene la capacidad de tolerar cientos de miles de mensajes
por segundo, incluso mediante un hardware sencillo.
• Soporte para la participación de mensajes. Esto se produce mediante los
servidores de Kafka y el consumo distribuido en un cluster de máquinas
consumidoras, manteniendo la ordenación por partición.
• Soporte para la carga de datos en paralelo en Handoop. Kafka procura agrupar el
procesamiento online y offline, suministrando un mecanismo para la carga
paralela en Hadoop, así como la capacidad de partición en tiempo real del
consumo en un cluster.
13 Los componentes principales de este sistema son:
Topic: son las categorías en las que se clasifican los mensajes enviados a Kafka.
Producer: son los clientes conectados a Kafka que se encargan de publicar los
mensajes, que pueden ser difundidos en uno o varios topics.
Consumer: clientes conectados a Kafka subscritos a uno o varios topics responsables
de consumir los mensajes.
Broker: consiste en cada uno de los nodos que forman el cluster.
El protocolo de comunicación empleado por este sistema de mensajería es de tipo
agnóstico que va sobre el protocolo HTTP. Este hecho permite la institución e
implementación de nuevos clientes procedentes de cualquier lenguaje de programación,
evadiendo, de esta forma, las limitaciones de las interfaces y las APIs de JMS.
Kafka mantiene cada topic en un log particionado. Cada partición consiste en una
secuencia de mensajes inalterable, de forma que los mensajes son añadidos a una de las
particiones según su orden de llegada, y se les asigna un número secuencial, llamado
offset, que identifica de forma única a cada mensaje dentro de su partición.
Los mensajes permanecen en las particiones durante un periodo de tiempo establecido a
nivel de cluster. Después de este periodo los mensajes son eliminados con el objetivo de
liberar espacio.
Así pues, el hecho de repartir un topic en un log de diversas particiones, ofrece la
posibilidad de escalar de forma horizontal, creando, si fuese necesario más particiones en
el resto de nodos.
Otra de las características de Kafka radica es su tolerancia a fallos, ya que replica cada
partición del log un número configurable de servidores dentro del cluster. La caída de uno
de estos nodos no influye al servicio. Uno de los nodos ejerce de maestro, atendiendo
todas las lecturas y escrituras de la partición, mientras que los demás trabajan como
esclavos, los cuales replican el contenido del maestro ejerciendo de consumidores.
14 4.3. Capa de Procesado 4.3.1. Storm
Apache Storm es un sistema que tiene como función la recuperación de streams de datos
en tiempo real. Se trata de una herramienta de código abierto que recoge datos de forma
distribuida y en alta disponibilidad. Además es tolerante a fallos, es decir, ofrece la
posibilidad de reproducir los datos que no han sido procesados de forma correcta la
primera ocasión.
En lo referente a su funcionamiento, Storm puede funcionar en dos modos diferentes:
local y cluster. El modo local resulta valioso para probar el código desarrollado en la
topología de Storm ya que corre en una única JVM, lo que nos permitirá ajustar los
parámetros de configuración. El modo cluster por su parte, distribuye y ejecuta el código
en las diferentes máquinas y se considera “modo producción”.
Storm está compuesto principalmente por dos elementos fundamentales, el Spout y el
Bolt.
El Spout es el componente se encarga de recoger el tráfico de datos de entrada en el
sistema. En el caso de este trabajo, se usaría para recolectar los mensajes de RabbitMQ o
Apache Kafka.
El Bolt, es el encargado de procesar las tuplas que emite el Spout. Esta acción la realiza
en función de la orden marcada por el algoritmo programado sobre los streams de entrada
y puede difundirlos a otro Bolt. Así pues, Juan Alonso Ramos (2014) recomienda que
cada Bolt realice una sola tarea, de forma que si se necesita realizar diversos cálculos o
transformaciones sobre los datos, lo ideal es crear diferentes Bolt. Este hecho mejorará la
eficiencia y la escalabilidad.
Por otro lado, uno de los aspectos más favorables de Storm es que permite crear una
topología en la que añadir instancias de Bolts y Spouts para que escale el sistema
desplegándola en el cluster de Storm. Este será el encargado de particionar los datos de
entrada y redistribuirlos en los diversos componentes.
15 En cuanto a su arquitectura, ésta no es demasiado compleja y se compone de los siguientes
elementos:
• El nodo “Master”. Es el encargado de ejecutar el demonio conocido como
Nimbus. Este es el responsable de distribuir el código a través del cluster. Además
también lleva a cabo la distribución y monitorización de las tareas en las diferentes
máquinas del cluster.
• Los nodos “supervisor”. Son los responsables de ejecutar el demonio Supervisor
encargado de recoger y procesar las tareas asignadas en la máquina donde corre.
Estos nodos ejecutan una porción de la topología para que así se puedan distribuir
las tareas a lo largo del cluster. Si uno de estos nodos falla en demonio Nimbus lo
detectaría y redirigiría el trabajo a otro supervisor.
• Zookeeper: Este es necesario ya que se ocupa de la coordinación entre el Nimbus
y los Supervisor. Además es el responsable de mantener el estado.
De este modo, Apache Storm es un sistema idóneo para procesar grandes cantidades de
información a tiempo real, ya que es capaz de procesar hasta un millón de tuplas por nodo
por segundo. (Ramos, 2014)
4.3.2. Spark Streaming
Apache Spark es una plataforma de computación en paralelo de código abierto para
análisis y procesos avanzados. Puede ejecutarse y operarse con cuatro tipos de lenguajes
distintos: Scala, que es la sintaxis en la que está escrita la plataforma; Python; R y también
Java. La finalidad de Spark es proporcionar ventajas en el procesamiento de datos de
entrada constante.
Las características esenciales de Spark son:
• Rapidez en procesos de cálculo en memoria y disco.
• Ejecución en plataformas de todo tipo. Puede ejecutarse en Hadoop, Apache
Mesos, en EC2, en modo clúster independiente o en la nube.
• Mayor flexibilidad en la definición de transformaciones.
• Menor uso de almacenamiento en disco.
• Aprovechamiento de la memoria.
16 • Tolerancia a fallos.
Uno de los componentes clave de Spark es Spark Streaming que le otorga la capacidad
de procesamiento continuo.
Este elemento tiene la capacidad de ingerir datos de una amplia gama de fuentes como
pueden ser:
• Flujos derivados de Apache Kafka, Amazon Kinesis y prácticamente cualquier
sistemas de colas de mensajes.
• De dispositivos conectados mediante sockets TCP.
• Datos almacenados en sistemas de archivos HDFS o Amazon S3.
La funcionalidad de Spark Streaming es, a gran escala, apropiarse de un flujo de datos
continuo y transformarlo en un flujo discreto, que recibe el nombre de DStream y está
constituido por paquetes de datos. Internamente ocurre que Spark Streaming almacena y
procesa estos datos como un secuencia de RDDs (Resilient Distributed Data), que
constituye una colección de datos particionada, distribuida e inmutable. De esta forma,
Spark Streaming es el encargado de crear y coordinar los RDDS.
Por otro lado, Spark Streaming cuenta con diferentes modelos de procesamiento que se
corresponden con las semánticas utilizadas. Este factor asegura que los resultados
generados sean fiables, aunque se presenten fallos en los nodos. Los datos pueden ser
procesados según los siguientes modelos:
Exactly once (Exactamente una vez): cada elemento se procesa una única vez. A
pesar de que este modelo parece ser a simple vista el más lógico, no siempre es así,
ya que es el más intensivo en recursos y puede originar problemas de desempeño
debido a todo el procesamiento adicional que se requiere para garantizar que los datos
ni se pierdan ni se dupliquen.
At most once (Máximo una vez): los elementos pueden ser procesados como mucho
una vez o pueden no ser procesados. Debido a que lo más relevante es mantener la
continuidad de flujo, bajo el punto de vista del procesamiento, este es el modelo más
fácil de construir, aunque ello suponga asumir la pérdida ocasional de datos.
17 At least once (Mínimo una vez): cada elemento debe ser procesado al menos una
vez. Este modelo incrementa la posibilidad de que no se pierdan datos pero también
la generación de duplicados. Este modelo proporciona la seguridad de que no se
perderán datos en caso de que exista alguna falla en uno de los nodos, ya que cuando
éste se recupere el procesará todos los datos para asegurar que no se extravíe ninguno.
No todos los tipos de fuentes soportan todos los modelos, sino que es necesario comprobar
qué semántica se soportan en cada una.
Es necesario matizar que Spark Streaming no opera en base a flujos continuos sino a
micro-batches, como ya se ha señalado con anterioridad. Estos micro-batches tienen un
tiempo de intervalo entre ellos que suele ser menos de cinco segundos. Este factor puede
tener consecuencias que es necesario contemplar. Así pues, reducir el intervalo de
desempeño a menos de un segundo ofrece un desempeño casi de tiempo real, pero ello
supone un alto coste en recursos de procesamiento. Otra desventaja del esquema de
micro-batches es que los datos no se reciben en el orden exacto en el que se generan,
factor que puede ser relevante o no en función de la aplicación específica.
18 4.4. Capa de Persistencia ¿Qué es NoSQL?
“NoSQL es un término que describe las bases de datos no relacionales de alto desempeño.
Las bases de datos NoSQL utilizan varios modelos de datos, incluidos los de documentos,
gráficos, claves-valores y columnas. Las bases de datos NoSQL son famosas por la
facilidad de desarrollo, el desempeño escalable, la alta disponibilidad y la resiliencia.”
(Amazon Web Services, 2016)
4.4.1. MongoDB
MongoDB surge de la necesidad de utilizar bases de datos capaces de almacenar y
procesar datos no estructurados de la forma más rápida posible, ya que una gran cantidad
de los datos que se generan actualmente poseen esta característica (Roy, 2014).
Permite el almacenamiento de todo tipo de datos: estructurados, semi-estructurados y no
estructurados. Además, posee un gran rendimiento en cuanto a escalabilidad y procesado
de la información, pudiendo procesar la enorme cantidad de información que se produce
en la actualidad. MongoDB se adapta a las necesidades actuales de las aplicaciones, lo
que permite a las empresas ser más ágiles y crecer de forma más rápida, desarrollar
nuevos tipos de aplicaciones, y productos, mejorar la experiencia del cliente y minimizar
el tiempo desarrollo del producto.
Está dirigido a documentos, de modo que en un solo documento puede almacenar toda la
información relevante, incluyendo todo tipo de datos. Esto se lleva a cabo sin que sea
necesario emplear un esquema preestablecido. Asimismo, permite adaptar el esquema de
la base de datos a las exigencias de la aplicación de forma rápida, cosa que permite reducir
el tiempo y coste de la puesta en producción de la misma. Ello se debe a que permite
cambiar el esquema desde el código de la aplicación, sin tener que emplear labores de
administración de la base de datos.
Según Roy (2014) las principales características de MongoDB son:
• Posee alta disponibilidad y escalabilidad.
• Autobalanceado de carga a través de los distintos shards.
• Replicación nativa: sincronización de datos entre servidores.
19 • Seguridad: autentificación, autorización.
• Gestión avanzada de usuarios.
• Automatic failover: elección automática de un nuevo primario cuando este se ha
caído.
• Tiene la habilidad de actualizarse sin interrumpir el servicio.
• Carece de cuellos de botella que tienen lugar en las bases de datos relacionales al
procesar elevadas cantidades de información.
• Utiliza objetos JSON para guardar y transmitir la información. Esto supone una
ventaja, ya que JSON es el estándar web actual.
• Posibilita la realización de consultas y cálculos espaciales.
• Permite utilizar MapReduce para el procesado de la información a través de
funciones JavaScrip que se ejecutan en los servidores.
• Puede almacenar y ejecutar funciones JavaScrip en el servidor.
• Posee una interfaz gráfica web que permite monitorizar lo que ocurre en las bases
de datos y máquinas.
Además MongoDB ofrece las siguientes prestaciones:
Consultas ad hoc: permite la búsqueda por campos, consultas de rangos y
expresiones regulares. Las consultas pueden devolver un campo específico del
documento pero también puede ser una función JavaScrip definida por el propio
usuario.
Indexación: cualquier campo puede ser indexado y también se pueden realizar
índices secundarios.
Replicación: El tipo de replicación empleado es primario-secundario. El primario
puede ejecutar comandos de lectura y escritura mientras que los secundarios replican
los datos de éste y únicamente pueden ser empleados para lectura o copia de
seguridad, pero no para escritura. Además, estos tienen la capacidad de poder elegir
un nuevo primario en caso de que el existente deje de funcionar.
20 Balanceo de carga: Permite escalar de forma horizontal, empleando el concepto de
shard. Los datos son fraccionados en rangos y distribuidos a través de múltiples shard.
Cada shard puede ser una réplica set. También puede ejecutarse en varios servidores,
balanceando la carga y/o replicando los datos para poder mantener el sistema
funcionando en caso de que exista un fallo de hardware.
Almacenamiento de archivos: La replicación y el balanceo de carga permiten que
MongoDB pueda ser empleado como un sistema de archivos. Esta función recibe el
nombre de GridFS y es una implementación en los drivers, lo cuales exponen
funciones y métodos para la manipulación de archivos y contenidos a los
desarrolladores.
Agregación: MongoDB proporciona un framework de agregación construido como
un pipeline en el que los datos van pasando a través de diferentes etapas en las que
estos datos son modificados, agregados, filtrados y formateados hasta obtener los
resultados deseados. Este proceso puede hacer uso de índices en el caso que existan y
se produce en memoria. También proporciona una función MapReduce que puede ser
empleada para el procesamiento por lotes de datos y operaciones de agregación.
Ejecución de JavaScript del lado del servidor: A través de JavaScrip MongoDB
puede realizar consultas haciendo que estas sean envidas directamente a la base de
datos para ser ejecutadas.
Fragmentación: Es la forma en la que se hace escalable una base de datos. Los
fragmentos se forman por replica set, de forma que si se crean tres fragmentos, cada
uno de ellos tiene un replica set con tres servidores, se dispondría de un total de nueve
servidores. Las consultas se llevaran a cabo de forma distribuida mediante un módulo
enrutador conocido como “mongos” que mantendrá un pequeño pull de conexiones a
los distintos host. Para conocer en que fragmento se debe consultar para poder
recuperar datos de una colección ordenada, se utilizan rangos y shard_key, de tal
forma que se trocea la colección en rangos y se les asigna un id (shard_key), que
puede ser una parte del documento, y se distribuye en los fragmentos (replica set). Así
pues, cuando se consulte la colección se debe proporcionar el shard_key.
MongoDB presenta también una serie de limitaciones y problemas. De este modo, no
implementa las propiedades ACID, lo que supone que no se garantice la durabilidad, la
integridad, la consistencia y el aislamiento requeridos necesariamente en las
21 transacciones. Sobre este punto, se encuentran problemas en la consistencia, ya que las
lecturas estrictamente consistentes ven versiones obsoletas de documentos y pueden
devolver datos incorrectos de lecturas que no deberían haberse producido. Además tienen
lugar bloqueos a nivel de documento ante cada operación de escritura y sólo se podrán
realizar operaciones de escritura concurrentes entre diferentes documentos.
En cuanto a las escrituras, estas no son durables ni verificables ya que MongoDB retorna
cuando todavía no se ha escrito información en el espacio de almacenamiento perdurable,
lo que puede ocasionar pérdidas de información. Por último cabe decir que presenta
problemas de rendimiento cuando el volumen de datos supera los 100 GB.
4.4.2. Cassandra
Cassandra es una base de datos NoSQL distribuida y fundamentada en un prototipo de
almacenamiento de “clave-valor”. Está desarrollada en Java y es de código abierto.
Introduce conceptos atractivos como el soporte para múltiple centros de datos o la
comunicación peer-to-peer entre sus nodos.
El origen de esta base de datos se encuentra en Facebook y fue diseñado para potenciar
la funcionalidad de búsqueda en la bandeja de entrada. En 2008 se liberó como proyecto
open source y más tarde, en febrero de 2010 se convirtió en un proyecto top-level de la
fundación Apache.
Además, Cassandra ofrece soporte para múltiples centros de datos, a través de la
replicación asíncrona sin que sea necesaria la presencia de un servidor maestro,
permitiendo operaciones de baja latencia para todos los clientes.
En cuanto a su rendimiento en 2012, estudios llevados a cabo por la Universidad de
Toronto afirman que: "En términos de escalabilidad, hay un claro ganador a través de
nuestros experimentos. Cassandra logra el más alto rendimiento para el número máximo
de nodos en todos los experimentos", aunque "esto tiene como precio una alta latencia de
escritura y lectura".
En cuanto al modelado de datos, se combinan propiedades de una base de datos clavevalor y una orientada a columnas. Las claves primarias de cada fila tienen un primer
componente que es la clave de partición. Dentro de una partición, las filas son agrupadas
por las columnas restantes de la clave. El resto de columnas pueden ser indexadas por
22 separado de la clave primaria. Las características específicas del modelado de datos son
(Requena, 2010):
• Presencia de una tabla de datos por cada instancia de Cassandra.
• Cada familia de columnas puede contenes columnas o supercolumnas. Estas
últimas son el resultado de agrupar n-columnas.
• Cada columna contiene elementos de la forma “clave-valor-tiempo”, donde el
valor de tiempo es declarado por el usuario.
• Cada fila de una tabla puede tomar valores en columnas distintas de una familia
de columnas de otra fila, es decir si se dispone de una familia de 5 columnas (A,
B, C, D, E), la fila R1 puede tener valores en A y B mientras que la fila R2 puede
tenerlos en A, C, D y E.
• Las tablas pueden crearse, eliminarse y modificar en tiempo de ejecución sin que
ello suponga el bloqueo de actualizaciones y consultas.
• No soporta joins o subqueries, sino que hace énfasis en la desnormalización a
través de características como colecciones.
El lenguaje empleado en Cassandra es conocido como CQL (Cassandra Query
Language), cuya sintaxis es semejante a SPL, pero presentando menos funcionalidades,
cosa que permite que el inicio en el uso de ésta sea mucho más fácil.
Cassandra implementa una arquitectura peer-to-peer, lo que suprime los puntos de fallo
único y no sigue patrones maestro-esclavo. De esta forma, cualquiera de los nodos puede
tomar el rol de coordinador de una consulta. El driver será el encargado de decidir qué
nodo hace la función de coordinador.
Los datos son repartidos a lo largo del cluster en base a un token único calculado para
cada fila por una función hash. Los nodos se reparten equitativamente en el rango tokens
que va de -263 a 263, esto define el nodo primario. Internamente Cassandra replicará los
datos entre los nodos con la política que le sea definida. Además soporta el concepto de
datacenter para agrupar nodos lógicamente y tener los datos más próximos al usuario.
23 Así pues, las características fundamentales de la arquitectura de Cassandra son:
• Nodos con igual tratamiento.
• No existe una jerarquía.
• Las filas se distribuyen a través de una función hash.
• Cada nodo es responsable de un rango de claves hash.
• La arquitectura puede ser vista como un anillo.
• Los datos se almacenan en tablas.
• Las tablas se guardan en keyspaces.
• Son estructuras flexibles
• Los nuevos nodos se añaden gracias a nodos semilla.
• Emplea un protocolo de comunicación Gossip.
• Los nodos intercambian información (P2P).
• El cliente puede contactar con cualquier nodo (Coordinador).
• El coordinador contacta con nodos involucrados en la replicación o con
coordinadores locales de otros DC.
• La replicación se configura en el keyspace.
Tras todo lo expuesto anteriormente, se puede concluir que las características esenciales
de Cassandra son:
• Emplea sistema NoSQL, distribuido y preparado para Big Data.
• Es un Software libre.
• Emplea nodos iguales constituyendo anillos.
• Es escalable horizontalmente (P2P).
• El lenguaje de consultas es CQL.
• Tiene consistencia eventual.
24 • Es escalable.
• Es tolerable a fallos, los datos se replican automáticamente a múltiples nodos para
recuperarse frente a fallos. Además soporta la replicación a través de múltiples
datacenter. Los nodos que fallen pueden ser reemplazados sin que ello suponga la
inactividad o interrupción de la aplicación.
• Soporta MapReduce. Está integrado con Apache Handoop para soportar
MapReduce y existe también soporte para ApachePig y Apache Hive.
25 5. Desarrollo del Prototipo El desarrollo del prototipo se compone de cuatro partes:
Elección de las Tecnologías: se escoge y justifica con que tecnologías de las
estudiadas de va a desarrollar finalmente el prototipo.
Creación de los Servidores con Vagrant: se describe la composición y creación de
cada servicio utilizando la herramienta Vagrant.
Aplicación: se describe las partes de las que está formada la aplicación y el proceso
de desarrollo que se ha seguido.
Pruebas: se comprueba que el sistema funcione correctamente.
5.1. Elección de las Tecnologías Cabe destacar que no existe una combinación ideal de tecnologías, ya que todas poseen
características que podrían responder a las necesidades de Gemalto. De este modo, se ha
procedido a elegir la combinación de tecnologías con servidores menos complejos de
crear, configurar y desplegar. Otro factor a tener en cuenta a la hora de la selección ha
sido la sencillez de utilización de las APIs proporcionadas por las diferentes tecnologías.
Por tanto, se ha tomado la decisión de que la mejor combinación es: RabbitMQ en la capa
de ingestión, Apache Storm en la capa de procesado y Cassandra en la capa de
persistencia.
Ilustración 3 – Esquema de la arquitectura del prototipo 26 5.2. Creación de los Servidores con Vagrant Para la definición de los servidores que conforman el prototipo se ha utilizado un único Vagrantfile, lo que nos permite desplegar toda la arquitectura con un solo comando. También nos permite destruir la estructura con un solo comando cuando hallamos terminado de trabajar con ella. Todos los servidores utilizados parten de un Sistema Operativo Ubuntu 14.04 LTS de 32 bits. A continuación se muestra la configuración de cada servicio: 5.2.1. RabbitMQ
En el prototipo, RabbitMQ es un cluster con tres nodos: un maestro y dos esclavos. El
sistema se ha configurado para que los mensajes que lleguen al maestro se repliquen en
los dos esclavos, consiguiendo así tolerancia a fallos y alta disponibilidad.
Vagrant
Ilustración 4 – Definición de RabbitMQ en Vagrant 27 Ilustración 5 – Definición de RabbitMQ en Vagrant Scripts de Configuración
Para la creación de los servidores que componen el cluster de RabbitMQ se han utilizado
tres scripts de configuración:
rabbitmq.sh
Ilustración 6 – Script rabbitmq.sh 28 rabbit_cluster_config_master.sh
Ilustración 7 – Script rabbit_cluster_config_master.sh rabbit_cluster_config_slave.sh
Ilustración 8 – Script rabbit_cluster_config_slave.sh 29 5.2.2. Apache Storm
En el prototipo, Storm es un cluster con tres nodos: un maestro y dos supervisores
(esclavos). El nodo maestro ejecutará el demonio Nimbus y Zookeeper, por lo que será el
encargado de distribuir el código a través del cluster y de la coordinación entre el Nimbus
y los Supervisor. Los nodos supervisores ejecutan una porción de la topología para que
así se puedan distribuir las tareas a lo largo del cluster.
Vagrant
Ilustración 9 – Definición de Apache Storm en Vagrant 30 Ilustración 10 – Definición de Apache Storm en Vagrant Scripts de Configuración
Para la creación de los servidores que componen el cluster de Apache Storm se han
utilizado seis scripts de configuración:
java8.sh
Ilustración 11 – Script java8.sh zookeeper.sh
Ilustración 12 – Script Zookeeper.sh 31 storm.sh
Ilustración 13 – Script storm.sh upstarNimbus.sh
Ilustración 14 – Script upstarNimbus.sh 32 upstarSupervisor.sh
Ilustración 15 – Script upstarSupervisor.sh upstarUI.sh
Ilustración 16 –Script upstarUI.sh 33 5.2.3. Cassandra
En el prototipo, Cassandra es un cluster con cuatro nodos: un maestro y tres esclavos. La
instalación de Cassandra se ha realizado a través de la herramienta DataStax, lo cual
proporciona facilidades a la hora de crear y administrar el clúster, además de una potente
interfaz gráfica llamada Opscenter.
Vagrant
Ilustración 17 -­‐ Definición de Cassandra en Vagrant 34 Ilustración 18 -­‐ Definición de Cassandra en Vagrant Scripts de Configuración
Para la creación de los servidores que componen el cluster de Cassandra se han utilizado
dos scripts de configuración:
opscenter.sh
Ilustración 19 – Script Opscenter.sh 35 cassandraNode.sh
Ilustración 20 – Script cassandraNode.sh Configuración
En el caso de Cassandra existe un paso que no se puede automatizar, la creación del
cluster. Esta parte de la configuración se realiza a través de la interfaz gráfica (Opscenter)
como se describe a continuación:
Acceder a la UI desde el navegador del host: 192.168.56.20:8888 y hacer click en
“Create Brand New Cluster”.
Ilustración 21 – Configuración del cluster de Cassandra 1 36 En el campo “Package” se debe seleccionar la opción “DataStax Community 2.0.8”, como
usuario y contraseña utilizar “vagrant” y hacer click en “Add Datacenter”.
Ilustración 22 – Configuración del cluster de Cassandra 2 En el apartado “Node Properties” se añaden las IPs de los tres nodos esclavos. Al finalizar
hacer click en “Add Datacenter”.
Ilustración 23 – Configuración del cluster de Cassandra 3 37 Hacer click en “Build Cluster”.
Ilustración 24 – Configuración del cluster de Cassandra 4 Hacer click en “Accept Fingerprints”.
Ilustración 25 – Configuración del cluster de Cassandra 5 38 Con los anteriores pasos realizados comenzará la construcción del cluster, instalado los
paquetes necesarios en los nodos esclavos.
Ilustración 26 – Configuración del cluster de Cassandra 6 Cuando haya terminado ya se podrá empezar a utilizar el cluster.
Ilustración 27 – Configuración del cluster de Cassandra 7 39 5.3. Aplicación Para poder simular el flujo de los mensajes dentro del prototipo como si de un backend
real se tratase, se ha desarrollado una aplicación Java.
La aplicación está dividida en cuatro paquetes:
producer.rabbitmq: contiene el productor de mensajes.
consumer.rabbitmq: contiene una clase para probar el correcto funcionamiento del
productor de mensajes.
processing.storm: contiene las clases que forman la topología que se ejecuta en
Apache Storm.
persistence.cassandra: contiene las clases para la conexión y pruebas con Cassandra.
producer.rabbitmq
SimpleProducer: se utiliza para abrir y cerrar la conexión con el cluster de RabbitMQ,
además de para enviar los mensajes.
Ilustración 28 – Clase SimpleProducer 40 Ilustración 29 – Clase SimpleProducer MainSimpleProducer: se utiliza para enviar mensajes al cluster de RabbitMQ.
Ilustración 30 – Clase MainSimpleProducer 41 consumer.rabbitmq
MainSimpleConsumer: se usa para realizar pruebas y comprobar que RabbitMQ está
recibiendo los mensajes que se le envían desde el productor.
Ilustración 31 – Clase MainSimpleConsumer processing.storm
RabbitMQSpout: definición del comportamiento del Spout de Apache Storm.
Ilustración 32 – Clase RabbitMQSpout 42 Ilustración 33 – Clase RabbitMQSpout RawBoltCassandra: definición del comportamiento del Bolt de Apache Storm.
Ilustración 34 – Clase RawBoltCassandra 43 Topology: definición de la topología de Apache Storm.
Ilustración 35 – Clase Topology persistence.cassandra
SimpleClient: se utiliza para conectarse a Cassandra y realizar consultas.
Ilustración 36 – Clase SimpleClient 44 Ilustración 37 – Clase SimpleClient 45 Ilustración 38 – Clase SimpleClient 46 BoundStatementsClient: sirve para insertar datos en Cassandra mediante una sentencia
predefinida.
Ilustración 39 – Clase BoundStatementsClient MainBoundStatementsClient: se utiliza para hacer pruebas a Cassandra.
Ilustración 40 – Clase MainBoundStatementsClient 47 Ilustración 41 – Clase MainBoundStatementsClient QueryDemo: se utiliza para comprobar que el prototipo está funcionando correctamente.
Ilustración 42 – Clase QueryDemo Se ha hecho uso de Javadoc para documentar el código y Maven para la generación de
JAR de la topología de Apache Storm y para manejar las dependencias.
A continuación se muestra el fichero pom.xml:
Ilustración 43 – pom.xml 48 Ilustración 44 – pom.xml 49 5.4. Pruebas Para probar el correcto funcionamiento del prototipo se simulará el recorrido de varios
mensajes a través de él, comenzando con el envío de mensajes a RabbitMQ desde la
aplicación Java y finalizando con la comprobación de que se han escrito correctamente
los datos en Cassandra.
En primer lugar se despliegan las máquinas con el comando: vagrant up y se crea el
cluster de Cassandra a través del Opscenter como se ha indicado anteriormente.
Ilustración 45 – Despliegue de los servidores desde terminal El proceso de pruebas comienza con los servidores desplegados y funcionando.
Ilustración 46 – Interfaz gráfica de RabbitMQ 50 Ilustración 47 – Interfaz Gráfica de Apache Storm Ilustración 48 – Interfaz gráfica de Cassandra (Opscenter) 51 El primer paso es ejecutar la topología en Apache Storm ejecutando el siguiente comando
a través de una conexión SSH con el nodo maestro:
Ilustración 49 – Comando para arrancar la topología en Apache Storm Se comprueba en la interfaz gráfica de Storm que se está ejecutando la topología: Ilustración 50 – Interfaz gráfica de Apache Storm con la topología en ejecución Se comprueba que Apache Storm está conectado a RabbitMQ, esperando mensajes para
procesar:
Ilustración 51 – Interfaz gráfica de RabbitMQ con los nodos de Apache Storm conectados 52 El segundo paso es mandar mensajes a RabbitMQ, esto se hace desde IntelliJ IDEA
ejecutando la clase “MainSimpleProducer”:
Ilustración 52 – Ejecución de la clase MainSimpleProducer Se comprueba que están llegando los mensajes a RabbitMQ:
Ilustración 53 – Interfaz gráfica de RabbitMQ recibiendo mensajes 53 Se comprueba que Storm está procesando mensajes:
Ilustración 54 -­‐ Interfaz gráfica de Apache Storm procesando mensajes Se comprueba que Storm ha escrito los mensajes en Cassandra desde el Opscenter:
Ilustración 55 -­‐ Interfaz gráfica de Cassandra (Opscenter) con datos insertados 54 Por último, se comprueba que Storm ha escrito los mensajes en Cassandra haciendo una
consulta desde IntelliJ IDEA a través de la clase “QueryDemo”:
Ilustración 56 – Ejecución de la clase QueryDemo 55 6. Limitaciones y Propuestas Para concluir este trabajo se procederá a realizar una reflexión sobre las limitaciones que
se han encontrado en su elaboración así como de las propuestas que ayudarían a
mejorarlo.
En primer lugar, me gustaría destacar la nula formación sobre el área tratada recibida
durante los cuatro años de grado. Esta cuestión fue la que me empujó a decidirme por esta
área de la informática para la elaboración de este proyecto, ya que considero que se trata
de uno de los campos de mayor relevancia en la actualidad. Así pues, en un principio me
encontré abarcando un tema amplio sobre el que no tenía ningún tipo de conocimiento
previo, pero gracias a la ayuda de los compañeros de equipo de Gemalto que me han
acompañado durante el proceso esta primera dificultad fue superada, logrando focalizar
y encauzar el trabajo.
Otra de las dificultades encontradas durante el proceso ha sido la escasez de información
referente al tema de estudio, concretamente sobre las diferentes tecnologías abarcadas.
Además, a esta dificultad se le añade el hecho de que la mayor parte de la información
encontrada está en inglés.
En la empresa donde realicé el periodo de prácticas no encontré ningún tipo de
impedimento, al contrario, fui tratado desde el primer momento como uno más del equipo,
asumiendo responsabilidades propias de un trabajador experimentado.
La elaboración del proyecto se ha visto contrariada en un primer momento por la
simultaneidad del periodo de prácticas con el desarrollo de las restantes asignaturas del
grado, hecho que ha supuesto una escasez de tiempo para su elaboración. A sí mismo, en
segundo lugar, mi estancia en la empresa ha sido prolongada a través de un contrato GIPE
de jornada completa para el desempeño de funciones diferentes a las realizadas durante
el periodo de prácticas. Esto ha supuesto disponer de poco tiempo para la realización de
la memoria.
Para solventar las dificultades encontradas durante el desarrollo del trabajo descrito
propongo el estudio de la posibilidad de impartir una asignatura sobre los fundamentos
del Big Data y las diferentes tecnologías que lo implementan. Considero que esto puede
llevarse a cabo ya que en nuestra universidad existe un curso de verano sobre esta
temática, el cual me planteo realizar en un futuro próximo.
56 7. Bibliografía Alonso Ramos, J. (22 de septiembre de 2014). Introducción a Apache Storm. Obtenido de Adictos al Trabajo: https://www.adictosaltrabajo.com/tutoriales/introduccion-­‐storm/ Alonso Ramos, J. (13 de octubre de 2014). Primeros pasos con Apache Kafka. Obtenido de Adictos al Trabajo: https://www.adictosaltrabajo.com/tutoriales/kafka-­‐logs/ Amazon Web Services. (2016). ¿Qué es NoSQL? Obtenido de AWS: https://aws.amazon.com/es/nosql/ Canales Mora, R. (5 de diciembre de 2013). Primeros pasos con Apache Cassandra. Obtenido de Adictos al Trabajo: https://www.adictosaltrabajo.com/tutoriales/primeros-­‐pasos-­‐
apache-­‐cassandra/ Cooper, P. (9 de abril de 2009). RabbitMQ – A Fast, Reliable Queuing Option for Rubyists. Obtenido de rubyinside: http://www.rubyinside.com/rabbitmq-­‐a-­‐fast-­‐reliable-­‐
queuing-­‐option-­‐for-­‐rubyists-­‐1681.html Dans, E. (2011). Big Data: una pequeña introducción. Obtenido de Enrique Dans: https://www.enriquedans.com/2011/10/big-­‐data-­‐una-­‐pequena-­‐introduccion.html Galván, P. (febrero de 2016). Un Vistazo a Apache Spark Streaming. Obtenido de SG Buzz: http://sg.com.mx/revista/50/un-­‐vistazo-­‐apache-­‐spark-­‐streaming#.V3UonFdhpER Gemalto. (2016). Qué hacemos. Obtenido de Gemalto: http://www.gemalto.com/latam/acerca/seguridad-­‐digital Gemalto. (2016). Quiénes somos. Obtenido de Gemalto: http://www.gemalto.com/latam/acerca Gracia, L. M. (10 de julio de 2013). Un poco de Java. Obtenido de Un poco más de Kafka: https://unpocodejava.wordpress.com/2013/07/10/un-­‐poco-­‐mas-­‐de-­‐kafka-­‐version-­‐0-­‐
8/ HashiCorp. (2015). About Vagrant. Obtenido de Vagrant: https://www.vagrantup.com/about.html HashiCorp. (2015). Vagrant Getting Started. Obtenido de vagrantup: https://www.vagrantup.com/docs/getting-­‐started/ IBM. (2012). IBM. Obtenido de Analytics: el uso del big data en el mundo real: http://www-­‐
05.ibm.com/services/es/gbs/consulting/pdf/El_uso_de_Big_Data_en_el_mundo_real.
pdf Johansson, L. (18 de Mayo de 2015). Part 1: RabbitMQ for beginners -­‐ What is RabbitMQ? Obtenido de CloudAMQP: https://www.cloudamqp.com/blog/2015-­‐05-­‐18-­‐part1-­‐
rabbitmq-­‐for-­‐beginners-­‐what-­‐is-­‐rabbitmq.html 57 Lo que me interesa de la red. (15 de julio de 2014). Apache Kafka, el sistema de mensajería distribuido de LinkedIn. Obtenido de Lo que me interesa de la red: https://loquemeinteresadelared.wordpress.com/2014/07/15/apache-­‐kafka/ Pintor, M. (4 de 2 de 2015). Vagrant, la herramienta para crear entornos de desarrollo reproducibles. Obtenido de Conasa: http://www.conasa.es/blog/vagrant-­‐la-­‐
herramienta-­‐para-­‐crear-­‐entornos-­‐de-­‐desarrollo-­‐reproducibles/ Pivotal. (2016). Features. Obtenido de RabbitMQ: https://www.rabbitmq.com/features.html Pivotal. (2016). Get Started. Obtenido de RabbitMQ: https://www.rabbitmq.com/getstarted.html Pulido, F. J. (2014). Paradigmas Big Data: La Arquitectura Lambda. Obtenido de Francisco Javier Pulido: http://www.franciscojavierpulido.com/2014/03/paradigmas-­‐bigdata-­‐la-­‐
arquitectura.html RabbitMQ. (2016). AMQP 0-­‐9-­‐1 Model Explained. Obtenido de RabbitMQ: https://www.rabbitmq.com/tutorials/amqp-­‐concepts.html Requena, C. (5 de abril de 2010). Cassandra. Obtenido de nosql.es: http://www.nosql.es/blog/nosql/cassandra.html Roy, J. (17 de agosto de 2014). MongoDB: Características y futuro. Obtenido de MongoDB Spain: http://www.mongodbspain.com/es/2014/08/17/mongodb-­‐characteristics-­‐
future/ Ruiz García, E. (2015). Estudio y Evaluación de Sistemas “Big Data” de Tratamiento de Información. Obtenido de Estudio y Evaluación de Sistemas “Big Data” de Tratamiento de Información: http://oa.upm.es/37766/1/PFC_ENRIQUE_RUIZ_GARCIA_2015.pdf Vecino Rosado, M. (22 de enero de 2015). ¿Cassandra? ¿Qué es? Obtenido de SlideShare: http://es.slideshare.net/planetcassandra/cassandra-­‐qu-­‐es-­‐de-­‐0-­‐a-­‐100-­‐con-­‐apache-­‐
cassandra Wiesel, J. (4 de marzo de 2014). Codehero. Obtenido de Como utilizar colas de mensajes con RabbitMQ parte 1: http://codehero.co/como-­‐utilizar-­‐colas-­‐de-­‐mensajes-­‐con-­‐rabbitmq-­‐
parte/ Wikipedia. (2015). RabbitMQ. Obtenido de Wikipedia: https://es.wikipedia.org/wiki/RabbitMQ Wikipedia. (28 de junio de 2016). Apache Cassandra. Obtenido de Wikipedia: https://es.wikipedia.org/wiki/Apache_Cassandra Wikipedia. (15 de mayo de 2016). MongoDB. Obtenido de Wikipedia: https://es.wikipedia.org/wiki/MongoDB 58 
Descargar