Introducción

Apache Druid es un sistema de gestión de datos de código abierto diseñado para explorar, analizar y visualizar grandes volúmenes de datos en tiempo real. Druid se centra en proporcionar bajos tiempos de respuesta y capacidades de consulta analítica en tiempo real, lo que lo hace adecuado para casos de uso como paneles de control interactivos, análisis de series temporales y monitoreo de eventos en tiempo real.

En términos de arquitectura, Apache Druid está diseñado como un almacén de datos distribuido y escalable que puede manejar grandes cantidades de datos en tiempo real y proporcionar consultas analíticas de manera eficiente.

Respecto a la relación con Apache Kafka, ambas tecnologías son complementarias y se utilizan a menudo juntas en arquitecturas de procesamiento de datos en tiempo real. Apache Kafka es un sistema de transmisión de eventos que permite la ingestión y transmisión de datos en tiempo real a través de un sistema de mensajes distribuido. Druid puede conectarse a Kafka para consumir datos en tiempo real desde los flujos de eventos generados por Kafka y almacenarlos de manera eficiente para análisis y consulta.

En cuanto al teorema CAP (Consistency, Availability, Partition Tolerance), Druid se clasifica como un sistema CP (Consistency-Partition Tolerance), ya que prioriza la coherencia de los datos y la tolerancia a particiones, incluso a expensas de la disponibilidad inmediata en ciertos casos. La elección de la consistencia y la tolerancia a particiones sobre la disponibilidad hace que Druid sea más adecuado para escenarios en los que la integridad de los datos y la capacidad de manejar particiones de red o fallos son críticas. Implica que es un sistema distribuido robusto, no se caerá del todo incluso si hay fallos en algún nodo.

Pregunta 1

Druid va a consumir datos desde los topics kafka básicamente, tan pronto como lleguen al topic. Que tipo de entrega soporta? at most-once, at least-once, exactly-once?

Respuesta 1

Apache Druid puede consumir datos desde Kafka, y el tipo de entrega de eventos desde Kafka depende de cómo se configure la integración entre ambos sistemas.

En términos de garantías de entrega, Apache Kafka proporciona tres configuraciones principales:

  1. At Most Once (Al Máximo Una Vez): En este modo, Kafka no garantiza la entrega de eventos, lo que significa que los eventos pueden perderse en situaciones extremas, como fallos de red o caídas del consumidor. Este enfoque prioriza la baja latencia sobre la garantía de entrega.
  2. At Least Once (Al Menos Una Vez): En este modo, Kafka garantiza que los eventos se entreguen al menos una vez, pero puede haber duplicados. Esto se logra mediante la confirmación del evento después de recibirlo, pero antes de procesarlo completamente. Si hay un fallo después de la confirmación pero antes de que el consumidor complete el procesamiento, puede haber duplicados.
  3. Exactly Once (Exactamente Una Vez): Este es el nivel más alto de garantía y asegura que los eventos se entreguen exactamente una vez, sin pérdidas ni duplicados. Lograr la entrega «exactamente una vez» implica la coordinación entre productores y consumidores y generalmente implica el uso de identificadores únicos y transacciones.

La capacidad de Druid para lograr un procesamiento «exactamente una vez» dependerá de la configuración específica y de cómo se maneje la integración entre Druid y Kafka. Druid puede implementarse para manejar datos de manera segura y garantizar la consistencia de los datos, pero también dependerá de cómo se configure y opere la infraestructura completa. Es importante revisar la documentación específica y las configuraciones de ambas tecnologías para garantizar la consistencia y la tolerancia a fallos según los requisitos específicos del caso de uso.

Pregunta 2

Entonces, soporta las tres maneras? At least once y exactly once requieren desactivar el autocommit en el lado del consumidor, es decir, en el lado de Apache Druid y hacer commit de manera programática. Apache Druid provee una api para poder indicar a Kafka que haga un commitSync o commitAsync?

Respuesta 2

Apache Druid no proporciona una API directa para realizar commitSync o commitAsync directamente con Kafka. La gestión de la confirmación (commit) en el consumidor de Kafka generalmente se realiza utilizando la configuración adecuada en el consumidor de Kafka.

Cuando se trabaja con Apache Druid y Kafka, la configuración de Kafka y cómo se manejan las confirmaciones en el consumidor de Kafka afectarán las garantías de entrega en términos de «At Least Once» o «Exactly Once». Para lograr «Exactly Once» con Kafka, típicamente se requiere coordinación y uso de identificadores únicos para asegurar que los eventos no se procesen más de una vez.

En el caso de «At Least Once», donde se acepta la posibilidad de duplicados, la configuración predeterminada de commit automático puede ser suficiente en muchos casos.

Pregunta 3

Si Druid no provee de una api, como interactua con Kafka?

Respuesta 3

La integración entre Apache Druid y Apache Kafka generalmente se realiza a través de la extensión Kafka Indexing Service. El Kafka Indexing Service es un módulo específico de Apache Druid diseñado para consumir eventos desde Apache Kafka y cargarlos en el almacenamiento de Apache Druid para su análisis en tiempo real.

A grandes rasgos, el proceso de integración suele seguir estos pasos:

  1. Configuración de Kafka: Se configura un tema (topic) en Kafka desde el cual Druid consumirá los eventos en tiempo real. Además, se definen las propiedades necesarias para la conexión a Kafka.
  2. Configuración de Kafka Indexing Service en Druid: Se configura el servicio de indexación de Kafka en el lado de Druid para que pueda consumir datos desde el tema de Kafka especificado. Esto incluye detalles como la dirección de Kafka, el grupo de consumidores, el formato de datos, entre otros.
  3. Ingesta y Procesamiento en Druid: El Kafka Indexing Service consume los eventos de Kafka y los ingiere en el almacenamiento de Druid. Druid procesa y organiza estos eventos de manera eficiente para consultas analíticas en tiempo real.

En este proceso, la interacción directa con Kafka y la gestión de confirmaciones (commit) generalmente son manejadas por el propio Kafka Indexing Service en lugar de por Druid directamente. El Kafka Indexing Service se encarga de la administración de offsets, commit de offset y otras interacciones con Kafka.

Es importante tener en cuenta que, aunque Druid no proporciona una API específica para commitSync o commitAsync directamente con Kafka, la configuración del servicio de indexación Kafka en Druid y la configuración correspondiente en Kafka pueden ajustarse para satisfacer los requisitos específicos de garantías de entrega según el caso de uso.

Pregunta 4

Druid es un sistema distribuido que se puede poner en alta disponibilidad? es básicamente un conector que se conecta a un topic kafka para luego guardar lo más rápido posible dicha información en un sistema de ficheros con un esquema optimizado para escrituras y lecturas muy rápidas, no? puedo usar ansi sql para leer esos datos? puedo conectar Druid con un dashboard?

Respuesta 4

Sí, Apache Druid es un sistema distribuido que puede configurarse para lograr alta disponibilidad y escalabilidad horizontal. La arquitectura distribuida de Druid permite implementar clústeres para manejar grandes volúmenes de datos y asegurar la disponibilidad del servicio.

En cuanto a la funcionalidad principal, Druid es más que simplemente un conector para Kafka. Es un sistema de gestión de datos que permite la ingestión, el almacenamiento y el análisis de datos en tiempo real. Druid es particularmente eficaz para casos de uso que requieren consultas analíticas interactivas y exploración de datos en tiempo real.

El flujo típico en una arquitectura que utiliza Druid con Kafka puede ser el siguiente:

Ingestión de datos en tiempo real desde Kafka mediante el módulo Kafka Indexing Service.
Almacenamiento eficiente en el sistema de almacenamiento columnar de Druid optimizado para consultas analíticas en tiempo real.
Consulta y análisis de datos mediante consultas SQL o mediante la API de consulta de Druid.
En Druid, puedes utilizar SQL para realizar consultas sobre los datos almacenados. Druid soporta un dialecto SQL llamado SQL de Druid, que es un subconjunto de ANSI SQL con extensiones específicas de Druid. Puedes realizar consultas ad-hoc para analizar y visualizar datos de manera interactiva.

Además, Druid se integra con varios dashboards y herramientas de visualización, como Apache Superset, Tableau, Metabase, entre otros. Esto facilita la creación de paneles interactivos y visualizaciones basadas en los datos almacenados en Druid.

En resumen, Apache Druid es más que un simple conector para Kafka. Es un sistema de gestión de datos en tiempo real distribuido que puede proporcionar alta disponibilidad, escalabilidad y capacidades analíticas eficientes. Puedes utilizar SQL para consultas, conectarlo a dashboards y aprovechar su rendimiento para casos de uso que requieran análisis en tiempo real.

Pregunta 5

Entonces, hay una api programatica para Apache Druid?

Respuesta 5

Sí, Apache Druid proporciona una API programática que permite interactuar con el sistema para realizar diversas operaciones, como la ingestión de datos, la ejecución de consultas y la administración del clúster. A continuación, te proporcionaré un resumen de algunas de las API clave en Apache Druid:

  1. Ingestión de datos:
  • La API de Ingestión permite enviar datos a Druid. Puedes enviar datos mediante solicitudes HTTP POST o utilizando herramientas como Tranquility o el Kafka Indexing Service.
  1. Consulta de datos:
  • La API de Consulta de Druid permite realizar consultas analíticas sobre los datos almacenados en Druid. Puedes enviar consultas mediante solicitudes HTTP POST y recibir resultados en formato JSON.
  1. Administración del clúster:
  • La API de Druid también incluye endpoints para administrar y monitorear el clúster, como obtener información sobre nodos, segmentos, métricas del sistema, entre otros.

Estas API proporcionan una interfaz programática para interactuar con Apache Druid y son fundamentales para la integración de Druid en diferentes aplicaciones y sistemas. Pueden ser utilizadas desde scripts, aplicaciones o herramientas de terceros para automatizar tareas, gestionar la ingestión de datos y realizar consultas analíticas.

Es importante tener en cuenta que la documentación oficial de Apache Druid es una fuente valiosa para obtener detalles específicos sobre cómo utilizar y aprovechar estas API en diferentes escenarios. La implementación exacta de estas API puede variar según la versión específica de Apache Druid que estés utilizando, por lo que siempre es recomendable consultar la documentación correspondiente a la versión que estás utilizando.

Pregunta 6

Es exclusivamente una api http? permite https?, tiene control de acceso mediante ACLS?

Respuesta 6

Apache Druid expone su funcionalidad principalmente a través de API HTTP. Por lo tanto, las operaciones como la ingestión de datos, las consultas y la administración del clúster se realizan a través de solicitudes HTTP.

En cuanto a la seguridad y control de acceso:

  1. HTTPS (TLS/SSL): Apache Druid admite conexiones seguras a través de HTTPS. Puedes configurar Druid para utilizar TLS/SSL para cifrar las comunicaciones entre los clientes y los nodos de Druid, proporcionando así una capa adicional de seguridad.
  2. Control de Acceso (ACLs): Druid incluye mecanismos de seguridad para controlar el acceso a sus API y recursos. Puedes configurar reglas de control de acceso (ACLs) para especificar qué usuarios o roles tienen permisos para realizar ciertas operaciones. Esto permite gestionar la autenticación y la autorización en el sistema.

Para habilitar la seguridad y configurar el control de acceso, generalmente necesitarás configurar el archivo de configuración de seguridad de Druid. Este archivo puede incluir configuraciones relacionadas con la autenticación, autorización, cifrado y otras medidas de seguridad.

Pregunta 7

Al turrón, como pruebo esta historia?

Respuesta 7

Lo más sencillo para probar es tirando de Docker, docker-compose lo mejor. Vas al sitio web oficial, te descargas dos ficheros, un docker-compose.yml y un fichero environment, los dejas en un directorio, lanzas docker-compose up y al cabo de un ratito, si despues de lanzar docker-compose up -d ves lo siguiente:

┌<▸> ~/g/I/Kafka-Druid
└➤
docker-compose up

[+] Running 70/48
 ✔ broker Pulled                                                                                                                                                                  214.3s
 ✔ historical Pulled                                                                                                                                                              214.3s
 ✔ coordinator Pulled                                                                                                                                                             214.3s
 ✔ postgres 14 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                                                                      73.1s
 ✔ router 41 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                                            214.3s
 ✔ zookeeper 8 layers [⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                                                                            38.9s
 ✔ middlemanager Pulled                                                                                                                                 
[+] Building 0.0s (0/0)                                                                                                                                             docker:desktop-linux
[+] Running 14/14
 ✔ Volume "kafka-druid_coordinator_var"  Created                                                                                                                                    0.0s
 ✔ Volume "kafka-druid_broker_var"       Created                                                                                                                                    0.0s
 ✔ Volume "kafka-druid_druid_shared"     Created                                                                                                                                    0.0s
 ✔ Volume "kafka-druid_historical_var"   Created                                                                                                                                    0.0s
 ✔ Volume "kafka-druid_middle_var"       Created                                                                                                                                    0.0s
 ✔ Volume "kafka-druid_router_var"       Created                                                                                                                                    0.0s
 ✔ Volume "kafka-druid_metadata_data"    Created                                                                                                                                    0.0s
 ✔ Container postgres                    Created                                                                                                                                    0.1s
 ✔ Container zookeeper                   Created                                                                                                                                    0.1s
 ✔ Container coordinator                 Created                                                                                                                                    0.0s
 ✔ Container broker                      Created                                                                                                                                    0.1s
 ✔ Container historical                  Created                                                                                                                                    0.1s
 ✔ Container middlemanager               Created                                                                                                                                    0.1s
 ✔ Container router                      Created                                                                                                                                    0.1s
Attaching to broker, coordinator, historical, middlemanager, postgres, router, zookeeper
...

El log es brutal, no lo pongo entero, para comprobar si todo va bien, deberías ver algo así:

┌<▸> ~/g/I/Kafka-Druid
└➤
docker-compose ps -a
NAME            IMAGE                 COMMAND                  SERVICE         CREATED              STATUS              PORTS
broker          apache/druid:28.0.1   "/druid.sh broker"       broker          About a minute ago   Up About a minute   0.0.0.0:8082->8082/tcp
coordinator     apache/druid:28.0.1   "/druid.sh coordinat…"   coordinator     About a minute ago   Up About a minute   0.0.0.0:8081->8081/tcp
historical      apache/druid:28.0.1   "/druid.sh historical"   historical      About a minute ago   Up About a minute   0.0.0.0:8083->8083/tcp
middlemanager   apache/druid:28.0.1   "/druid.sh middleMan…"   middlemanager   About a minute ago   Up About a minute   0.0.0.0:8091->8091/tcp, 0.0.0.0:8100-8105->8100-8105/tcp
postgres        postgres:latest       "docker-entrypoint.s…"   postgres        About a minute ago   Up About a minute   0.0.0.0:5432->5432/tcp
router          apache/druid:28.0.1   "/druid.sh router"       router          About a minute ago   Up About a minute   0.0.0.0:8888->8888/tcp
zookeeper       zookeeper:3.5.10      "/docker-entrypoint.…"   zookeeper       About a minute ago   Up About a minute   2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp

Puedes entrar en esta url y verás un dashboard.

Deja un comentario