Cuando necesita adquirir datos de numerosas fuentes, generalmente se enfrenta a diferentes proveedores, protocolos y formatos de datos. Incluso para el mismo tipo de sensor, es difícil que siempre reciba el mismo mensaje. Por lo tanto, necesita una forma de unificar o «normalizar» sus datos. Y ahí es exactamente donde Wizzie Normalizer entra en juego durante el proceso de adquisición de datos.

Pablo Casares

Escenarios de procesamiento de streams

Hay muchos escenarios en los que existen distintas fuentes de datos que se quieren procesar. Por lo general, la información que desea ingerir en su sistema necesita ser transformada de alguna manera. La necesidad de cambiar el nombre de algún campo del evento, modificar valores o normalizar los datos de un conjunto de fuentes diversas es muy común. En otras ocasiones, puede necesitar transformar sus datos para poder procesarlos. En todas estas situaciones, Normalizer le ayuda.

 

Las claves de Wizzie Normalizer

Normalizer es un servicio basado en la librería de Kafka Streams. Esto significa que aprovechamos características de esta librería de procesamiento de flujo, como la escalabilidad y garantías de procesamiento. Normalizer es capaz de procesar datos en formato JSON sobre Kafka.

Y no hay problema si su sistema no usa eventos JSON. Para eso tenemos a Wizzie Prozzie, que ayuda a ingerir una gran cantidad de protocolos porque está basado en Kafka Connect. Prozzie transformará sus datos en JSON, proporcionando una forma de utilizar toda nuestro pipeline. Puede consultar los protocolos compatibles con Prozzie en: https://github.com/wizzie-io/prozzie#supported-protocols. Lo abordaremos en una publicación futura.

Volviendo a Normalizer, puede decirse que es un motor de procesamiento de flujo. Y lo hemos hecho lo más sencillo posible: si desea transformar una secuencia de datos de una fuente a otra, simplemente arranque Normalizer, cargue un archivo de configuración de flujo, y éste indicará a Normalizer qué hacer. Todas estas transformaciones las hará Normalizer.

Otra característica esencial de Normalizer es que está diseñado para entornos Big Data. También, es completamente escalable y muy rápido, lo que le permite crear un clúster de instancias que distribuirá la carga de procesamiento entre ellas.

 

Cómo escala Normalizer

Puesto que Normalizer está basado en Kafka Streams, aprovechamos sus características para escalar Normalizer hacia arriba y hacia abajo. Para ello, solo es necesario arrancar o eliminar instancias. La librería Kafka Streams distribuirá el número actual de particiones de topics de Kafka en todas las instancias de Normalizer. Si sus necesidades de procesamiento aumentan, simplemente arranque otra instancia y las instancias de Normalizer que forman el clúster compartirán la carga. Si sus necesidades de procesamiento se reducen, solo necesita eliminar alguna instancia.

 

Cómo decirle a Normalizer qué hacer

Cuando diseñamos Normalizer, pensamos en cómo configurar fácilmente un grupo de instancias. Debido a que tenemos a Kafka como una dependencia, hicimos que cada instancia de Normalizer cargara su configuración desde un topic especial. A esto lo llamamos un bootstrap topic. De esta manera, cuando se tienen varias instancias de Normalizer, simplemente habría que publicar el archivo de configuración de flujo (o stream plan) en el bootstrapping topic de Kafka, al que cada instancia de Normalizer escucha, y todos se configurarán a la vez.

 

Normalizer en acción

Nuestro Normalizador permite procesar datos de casi todos los entornos posibles. Por ejemplo, imagine un escenario de Smart City. Esta ciudad imaginaria tendría muchos sensores enviando datos en formato JSON. Imagínese que tiene sensores de humedad, semáforos, servicio de autobuses, estacionamiento inteligente, ruido urbano, congestión del tráfico, contaminación del aire, etc. Estos sensores pueden ser de diferentes fabricantes y los datos que envíen también pueden ser diferentes. Por ejemplo, la temperatura podría ser enviada como:

{“temp”: 23.0} and {“temperature”: 23.0}

El fabricante del sensor «X» reportaría el primero y el fabricante del sensor «Y» reportaría el segundo.

Cuando necesite actuar, analizando estos u otros valores, es más conveniente tener la información normalizada. Si cada sensor envía la misma información siempre de la misma manera, solo tiene que trabajar con la información normalizada en lugar de tener que trabajar con cada esquema de datos. Y eso hace que sea más fácil para usted operar su sistema si analiza todos los datos de temperatura solo como «temp» o como «temperature».

Normalizer le permite hacer este proceso más fácil, más rápido y configurable. Algunas de las transformaciones que puede hacer con sus eventos de datos son:

  • Añadir campos.
  • Seleccionar o simplificar campos.
  • Reemplazar valores.
  • Unir dos o más valores.
  • Seleccionar máximo/mínimo de una matriz de valores.
  • Clasificar valores numéricos
  • Dividir un valor en múltiples dimensiones
  • Convertir formatos de hora.
  • Convertir tipos de campo.
  • Calcular valores aritméticos
  • Renombrar campos.
  • Filtrar
  • Transformar un mensaje en varios.

Por supuesto, puede combinar estas funcionalidades para diseñar un sistema complejo. Además, puede desarrollar sus funciones si necesita una función no soportada oficialmente. Es fácil implementar una nueva función; hemos desarrollado este motor pensando en esto.

Cubriremos nuestro ZZ-CEP y Enricher en futuras publicaciones. Estos servicios le permitirán combinar información, proporcionar contexto y tomar decisiones basadas en sus datos.

Si necesita más información sobre las funcionalidades del normalizador, puede consultar nuestros documentos: https://wizzie-io.github.io/normalizer/

Para implementar una nueva funcionalidad puedes consultar:

https://wizzie-io.github.io/normalizer/customize/custom-development.html

Haciendo que nuestra Smart City sea inteligente

Ahora, le mostraremos el uso y la configuración de Normalizer. Primero, debe saber que el Normalizador se puede usar sobre Docker o simplemente como un proceso de Java.

Si desea utilizarlo como proceso java, visit https://github.com/wizzie-io/normalizer y siga la sección de fuentes de compilación.

Si desea utilizar el Normalizador en Docker, hemos publicado la imagen del Normalizador en Docker Hub: https://hub.docker.com/r/wizzieio/normalizer/

Para este ejemplo en particular, vamos a utilizar un Normalizador acoplado. En primer lugar, necesitamos ejecutar una instancia de Normalizer:

docker run -e APPLICATION_ID=my-normalizer -e  KAFKA_BOOTSTRAP_SERVER=192.168.1.100:9092 wizzieio/normalizer:latest

Después de eso, necesitamos cargar un stream plan en el Normalizador para decirle qué hacer con los eventos de datos:

{
    "inputs":{
      "mytopic":["mystream"]
    },
    "streams":{
      "mystream":{
          "funcs":[
          {
          "name":"myMapper","className":"io.wizzie.normalizer.funcs.impl.RenameMapper",
            "properties": {
            "maps": [{"dimPath":["temperature"], "as":"temp"}    ]
            }
          }
          ],
          "sinks":[
              {"topic":"output", "type":"kafka"}
          ]
      }
   }
}

Una vez que haya definido esto, debe enviar este archivo de configuración de stream plan en formato JSON a Kafka, con una clave my-normalizer y un topic __normalizer_bootstrap, como ya hemos mostrado en la sección «Cómo decirle a Normalizer qué hacer». La forma más sencilla de hacerlo es usar nuestra herramienta «streamer-kafka.sh», que puede encontrar en el repositorio de GitHub de Normalizer. Después de eso, cada instancia del Normalizer transformará cada evento entrante en el topic «mytopic» con clave «temperatura» a la clave «temperatura».

Como puede ver, hemos definido nuestro archivo de configuración de stream plan que le permite usar nuestras propias funciones o sus funciones personalizadas y especificar en qué topics leer o escribir.

Como se describió anteriormente, escalar este servicio es muy fácil. Simplemente tiene que levantar más contenedores de Normalizer y cada uno seleccionará sus propias particiones Kafka y procesará todo el stream de datos de cada topic por usted.

Para obtener más información acerca de la configuración, el uso y los desarrollos de Normalizer, visite https://wizzie-io.github.io/normalizer/

Esperamos que encuentre útil este pequeño tutorial. No dude en ponerse en contacto con nosotros en technology@wizzie.io si necesita más información.

Enlaces útiles

Acceso a descargas e información adicional.

Share This