/proyecto-CC

Proyecto de la asignatura Cloud Computing para el curso 2018-2019

Primary LanguagePythonGNU General Public License v3.0GPL-3.0

Análisis de tendencias (geolocalizadas) en Twitter

Proyecto de la asignatura Cloud Computing para el curso 2018/2019 del Máster en Ingeniería Informática, realizado por Gema Correa Fernández. Pincha aquí para acceder al enlace de la documentación.

Tabla de Contenidos

MV2: 40.89.158.208

Novedades

  • Pincha aquí para ver el resumen realizado sobre el seminario de Chef.
  • Pincha aquí para ver el resumen realizado sobre el seminario de la nube desde línea de órdenes.
  • Pincha aquí para acceder a la documentación trasladada del hito 3.
  • Pincha aquí para localizar el nuevo apartado de automatización de tareas en la nube, correspondiente al hito 4 (se explica porque se hace uso de la CLI de Azure).
  • Pincha aquí para ver los pasos para la creación de una instancia en la nube.
  • Pincha aquí para aprender a instalar la CLI de Azure e iniciar sesión y autenticarse.
  • Pincha aquí para aprender a listar imágenes de máquinas virtuales con la CLI de Azure.
  • Pincha aquí para ver la justificación de la elección de la imagen del sistema operativo.
  • Pincha aquí para ver la justificación de la elección del tamaño de la imagen de la máquina virtual.
  • Pincha aquí para ver que tamaños de imágenes están disponibles en cada ubicación/región.
  • Pincha aquí para ver la justificación de la elección del centro de datos.
  • Pincha aquí para acceder a los avances realizados en el hito 4.
  • Pincha aquí para ver el script de aprovisionamiento, aquí para ver la documentación del mismo y aquí para ver su salida.
  • Pincha aquí para más información acerca de como se ha redirigido el puerto 5000 usado por Flask al puerto 80.

Descripción del proyecto

Twitter junto con Instagram son dos de las plataformas sociales más usadas actualmente, por eso mismo, miles de usuarios comparten todo tipo de información en ellas. Este tipo de comportamientos benefician a las empresas dándoles potestad en la obtención de información muy valiosa, cómo por ejemplo ver qué tendencias o trending topics son los más comentados o qué ciudades son las más comentadas en la red. En este caso, yo me voy a centrar en la obtención de datos geolocalizados, es decir, en la extracción de trending topics o tendencias de los usuarios en Twitter para una región determinada. Para así, poder clasificar las tendencias y establecer la tendencia mayoritaria para una region determinada.

Descripción de arquitecturas software

Actualmente, las arquitecturas software modernas buscan la consistencia en la velocidad de respuesta al usuario. Sin embargo, en el mercado existen muchos tipos de arquitecturas, es por ello que a veces se hace difícil concretar qué arquitectura se va a utilizar [2]:

  • Arquitectura en capas.
  • Arquitectura dirigida por eventos.
  • Arquitectura microkernel.
  • Arquitectura basada en microservicios.
  • Arquitectura basada en espacios.

Pincha aquí para saber más acerca de las arquitecturas anteriores.

Arquitectura seleccionada

Entonces, resulta bastante claro que de todas las arquitecturas comentadas anteriormente vayamos a hacer uso de la arquitectura basada en microservicios, ya que es la que más actual y la que menos problemas presenta, además de que nos permite tener diferentes servicios trabajando de forma totalmente independiente unos de otros.

Descripción de los microservicios a desarrollar

Para realizar la arquitectura se va a hacer uso del lenguaje Python, y para el desarrollo de los microservicios se puede usar cualquier microframework web para Python, en este caso existe la posibilidad de usar Django (más complejo o pensado para un proyecto de grandes dimensiones o que crezca) o Flask (más sencillo). Es por ello, que tras haber buscado documentación, hablado con usuarios de ambos microframework y ser la primera vez que uso este tipo de tecnología/herramienta, me he decantado por Flask. Los microservicios previstos a desarrollar son los siguientes:

  1. Consultar API de Twitter: en este microservicio solo nos vamos a centrar en acceder, consultar y bajarnos información de la API, información obtenida en un JSON.
  2. Procesar información: en este microservicio vamos a quedarnos con los datos referentes a las tendencias según su localización, en un JSON: API.trends_place(id[, exclude]).
  3. Almacenar información: en este microservicio nos vamos a centrar en crear una estructura para los datos que hemos realizado, usando principalmente una BD como MongoDB.
  4. Mostrar información: en este microservicio solo nos interesa mostrar la información relevante de alguna manera específica.
  5. Además, necesitamos un sistema de centralización de logs, al cual todos deben comunicarse.

Comunicación entre los microservicios

La comunicación entre servicios será realizada por brokers, en concreto con RabbitMQ, que es un sistema de manejo de colas.

Bibliotecas de Python para la API de Twitter

Actualmente, la API de Twitter nos permite acceder a todo tipo de información de forma más simple que la de Instagram, es por eso que me he decantado por esta red social. A continuación, se muestran algunos datos a los que podemos acceder [1]:

  • Tweets: búsqueda, publicación, filtrado, etc.
  • Anuncios: gestión de campañas, análisis, etc.
  • Contenido multimedia: subir y acceder a fotos, vídeos, GIF animados, etc.
  • Tendencias: trending topics.
  • Geo: información sobre lugares conocidos, lugares cerca de una ubicación, etc.

Python cuenta muchas bibliotecas desarrolladas para la API de Twitter. Sin embargo, al no haber usado nunca ninguna me es dífil elegir que biblioteca es la mejor. Es por ello, que voy hacer uso de tweepy ya que he oído hablar de ella bastante bien y tiene bastante documetación en la web. De todas maneras, existen otras librerías cómo twython, python-twitter o TwitterAPI.

Pincha aquí, para más información acerca de la extracción de datos de Twitter realizada para el proyecto

Descipción de los tests en Python (código sin test código roto)

Para testear en Python [3], puedo usar algunas de las librerías que me permiten implementar pruebas unitarias en dicho lenguaje como unittest, doctest o pytest [4]. En este caso yo voy hacer uso de la biblioteca unittest, ya que nos ofrece toda la potencia del lenguaje para probar nuestros programas, lo que significa que ayuda a determinar rápidamente el impacto de cualquier modificación en el resto del código.

Para realizar la configuración de los tests correctamente, voy hacer uso de Travis CL, que es un sistema distribuido de generación e integración continua libre, que me permite conectar mi repositorio de Github y testear después de cada push que haga [5] [6].

Pincha aquí, para saber más información sobre los tests.

Descripción del despliegue

Despliegue en PaaS

Cuando se quiere desplegar una aplicación sobre una infraestructura ya definida y que no va a cambiar se necesita un Platform as a Service o PaaS. Entre los posibles servicios que hay Heroku o OpenShift, vamos a escoger Heroku, ya que es un servicio fiable, gratuito, ofrece muchas opciones a la hora de elegir el lenguaje y permite integrar Github con Travis.

Pincha aquí, para saber más información sobre el despliegue en PaaS.

Despliegue de la infraestructura en máquina virtual local

Para el despliegue de la aplicación en una máquina virtual local, se ha hecho uso de Ansible junto con Vagrant. Previamente a la realización de un clone a mi repositorio, se debe instalar Ansible, Vagrant y VirtualBox, herramientas necesarias para ejecutar la aplicación. Una vez realizados estos procesos, debemos dirigirnos al directorio provision > vagrant_ubuntu y ejecutar la sentencia vagrant up, la cual creará una máquina virtual en VirtualBox y ejecutará el playbook con lo indispensable para el despliegue.

Vagrant

Se ha utilizado la herramienta Vagrant para generar entornos de desarrollo reproducibles y compartibles de forma muy sencilla, ya que crea y configura máquinas virtuales a partir de simples ficheros de configuración. El fichero donde se describe la infraestructura se llama Vagrantfile y es utilizado para el despliegue (enlace).

Pincha aquí, para saber más información sobre el despliegue en máquina virtual local con Vagrant.

Ansible

Para el provisionamiento se ha hecho uso de Ansible (versión 2.7.2) Como software para automatizar el proceso de aprovisionamiento se ha utilizado Ansible, creando previamente los siguientes ficheros:

  • ansible.cfg: fichero de configuración básica, que básicamente le dice a Ansible que tiene que mirar en el fichero ansible_hosts.
  • ansible_hosts: fichero para definir una serie de requerimentos (nombre de la máquina, puerto SSH para acceder a la máquina virtua, host).
  • ansible_playbook.yml: fichero para definir las intrucciones a ejecutar (python, git, pip, flask, clonar repositorio).

Pincha aquí, para saber más información sobre la gestión de configuraciones con Ansible.

Pincha aquí, para saber más información sobre el despliegue en Azure.

Pincha aquí para ver la comprobación de @jmv74211 al aprovisionamiento de @gecofer.

Pincha aquí para ver la comprobación de @gecofer al aprovisionamiento de @jmv74211.

Automatización de tareas en la nube

El objetivo de las plataformas de virtualización es, eventualmente, crear y gestionar una máquina virtual que funcione de forma aislada del resto del sistema y que permita trabajar con sistemas virtualizados de forma flexible, escalable y adaptada a cualquier objetivo. Para ello, usaremos los clientes de línea de órdenes de los servicios en la nube para crear instancias de máquinas virtuales y otros recursos necesarios para las mismas. Estas instancias, posteriormente, se provisionarán y se instalará en ella la aplicación que se ha venido usando hasta ahora.

  1. En este caso vamos hacer uso de la CLI de Azure, para ello primero deberemos instalarla, y una vez instalada iniciar sesión y autenticarse en el mismo, además de unos pequeños comandos para ver el listado de imágenes de máquinas virtuales disponibles (pincha aquí para ver la documentación).

Se va hacer uso del CLI de Azure, debido a que dispongo de más conocimientos en su manejo, al ser, personalmente más sencillo. Debido a que pedí patrocinio con Amazon Cloud Services mediante la cuenta de la UGR hace unas semanas y aún sigo esperando la respuesta, es por eso que se ha descartado su uso en este hito. Además, hace menos de una semana se nos proporcionó acceso al patrocinio de Google Cloud, sin embargo, no se ha podido llevar a cabo principalmente por un motivo: no he tenido tiempo de llevarlo a cabo debido a que me ha resultado más complejo de primeras, pero espero poder usarlo para el siguiente hito.

  1. Una vez que podemos crear máquinas virtuales desde la línea de comandos, vamos a razonar la justificación de la elección de la imagen del sistema operativo (pincha aquí para ver dicha justificación). En nuestro caso, hemos seleccionado el sistema Ubuntu Server 18.04 LTS.

  2. Una vez escogido el sistema operativo, pasamos a la elección del tamaño de la imagen para dicha máquina virtual (pincha aquí para ver dicha justificación).

  3. Una vez escogido el sistema operativo, se va a justificar la elección del centro de datos en el cual se creará la máquina virtual (pincha aquí para ver dicha justificación). En este caso, se ha hecho uso del centro de datos del centro de Francia.

  4. Por último, ya solo nos hace falta crear el script de aprovisionamiento, para eso pincha aquí para ver el código, aquí para ver la documentación del mismo y aquí para ver su salida.

Enlaces de Interés

Licencia

Proyecto bajo licencia GNU GLP V3.

Nota: Se debe tener en cuenta que la realización de un proceso de desarrollo conlleva modificaciones en el futuro, pudiendo modificar la documentación o añadiendo nuevas funcionalidades.