miércoles, 23 de agosto de 2017

Procesando grandes cantidades de datos con Google Cloud IoT y BigQuery

Cuando hablamos del internet de las cosas, posiblemente se nos venga a la cabeza un dispositivo, Arduino por ejemplo, conectado con algunos sensores que le suministran pequeñas cantidades de información. Sin embargo, si esto lo multiplicamos por cientos, miles o incluso millones, se convierte en un problema estructural tanto a nivel de gestión de dispositivos como de almacenamiento de datos.

Junto a esto, se suma la necesidad de tener acceso inmediato y consistente a la información que recogen los dispositivos, con el fin de satisfacer las demandas de los usuarios: paneles de información de metro actualizados, tráfico en las carreteras o la posición del coche que acabas de solicitar, por poner unos ejemplos.


Por lo tanto, para poder trabajar con gran cantidad de dispositivos y a su vez explotar la información que estos generan, la mejor opción es utilizar soluciones en la nube.

En BEEVA Labs hemos creado desde cero la infraestructura necesaria en Google Cloud para gestionar dispositivos IoT, procesando la información generada por éstos dentro de una base de datos BigQuery y en este articulo te contamos como hacerlo paso a paso.

IoT Core

La plataforma cloud de Google nos permite gestionar de forma fácil y segura nuestra infraestructura de dispositivos; proporcionándonos un sistema de gestión de credenciales basado en clave pública/privada RS256 o ES256.

La comunicación entre los dispositivos y la nube se realiza exclusivamente a través del protocolo de mensajería MQTT, utilizando el servicio Pub/Sub como puente. Es por ello, que todos los dispositivos deben estar suscritos a un tema MQTT por donde envían y reciben mensajes.

Arquitectura básica de Google Cloud IoT

A continuación se detallan los pasos a seguir para registrar un dispositivo en Cloud IoT y crear un tema en Pub/Sub:
  1. Activar las APIs de IoT y Pub/Sub.
  2. En Pub/Sub: crea un nuevo tema, quedando con el siguiente formato:
    projects/[nombre del proyecto]/topics/[nombre del tema]
  3. En IoT Core: crea un nuevo registro de dispositivos seleccionando nombre, región y el tema que hemos creado en el punto anterior.
  4. Aceptar la concesión de permisos que solicita Cloud IoT de editor de Pub/Sub.
  5. Creamos una clave pública/privada desde línea de comandos:
    RS256 openssl req -x509 -newkey rsa:2048 -keyout rsa_private.pem -nodes -out rsa_cert.pem -subj “/CN=unused”
    ES256openssl ecparam -genkey -name prime256v1 -noout -out ec_private.pem openssl ec -in ec_private.pem -pubout -out ec_public.pem
  6. Nuevo dispositivo: añade un dispositivo introduciendo nombre, marcando como “enable” el dispositivo, eligiendo el tipo de clave que hemos creado en el punto anterior (RS256 o ES256) y copiando la clave pública en el cuadro de texto. Por último, opcionalmente podemos definir la fecha de caducidad del dispositivo.

Dataflow & BigQuery

Google Cloud Dataflow es un servicio autoadministrado de procesamiento de datos por canalizaciones, capaz de tomarlos vía streaming o por lotes.

En este caso de estudio, la ventaja de Dataflow frente a otras soluciones como Cloud Functions es la completa integración que tiene con los servicios Pub/Sub y BigQuery; permitiendo realizar una comunicación entre ambos servicios sin tener que escribir ni una sola línea de código.

Por otra parte, BigQuery es la mejor solución si se plantea una explotación intensiva de grandes cantidades de datos (a nivel de terabytes) y almacenamiento casi ilimitado.

Arquitectura de comunicación entre Google Cloud IoT y BigQuery

A continuación se detallan los pasos a seguir para crear una tarea de Cloud Dataflow y una base de datos BigQuery:
  1. Activar las APIs de Dataflow y BigQuery.
  2. En BigQuery: crea un nuevo dataset especificando nombre y localización. Dentro de este dataset crea una tabla vacía, definiendo el nombre de la tabla y el nombre de los campos junto con el tipo (string, integer, date,…).
  3. Es importante que el nombre de los campos de la tabla coincidan con los nombres de los parámetros que se pasen por JSON desde el dispositivo.
  4. En Dataflow: crea una nueva tarea a partir de plantilla seleccionando “Pub/Sub de Cloud a BigQuery”; como parámetros introduce el tema creado al registrar el dispositivo “projects/[nombre del proyecto]/topics/[nombre del tema]” y los datos de la tabla creada en el punto anterior “[nombre del proyecto]:[nombre del dataset].[nombre de la tabla]”.
Una vez terminados estos pasos, podremos comenzar a publicar mensajes desde el dispositivo sobre el tema MQTT y veremos como en tiempo real se van haciendo inserts automáticamente sobre la base de datos.
La principal ventaja de utilizar un sistema autoadministrado como Dataflow o BigQuery, es que aunque el número de dispositivos crezca y el flujo de mensajes se incremente, no tenemos que realizar ninguna acción, como configurar un grupo de instancias con balanceo automático o ampliar cuotas de disco en la base de datos.

Fuente imagen principal: Massachusetts Bay Transit Authority by Barco
Artículo original publicado en BEEVA Labs por Javier López Martínez.