Procesando datos en tiempo real con IBM Streams

Leonardo Rébola
leonardorebola
Published in
5 min readFeb 11, 2020

Una vision general sobre la herramienta.

IBM Streams es un sistema de procesamiento distribuido creado hace mas de 10 años por IBM a pedido del Gobierno de los Estado Unidos para analizar y correlacionar grandes volumes de información a gran velocidad.

Contenido de temas:

  • Entornos
  • Entrada/salida de información
  • Procesamiento de datos
  • Desarrollo
  • Estructura de una aplicación Streams
  • SPL
  • Demo
https://www.ibmbigdatahub.com/blog/ibm-streams-10-year-anniversary-and-whats-next

Entornos

La herramienta es licenciada y actualmente se encuentra disponible en las siguientes versiones:

  • En IBM Cloud como Streaming Analytics -disponible una versión Lite con 50hs gratuitas mensuales-.
  • En binario para ser instalado on-premise.
  • Quick Start Edition (no productiva) en docker para desarrollo.

Entrada/salida de información

La herramienta permite la ingestión de información (estructurada o no) desde diversas fuentes y formatos. Cómo así también transmitir los resultados a otros sistemas.

Procesamiento de datos

Para lograr esto IBM Streams provee de operadores -encargados de procesar los datos- y toolkits -como si fueran librerías- que son conjuntos de operadores con un propósito determinado. Algunos toolkits son:

SPL Standard Toolkit

  • Relacionales (Aggregate, Functor, Punctor, Join, Sort, etc).
  • Apadatadores (DirectoryScan, Export, Import, FileSink, FileSource, TCPSource, TCPSink, UDPSource, UDPSink, etc).
  • Utilidades (Barrier, Compress, Decompress, Custom, DeDuplicate, DynamicFilter, Split, ThreadedSplit, Union, etc).

Toolkits Especializados

  • db, inet, teda, financial, text, dps, hbase, networking, json, iot, geospatial, rproject, etc

Open Source Toolkits

Streams permite la creación de procesadores y toolkits custom. En el GitHub de la herramienta se pueden descargar y contribuir con toolkits open source como los siguientes:

  • HBase, Messaging(Kafka, MQTT), MongoDB, Graph DB, Cassandra, Slack, Speech2text, Regex, Math, OpenCV, etc
  • TEDA: Es un framework para telecomunicaciones como su nombre lo indica “Telecommunications Event Data Analytics”. Contiene algunas características para resolver requerimientos comunes de las Telcos, como el procesamiento de información en el estándar ASN.1.

Desarrollo

La curva de aprendizaje es rápida, mas tiempo lleva conocer los mas de 160 operadores -con sus propiedades- aunque no usaremos todos ellos.

IBM Streams nos facilita de un lenguaje de programación de alto nivel denominado SPL (Streams Programing Language) muy fácil de aprender. También soporta programar en Java, Scala y Python.

Hola Mundo en SPL

El entorno de desarrollo es un IDE Eclipse customizado que permite también trabajar con drag and drop. Para la versión Cloud existe una extensión para Visual Studio Code.

https://developer.ibm.com/streamsdev/docs/streams-quick-start-guide/
https://developer.ibm.com/streamsdev/docs/streams-quick-start-guide/

Una comodidad de la IDE, es poder lanzar desde la misma las aplicaciones Streams directamente a un ambiente de desarrollo o testing en un servidor remoto.

La documentación que a la hora de aprender e investigar es tan importante esta organizada de una forma muy practica y concisa. Los ejemplos de proyectos de aplicaciones que se disponen en el GitHub son muy valiosos a la hora practicar, aprender y escribir código.

Estructura de una aplicación Streams

Los componentes básicos de una aplicación Streams son los siguientes:

Operador

El operador es el componente fundamental y se encarga de realizar operaciones especificas sobre los datos.

https://developer.ibm.com/streamsdev/docs/streams-quick-start-guide/

Un operador recibe una secuencia de registros que fluyen hacia el puerto de entrada (input port). Esta secuencia de registros se denomina stream.

Los operadores pueden tener 1 o mas puertos de entrada, o alguno en particular ninguno.

A medida que ingresan los registros del stream, estos se procesan en memoria generando una nueva secuencia de registros que se emitirá por el puerto de salida (output port) del operador. Puede haber 1 o varios puertos de salida, o incluso ninguno, por ejemplo en un operador que escriba logs a disco.

Job, Tupla y Esquema

Una aplicación Streams (job) es una secuencia de Operadores conectados por streams de registros.

https://developer.ibm.com/streamsdev/docs/streams-quick-start-guide/

Los stream están formados por secuencias de registros individuales que fluyen de un operador a otro. Estos registros individuales son las Tuplas.

Un Esquema es la especificación de tipos de datos y atributos en una tupla. En el ejemplo anterior el esquema de las tuplas esta definido por tres campos:

  • height de tipo int32
  • width de tipo int32
  • data de tipo blob

Un operador puede recibir en su puerto de entrada tuplas de un Esquema A, realizar el procesamiento, y generar nuevas tuplas para el puerto de salida con un Esquema B.

SPL

La sintaxis del lenguaje de programación de la herramienta es muy clara y fácil de entender. A continuación el código fuente de la imagen anterior.

https://developer.ibm.com/streamsdev/docs/streams-quick-start-guide/

Dentro de un composite se define la clausula graph donde concatenamos todas las secuencias de operadores.

Los stream unen los operadores a través de los puertos de salida — puertos de entrada.

Demo

Este es un ejemplo donde vamos a procesar este dataset con 20 millones de viajes de Taxis en Chicago durante el año 2016.

La aplicación realizará las siguientes acciones:

  • Leer del disco los archivos de entrada que están en formato CSV.
  • Parsear los datos en tuplas.
  • Dividir el flujo de tuplas según la forma de pago (efectivo o tarjeta).
  • Si fue pago en efectivo, solo me interesará analizar los viajes de ciertos taxis que le envíe su identificador por webservice REST.
  • Filtrado solo los taxis que interesan, a estos se le sumarizará por cada uno de ellos -en una ventana de tiempo- los segundos de viaje, las millas y el total del costo del viaje.
  • El resultado de la sumarización es enviada por POST a un webservice.
Ejemplo de aplicación IBM Streams procesando el dataset “Chicago Taxi Rides 2016”.

El dataset completo fue procesado leyendo desde el disco en 2 minutos.

El entorno de ejecución fue el siguiente:

  • Notebook i7, 20 GB de RAM y SSD.
  • VirtualBox 6.1 con una imagen Streams Quick Start Edition (no productiva) 4.2.1 configurada con 2 cores y 10 GB de RAM.

--

--

Leonardo Rébola
leonardorebola

Desarrollador de software, siempre interesado y curioso de las nuevas tecnologías. Intentaré escribir aquí cada tanto sobre mis experiencias en cosas que hago.