Big Data

Apache Kafka – Una Introducción rápida

El procesamiento de datos en streaming es ubicuo hoy en día. Para obtener resultados pertinentes, el procesamiento de grandes cantidades de datos en lotes puede tener una latencia inaceptable. Es por eso que el ser capaces de procesar la información como un flujo de datos infinito, combinando nuevos datos con datos históricos cuando sea necesario, se vuelve un escenario no solo atractivo sino indispensable. Con suficientes productores de datos, incluso el recibir los mensajes para almacenarlos se puede convertir en un problema interesante. Necesitamos herramientas que puedan escalar horizontalmente para recibir los mensajes, persistirlos de una forma durable, y ponerlos a disposición de otros componentes de una forma determinística.

Uno de los protagonistas del ecosistema de ingeniería de datos, en particular en estos casos (fast-data architectures) es Apache Kafka. Apache Kafka se define como una plataforma, de código abierto, distribuida de flujo de eventos.

El rol de Kafka en estas arquitecturas es crucial: recibir de una forma escalable grandes cantidades de mensajes de fuentes diversas, unificando la interfaz a utilizar por los consumidores, quienes pueden consumir los mensajes con muy baja latencia. Todo esto basado en un concepto simple: el patrón publicador/suscriptor.

Antes de entrar en más detalle, resumamos las características principales de Apache Kafka:

  • Baja latencia
  • Escalabilidad
  • Alta disponibilidad
  • Durabilidad

A muy alto nivel, Kafka es un sistema distribuido que puede tener un cluster de uno o más servidores (que pueden ser brokers o nodos de kafka connect) y clientes (productores/consumidores). Los productores envían mensajes sobre un tema (topic) a los brokers y los consumidores leen los mensajes de los brokers.

Los mensajes de un tema puede estar distribuidos en varias particiones, y cada partición es un conjunto de brokers. Los consumidores también pueden estar distribuidos, formando grupos de consumidores que en conjunto ven todos los mensajes, pero en los cuales cada nodo sólo ve un subconjunto de ellos.

En un momento dado cada consumidor puede estar leyendo mensajes de una sola partición. Las particiones están ordenadas (orden total). Eso hace que cada consumidor sólo necesite recordar el offset del mensaje que consumió para poder continuar desde esa posición más adelante.

Un ejemplo rápido

Para ejecutar este pequeño ejemplo necesitas docker/docker compose instalado.

Iniciemos con nuestra infraestructura. Tendremos un broker de Kafka, un nodo de Zookeeper (como coordinador), un cluster de Apache Spark con dos ejecutores y un master, un servidor de almacenamiento de objetos (MinIO), y un nodo con JupyterLab, para ejecutar nuestros notebooks.

version: '3'
services:
kafka:
image: confluentinc/cp-kafka
ports:
"9092:9092"
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
depends_on:
zookeeper
zookeeper:
image: confluentinc/cp-zookeeper
environment:
ZOOKEEPER_CLIENT_PORT=2181
ports:
"2181:2181"
spark-executor:
image: spark:3.5.1-scala2.12-java11-ubuntu
environment:
SPARK_MASTER_HOST: spark-master
SPARK_MASTER_PORT: 7077
command: spark-class org.apache.spark.deploy.worker.Worker spark://spark-master:7077
volumes:
./shared_folder:/workspace/data
deploy:
replicas: 2
depends_on:
spark-master
spark-master:
image: spark:3.5.1-scala2.12-java11-ubuntu
environment:
SPARK_MASTER_HOST: spark-master
SPARK_MASTER_PORT: 7077
SPARK_LOCAL_IP: spark-master
command: spark-class org.apache.spark.deploy.master.Master
volumes:
./shared_folder:/workspace/data
spark-notebook:
build:
context: .
dockerfile_inline: |
FROM quay.io/jupyter/pyspark-notebook:spark-3.5.1
#set password for jupyter
RUN echo '{"IdentityProvider": {"hashed_password": "argon2:$$argon2id$$v=19$$m=10240,t=10,p=8$$zUYc32oQmbROa0YxSdntdw$$5hOMyxMMdml9/pM1Jc8A1GNMhi1d3cEEZiBW3KjJhCY"}}' >> /home/jovyan/.jupyter/jupyter_server_config.json && \
chmod 600 /home/jovyan/.jupyter/jupyter_server_config.json
ports:
"4040:4040"
"8888:8888"
"38889:38889"
"7777:7777"
volumes:
./:/home/jovyan/work
minio-server:
image: quay.io/minio/minio
command: server /data –console-address ":9001"
ports:
"9000:9000"
"9001:9001"
environment:
MINIO_ROOT_USER: minio
MINIO_ROOT_PASSWORD: minio2024

Ahora iniciamos la infraestructura usando docker compose up.

Ahora jupyter lab debe estar disponible en http://localhost:8888 y podemos ingresar usando la contraseña configurada `kafka-demo`.

Ahora crearemos un producer para kafka. Existen varias librerías para kafka en python, usualmente la que recomiendo para productores-consumidores simples es `kafka-python`, pero al momento de escribir esta entrada, la versión actual publicada no funciona con versiones recientes de python, así que podemos usar una distribución alternativa kafka-python-ng.

Para crear el productor sólo necesitamos crear un cliente, especificando los brokers (en este caso sólo tenemos uno) y enviar mensajes al tema al que queremos publicar.

Crear un consumidor sigue el mismo patrón, debemos indicar los servidores, el tema y el offset (opcional).

Y por último, para tener un ejemplo un poco más complejo, consumamos los mensajes usando pyspark y almacenemos la salida en s3. Primero crea el bucket test-bucket usando la interfaz de minio que estará disponible en http://localhost:9001 puede usar el usuario minio y la contraseña minio2024 configurada en el docker compose.

Configuramos la sesión de spark, incluyendo las dependencias (spark-sql-kafka para kafka, y hadoop-aws para s3), el endpoint de minio (minio-server:9000) y las credenciales.

¡Importante! debe cambiar la IP del driver por la IP del host.

Creamos nuestro dataframe inicial de spark leyendo desde el topic de kafka, usando structured streaming:

Realizamos las transformaciones necesarias y escribimos a minio:

Este es un proceso de streaming, así que se estará ejecutando cada minuto hasta que lo detengamos (e.g. matando el driver, o usando stop()).

Ahora, queda como tarea al lector experimentar con los diversos componentes (creando nuevos mensajes y temas) y explorar Spark Structured Streaming. Los recursos utilizados en esta entrada están disponibles como un gist en github.

Apache Kafka log

Big Data es un accidente

Entrada publicada originalmente en el blog SIS-Temas del departamento de ingeniería de Sistemas y Computación de la universidad de los andes, en 30 de Julio de 2015. 1

Big Data por sí mismo no es un objetivo, la alineación con la estrategia de la empresa es clave para el éxito.

La cantidad de información que generamos, en diferentes formatos, crece de manera acelerada. Generamos datos cuando interactuamos con nuestro entorno, por ejemplo, cada vez que hacemos una compra en un supermercado, una reserva de un vuelo, solicitamos o asistimos a una cita médica; cada vez son más frecuentes los sensores que monitorean desde nuestra ubicación hasta nuestro ritmo cardiaco; en la web no sólo generamos contenidos de forma explícita, una gran cantidad de datos es generada a partir de nuestras interacciones. Esto es sólo la punta del Iceberg.

El obtener conocimiento a partir de los datos ya no es una ventaja competitiva, es un requerimiento para sobrevivir en un mundo en el que cada vez más las decisiones son guiadas por ellos.

El término Big Data fue acuñado para referirse a conjuntos de datos que por su volumen, variedad y velocidad de generación son inadecuados para los sistemas manejadores de bases de datos y aplicaciones de procesamiento de datos tradicionales. Es una definición accidental. Este término actualmente es utilizado para referirse al ecosistema tecnológico formado alrededor de estos datos.

El hype de Big Data ha sido notorio en los últimos años. Apareció por primera vez en el ciclo de hype para tecnologías emergentes de Gartner para el 2011, en el 2013 alcanzó el pico de expectativas infladas y en el último reporte, revelado en agosto de 2014, empezó lentamente su caída de este pico.

1 – HYPE CYCLE FOR EMERGING TECHNOLOGIES, 2014 (GARTNER, JULIO DE 2014)

Con la presencia que ha tenido este término en los medios y los casos de éxito que han sido publicitados, muchas empresas han empezado a ver Big Data como algo en lo que deberían trabajar. Es común ver proyectos iniciados para usar herramientas para procesar grandes cantidades de datos sin tener un objetivo claro, alineado con la estrategia de la organización. Esto es un despropósito, Big Data no es un objetivo por sí mismo y, en mi opinión, es esta equivocación lo que lleva a la desilusión en muchos casos. Lo importante no son las herramientas, ni los datas, sino qué se logra con ellos.

Algunos autores añaden a las 3 V de la definición de Big Data, una cuarta: Valor. Todos los datos tienen un valor intrínseco, pero debemos descubrirlo. Cuando los proyectos de Big Data y Data Analytics están alineados con los objetivos estratégicos de la empresa, pueden tener un gran retorno sobre la inversión.

Analizando diferentes casos de éxito se encuentran factores comunes:

  • Capital humano: Las iniciativas de “ciencia de datos” requieren equipos en los que personas con diferentes roles interactúan para alcanzar el objetivo. Uno de esos roles es el de Data Business Person, que tiene un alto conocimiento del dominio, de la organización y de las necesidades estratégicas. Empoderar a los actuales empleados para hacer un uso efectivo de los datos puede ser la forma más indicada de llenar este rol, posiblemente nadie conoce mejor a la organización, el dominio y los datos que quienes hacen parte de ella. Programas de capacitación (en especial en estadística, analítica visual y cómo hacer preguntas), herramientas que les permitan interactuar fácilmente con los datos, y un proceso que les permita ser escuchados, son pasos clave en este aspecto. La idea es tener expertos en hacer preguntas de negocio en toda la organización.
  • Centros de excelencia: Un centro de excelencia en Big Data y análisis de datos que provea capacitación, mejores prácticas, herramientas y soporte a toda la organización. Debe tener capacidad de toma de decisiones, ser independiente del departamento de tecnología. El centro de excelencia debe liderar las iniciativas a nivel estratégico, estar directamente bajo el CEO o el director estratégico le da una posición privilegiada para esto.
  • Victorias tempranas y proyectos estratégicos: Se debe plantear la estrategia de la organización, pero se debe iniciar con proyectos puntuales en un área, que permitan tener aprendizajes y victorias tempranas que incentiven a los diferentes departamentos.
  • No temer equivocarse: Es un proceso de aprendizaje y los proyectos fallarán. Como en todo proceso de innovación lo importante es fallar rápido, con un costo bajo, iterar y nunca dejar de intentarlo. (“Fail fast and cheap. Fail often. Fail in a way that doesn’t kill you.” Seth Godin)
  • Actitud crítica frente a los datos: Cualquier afirmación puede ser soportada con datos, nuestro cerebro es susceptible en especial a encontrar falsas correlaciones y a ignorar datos que nos contradicen (confirmation bias), por lo que debemos tener actitud crítica frente a ellos. Un equipo multidisciplinar, con conocimientos de estadística y una actitud crítica frente a los datos, puede evitarnos grandes equivocaciones.

Dos factores claves para el éxito de los proyectos que buscan poner los datos al servicio de la organización son la habilidad para realizar las preguntas correctas (lo que requiere alto conocimiento del dominio) y cómo, y qué tan rápido, se obtienen e interpretan los datos. Es importante recalcar que las herramientas nunca reemplazarán el conocimiento del dominio.

El empezar un proyecto de Big Data, sólo porque todos los demás lo hacen, sin entender el impacto que tendrá en los objetivos de la organización o sin el capital humano adecuado, no sólo es inútil sino que puede ser contraproducente.

Debemos ir más allá del hype. En un mercado global, en el que cada vez más decisiones son tomadas basadas en los datos, el análisis de grandes cantidades de información se ha convertido en una necesidad y debe ser considerado a nivel estratégico en la organización.

  1. https://web.archive.org/web/20180320023608/https://sis-temas.uniandes.edu.co/big-data-es-un-accidente/ ↩︎