El negocio actual requiere datos precisos y oportunos para poder tomar decisiones. En todas las empresas se encuentran aplicaciones basadas en datos y paneles de control creados a partir de datos de series temporales. Una gran cantidad de datos comerciales son series temporales: desde métricas de sistemas y aplicaciones hasta el clima, los precios de las acciones, la telemetría de redes y los sensores de IoT, todos dependen de análisis y visualización de series temporales complejas para proporcionar información empresarial.
Hay más de unas pocas bases de datos creadas para este tipo de análisis, como Clickhouse (para obtener más información sobre Clickhouse y MinIO, consulte Integración de ClickHouse con MinIO ), Snowflake, TimeStream y RedShift de Amazon y Apache Druid. Un flujo de trabajo típico implica recopilar datos, probablemente transmitirlos en tiempo real o extraerlos de un lago de datos, transformarlos e ingerirlos en una base de datos y luego crear aplicaciones y paneles utilizando consultas SQL que se ejecutan en la base de datos.
Esta publicación de blog se centra en Apache Druid , específicamente en cómo ejecutar Druid con MinIO como almacenamiento profundo. Entraremos en más detalles más adelante, pero en resumen, Druid guarda datos en el almacenamiento profundo S3 y los intercambia dentro y fuera de la memoria local según sea necesario al ejecutar consultas. Instalaremos MinIO, instalaremos Druid, editaremos algunos archivos de configuración para indicarle a Druid que use MinIO y luego importaremos datos de demostración y los visualizaremos usando Apache Superset .
Prepárese para sorprenderse de lo rápido que puede crear una pila de visualización y análisis de alto rendimiento con productos de código abierto.
Druid es uno de los almacenes de datos más rápidos que existen: fue creado para combinar las ventajas de los almacenes de datos, las bases de datos de series temporales y los sistemas de búsqueda. Druid logra respuestas a consultas tremendamente rápidas al combinar las características clave de estos tres sistemas en su capa de ingesta, formato de almacenamiento, capa de consulta y arquitectura central. Druid normalmente se implementa con otras tecnologías de código abierto como Apache Kafka, Apache Flink y se ubica entre una capa de almacenamiento o procesamiento y el usuario final, sirviendo como una capa de consulta para cargas de trabajo analíticas. Para obtener más información sobre cómo funciona Druid, consulte Apache Druid 101 .
Druid es nativo de la nube y se basa en una arquitectura basada en microservicios. Cada servicio principal de Druid (ingestión, consulta, coordinación) se puede implementar y escalar de forma independiente en contenedores o en hardware básico. Además, los servicios de Druid pueden fallar y reiniciarse o actualizarse de forma independiente sin afectar a otros servicios.
Druida tiene varios tipos de procesos:
Los procesos coordinadores gestionan la disponibilidad de datos en el clúster.
Los procesos de Overlord controlan la asignación de cargas de trabajo de ingesta de datos.
Los procesos de intermediario manejan consultas de clientes externos.
Los procesos de enrutador son opcionales; dirigen solicitudes a corredores, coordinadores y señores supremos.
Los procesos históricos almacenan datos consultables.
MiddleManager procesa datos de ingesta.
Estos procesos normalmente se implementan en grupos en tres tipos de servidores o nodos diferentes:
Druid tiene tres dependencias externas principales: almacenamiento profundo, almacenamiento de metadatos y ZooKeeper. Brevemente, los metadatos se utilizan para rastrear el uso del segmento y la información de las tareas, y generalmente son manejados por PostgreSQL o MySQL. Zookeeper se utiliza para el descubrimiento y la coordinación de servicios internos.
Como este es el blog de MinIO, nos centraremos en el almacenamiento profundo. El almacenamiento profundo es un sistema de archivos compartido al que pueden acceder todos los servidores Druid donde se almacenan los datos después de su ingesta. En una implementación de un solo servidor, esto es simplemente una unidad local. En implementaciones en clúster, el almacenamiento profundo tomaría la forma de un almacén de objetos distribuidos como S3 o MinIO, HDFS o un sistema de archivos montado en red.
El almacenamiento profundo es la forma en que Druid transfiere datos entre procesos y realiza copias de seguridad de los datos. Druid almacena datos en archivos llamados segmentos. Hay un mapeo interno que extrae segmentos del almacenamiento profundo para almacenarlos en caché en unidades locales y en la memoria. Para minimizar la latencia, las consultas se ejecutan en segmentos localmente, no en segmentos almacenados en almacenamiento profundo. El almacenamiento profundo permite el diseño elástico y tolerante a fallas de Druid. Druid proporciona durabilidad al arrancar desde el almacenamiento profundo en caso de que un nodo de datos caiga y vuelva a funcionar. Una advertencia es que necesitarás suficiente espacio libre en los nodos de datos y en el almacenamiento profundo para los datos con los que deseas trabajar en Druid.
Druid utiliza la API S3 para el almacenamiento de objetos para almacenamiento profundo. El uso de almacenamiento de objetos compatible con API de S3, como MinIO, le brinda la libertad de ejecutar Druid en cualquier lugar, algo que quizás desee hacer para mejorar el rendimiento y la seguridad. MinIO es un excelente almacenamiento profundo para Druid porque tiene una excelente compatibilidad con S3, el rendimiento para cumplir con los requisitos de OLAP en tiempo real y, quizás sobre todo, la capacidad de ofrecer rendimiento a escala. MinIO también proporciona la protección de datos necesaria y la gestión del ciclo de vida .
Puede ejecutar Druid, MinIO y Superset directamente en Linux o en contenedores en Docker o Kubernetes. Ya existen excelentes recursos que le muestran cómo poner en funcionamiento Druid, así que si por alguna razón esta publicación de blog no le satisface, consulte Apache Druid Quickstart para Linux, Docker · Apache Druid para Docker y Clustered Apache . Druid® en tu computadora portátil para Kubernetes.
Si aún no estás ejecutando MinIO, aquí tienes las instrucciones de instalación . El proceso se describe detalladamente en La Guía de inicio rápido de MinIO .
En Linux, por ejemplo, descargue MinIO y ejecútelo (siéntase libre de cambiar la contraseña de root y recuérdela):
wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
Inicie un navegador y conéctese al servidor MinIO en http://<your-IP-address>:9000
usando el usuario root y la contraseña que configuró anteriormente.
La primera vez que inicie sesión, accederá a la página Depósitos.
Crea el cubo druidbucket
.
En el mundo real, probablemente querrás asegurar el acceso a tus datos de Druida, pero no tenemos que hacerlo en nuestro laboratorio. Usted crearía una cuenta de servicio (en el menú Identidad), editaría la política de usuario para permitir solo el acceso a druidbucket
y en la configuración de Druid a continuación usaría la clave de acceso y la clave secreta de la cuenta de servicio.
La forma más sencilla de probar Druid es a través de Docker. Siga las instrucciones de Docker · Apache Druid y utilice este docker-compose.yaml . Esto crea un contenedor para cada servicio Druid, así como para Zookeeper y PostgresSQL. Este método utiliza un archivo de entorno para especificar la configuración de Druid. Descargue este archivo donde guardó los contenedores de Druid. Para las instrucciones a continuación (Configurar Druid para MinIO), puede editar el archivo de entorno para pasar las variables a los archivos de configuración estándar de Druid o editar los archivos de configuración directamente dentro del contenedor.
Inicie Druid con docker-compose up
. Una vez que aparezca el clúster, abra un navegador y navegue hasta http://localhost:8888
para usar la consola Druid.
Ahora es el momento de configurar Druid para usar MinIO para almacenamiento profundo. En este paso, deberá editar los archivos de configuración de Druid (o los archivos del entorno Docker como se describe anteriormente) para hacer referencia a MinIO y luego reiniciar Druid. El proceso se describe completamente en Cómo configurar Druid para usar Minio como almacenamiento profundo: DZone Big Data e incluimos una versión abreviada aquí para referencia rápida.
Dependiendo de cómo haya instalado Druid, en el archivo conf/druid/_common/common.runtime.properties
, agregue "druid-s3-extensions"
a druid.extensions.loadList
. Agregue extensiones por nombre, entre comillas y separadas por coma, por ejemplo:
druid.extensions.loadList=["druid-parser-route", "druid-s3-extensions"]
Según el artículo mencionado anteriormente, la extensión S3 para almacenamiento profundo se basa en jets3t debajo del capó. Debe crear un archivo jets3t.properties
en la ruta de clases. Para este ejemplo, crearemos un nuevo jets3t.properties
dentro del directorio conf/druid/_common
con lo siguiente:
s3service.s3-endpoint=localhost s3service.s3-endpoint-http-port=9000 s3service.disable-dns-buckets=true s3service.https-only=false
Ahora, comente las configuraciones para el almacenamiento local en la sección "Almacenamiento profundo" y agregue los valores apropiados para Minio. En mi caso, estoy ejecutando MinIO en la misma máquina que Druid, por lo que la URL del punto final de S3 incluye localhost y un puerto. Si está ejecutando en otra máquina o en un contenedor, deberá cambiar esta línea para abordar MinIO en su entorno.
Después de esto, la sección "Almacenamiento profundo" debería verse así:
# # Deep storage # # For local disk (only viable in a cluster if this is a network mount): # druid.storage.type=local # druid.storage.storageDirectory=var/druid/segments # For HDFS: # druid.storage.type=hdfs # druid.storage.storageDirectory=/druid/segments # For S3: druid.storage.type=s3 druid.storage.bucket=druidbucket druid.storage.baseKey=druid/segments druid.s3.accessKey= <insert your MinIO accessKey> druid.s3.secretKey= <insert your MinIO secretKey> druid.s3.protocol=http druid.s3.enabePathStyleAccess=true druid.s3.endpoint.signingRegion=us-east-1 druid.s3.endpoint.url=http://localhost:9000/
También configuraremos Druid para almacenar registros del servicio de indexación en Minio. Es una buena práctica almacenar todo en un solo lugar para que sea más fácil de encontrar: Druid es lo suficientemente complicado como para tener que buscar registros en varias ubicaciones. Actualice la sección "Registros de servicio de indexación" con los valores apropiados en conf/druid/_common/common.runtime.properties
.
Después de esto, la sección "Registros del servicio de indexación" debería verse así:
# Indexing service logs # For local disk (only viable in a cluster if this is a network mount): # druid.indexer.logs.type=file # druid.indexer.logs.directory=var/druid/indexing-logs # For HDFS: # druid.indexer.logs.type=hdfs # druid.indexer.logs.directory=/druid/indexing-logs # For S3: druid.indexer.logs.type=s3 druid.indexer.logs.s3Bucket=druidbucket druid.indexer.logs.s3Prefix=druid/indexing-logs
¡DE ACUERDO! Eso cubre todos los cambios de configuración que se deben realizar en Druid. Guarde el archivo y reinicie su clúster. Mientras trabaja con Druid, verá segmentos e índices escritos en druidbucket
.
Apache Superset es una poderosa herramienta de visualización que se usa frecuentemente con Druid. Superset es una aplicación de inteligencia empresarial nativa de la nube que es rápida, liviana, repleta de funciones y, lo mejor de todo, ¡es gratuita! La interfaz intuitiva de Superset hace que la creación de paneles interactivos sea relativamente fácil. Superset proporciona soporte listo para usar para la mayoría de las bases de datos SQL. Superset se integra con servidores de autenticación como la base de datos, OpenID, LDAP y OAuth para proteger las visualizaciones.
Como software nativo de la nube, Superset es altamente escalable y altamente disponible. Fue diseñado para escalar a entornos grandes y distribuidos.
Estamos más interesados en comenzar con Superset que en escalarlo en producción, por lo que haremos la instalación más simple que podamos usando Docker Compose . Esta es la forma más rápida de probar Superset en Linux o Mac OSX.
Si aún no tiene Docker instalado, siga las instrucciones de Docker . Una vez que haya instalado Docker, instale Docker Compose .
Abra una ventana de terminal y clone el repositorio de Superset:
$ git clone https://github.com/apache/superset.git
Esto creará una carpeta superconjunto en su directorio actual. Navegue hasta ese directorio y ejecute los siguientes comandos (que pueden tardar varios minutos en completarse):
$ docker-compose -f docker-compose-non-dev.yml pull $ docker-compose -f docker-compose-non-dev.yml up
Verás pasar una gran cantidad de texto de inicialización en tu terminal. Superset estará listo una vez que veas algo como esto:
superset_app | Loaded your LOCAL configuration at [/app/docker/pythonpath_dev/superset_config.py] superset_app | 127.0.0.1 - - [12/May/2022:23:59:35 +0000] "GET /health HTTP/1.1" 200 2 "-" "curl/7.74.0"
Abra un navegador y navegue hasta http://localhost:8088
para acceder a Superset. Inicie sesión con el nombre de usuario predeterminado "admin" y la contraseña "admin".
Después de iniciar sesión en Superset, debes conectarlo a Druid. En la parte superior derecha, haga clic en "+" para agregar una base de datos.
En la lista desplegable, seleccione Apache Druid. Luego, asigne un nombre a la conexión e ingrese lo siguiente en SQLALCHEMY URI, asegurándose de actualizar la dirección IP o reemplazarla con localhost según sea necesario. Si hubiéramos protegido la API de Druid requiriendo autenticación, también ingresaríamos un nombre de usuario y contraseña.
druid://10.0.0.10:8888/druid/v2/sql
Pruebe la conexión para asegurarse de que funciona y luego haga clic en Finalizar.
¡Guau! Ahora tienes Druid, MinIO y Superset ejecutándose en tu entorno.
Con el triunvirato de Druid, SuperSet y MinIO, podemos tener una visión completa y oportuna de los datos en tiempo real. Existen numerosas organizaciones que han creado aplicaciones de manejo de datos a escala web sobre esta combinación para análisis de flujo de clics (análisis web y móvil), análisis de riesgo/fraude, análisis de telemetría de red (monitoreo del rendimiento de la red), análisis de la cadena de suministro (métricas de fabricación). y métricas de rendimiento de aplicaciones.
Esta pila de visualización y análisis nativa de la nube es flexible y extensible, además de escalable y eficaz para que pueda crear aplicaciones que deleiten a sus usuarios. Bríndeles el poder de monitorear, analizar y visualizar datos en tiempo real. Permítales dividir, filtrar y agrupar por cualquier combinación de columnas para que puedan tomar decisiones concluyentes basadas en datos y orientadas a la acción al ritmo que exige el negocio.
Para demostrar un poco de la funcionalidad que hemos creado, cargaremos un archivo de datos del tutorial de las ediciones de Wikipedia a lo largo del tiempo en Druid y luego visualizaremos las ediciones en SuperSet. Recuerde, esto está respaldado por MinIO como almacenamiento profundo. Las ediciones de Wikipedia se tratan con más detalle en Inicio rápido · Apache Druid .
Druid carga datos enviando una especificación de tarea de ingesta en JSON al servidor Overlord. Puede crear una especificación de ingesta mediante la GUI web o escribirla usted mismo y programarla. Una vez que cree y ajuste una especificación de ingesta, puede reutilizar el JSON para no tener que repetir la tarea. En producción, los equipos frecuentemente programan y automatizan la ingesta.
Abra un navegador y cargue la interfaz web de Druid en http://localhost:8888 .
En la parte superior de la ventana, haga clic en Cargar datos. Desde aquí, seleccione Datos de ejemplo, luego seleccione Ediciones de Wikipedia en el menú desplegable de la derecha y haga clic en el botón azul Cargar ejemplo.
La GUI web lo guía en la creación de una especificación de ingesta que leerá datos de una fuente y los almacenará en segmentos en almacenamiento profundo. La ingesta se basa en una marca de tiempo que se utiliza para particionar y ordenar datos, mientras que los datos se almacenan como columnas de dimensiones y métricas. Para obtener más información sobre cómo optimizar el rendimiento en la ingesta, consulte Modelado de datos y rendimiento de consultas en Apache Druid .
Con los datos del tutorial, simplemente haremos clic en el flujo de trabajo de ingesta aceptando los valores predeterminados, o haremos clic en Editar especificación JSON y luego haremos clic en Enviar. Si quisiera (o necesitara), podría mirar el archivo sin formato como JSON y analizarlo. Druid crea su propia columna de tiempo llamada __time
para organizar y segmentar datos. Debido a que el tiempo es tan importante para Druid, es muy bueno para descubrir cómo manejar las marcas de tiempo independientemente de su formato. Además, podemos transformar datos y optimizar el rendimiento de las consultas particionando datos y dimensionando segmentos. Finalmente, puede ajustar el trabajo de ingesta en términos de subprocesos y utilización de memoria, luego programarlo y ejecutarlo.
La GUI le envía a ver Tareas:
Este es un trabajo de ingestión muy pequeño por lo que finaliza casi de inmediato.
Desde aquí, puede ejecutar consultas sobre los datos en Druid y obtener respuestas ultrarrápidas. Puede ejecutar consultas a través de la GUI web o la API. Druid se encuentra detrás de muchos paneles debido a su capacidad para proporcionar un excelente rendimiento de consultas sobre cantidades masivas de datos a escala.
Regrese al navegador donde inició sesión en Superset y una vez más haga clic en "+" en la parte superior derecha de la pantalla de inicio. Luego haga clic en Gráfico.
Podríamos ejecutar consultas SQL individuales en la parte inferior de la pantalla. Los paneles son grupos de consultas individuales. Las respuestas a consultas repetitivas se almacenan en caché en Superset para mejorar el rendimiento.
Seleccione el conjunto de datos druid.wikipedia
y luego seleccione una visualización. Superset incluye varias visualizaciones de series temporales. Elegiremos Gráfico de series temporales y luego haremos clic en Nuevo gráfico.
Al principio no verás ningún resultado, pero no te dejes engañar. Primero, elimine el rango de tiempo configurándolo en "sin filtro". El Time Grain está demasiado alto en “día”, así que cámbielo a “5 minutos”. Ahora estamos viendo un gráfico de la cantidad de ediciones de Wikipedia que ocurren en ventanas de 5 minutos en nuestros datos de muestra.
Puede filtrar y agrupar resultados utilizando Superset. Para guardar el gráfico, haga clic en Guardar en la parte superior de la pantalla, luego asigne un nombre al gráfico y guárdelo.
A estas alturas ya ha aprendido los pasos básicos para instalar Druid y MinIO, ingerir su primer conjunto de datos y generar su primer gráfico Superset. Un siguiente paso útil podría ser aprender más sobre la exploración de datos en superconjunto .
En esta publicación de blog, presentamos un grupo de aplicaciones nativas de la nube: Apache Druid para análisis, Apache Superset para visualización y MinIO para almacenamiento profundo S3. Esta sencilla demostración es el comienzo de la creación de una pila de visualización y análisis nativa de la nube, y se puede ampliar con Apache Spark para ML o Jupyter para ciencia de datos.
Gracias por leer esta demostración. Si tiene alguna pregunta, envíenos un correo electrónico a [email protected] o únase al canal MinIO slack y pregunte.
También publicado aquí .