Os negócios de hoje exigem dados precisos e oportunos para tomar decisões. Aplicativos orientados a dados e painéis baseados em dados de séries temporais são encontrados em todas as empresas. Uma grande quantidade de dados de negócios são séries temporais - desde métricas de sistemas e aplicativos até clima, preços de ações, telemetria de rede, sensores IoT, todos dependem de análise e visualização de séries temporais complexas para fornecer insights de negócios.
Existem mais do que alguns bancos de dados construídos para esse tipo de análise, como Clickhouse (para obter mais informações sobre Clickhouse e MinIO, consulte Integrando ClickHouse com MinIO ), Snowflake, Amazon's TimeStream e RedShift e Apache Druid. Um fluxo de trabalho típico envolve a coleta de dados, provavelmente transmitidos em tempo real ou extraídos de um data lake, transformando-os e ingerindo-os em um banco de dados e, em seguida, criando aplicativos e painéis usando consultas SQL executadas no banco de dados.
Esta postagem do blog se concentra no Apache Druid , especificamente em como executar o Druid com MinIO como armazenamento profundo. Entraremos em mais detalhes posteriormente, mas resumindo, o Druid salva dados no armazenamento profundo S3 e os troca dentro e fora da memória local conforme necessário ao executar consultas. Vamos instalar o MinIO, instalar o Druid, editar alguns arquivos de configuração para dizer ao Druid para usar o MinIO e, em seguida, importar os dados de demonstração e visualizá-los usando Apache Superset .
Prepare-se para se surpreender com a rapidez com que você pode criar uma pilha de análise e visualização de alto desempenho com produtos de código aberto.
Druid é um dos armazenamentos de dados mais rápidos do mercado - foi construído para combinar as vantagens de data warehouses, bancos de dados de séries temporais e sistemas de pesquisa. O Druid obtém respostas de consulta tremendamente rápidas combinando as principais características desses três sistemas em sua camada de ingestão, formato de armazenamento, camada de consulta e arquitetura central. O Druid normalmente é implantado com outras tecnologias de código aberto, como Apache Kafka, Apache Flink, e fica entre uma camada de armazenamento ou processamento e o usuário final, servindo como uma camada de consulta para cargas de trabalho analíticas. Para saber mais sobre como o Druid funciona, consulte Apache Druid 101 .
Druid é nativo da nuvem e depende de uma arquitetura baseada em microsserviços. Cada serviço principal do Druid (ingestão, consulta, coordenação) pode ser implantado e dimensionado de forma independente em contêineres ou em hardware comum. Além disso, os serviços Druid podem falhar e reiniciar de forma independente ou ser atualizados sem afetar outros serviços.
Druid tem vários tipos de processos:
Os processos do coordenador gerenciam a disponibilidade de dados no cluster.
Os processos Overlord controlam a atribuição de cargas de trabalho de ingestão de dados.
Os processos do corretor tratam de consultas de clientes externos.
Os processos do roteador são opcionais; eles encaminham solicitações para Corretores, Coordenadores e Overlords.
Os processos históricos armazenam dados consultáveis.
Os processos do MiddleManager ingerem dados.
Esses processos são normalmente implantados em grupos em três tipos diferentes de servidores ou nós:
Druid tem três dependências externas principais: armazenamento profundo, armazenamento de metadados e ZooKeeper. Resumidamente, os metadados são usados para rastrear o uso do segmento e informações de tarefas e geralmente são tratados pelo PostgreSQL ou MySQL. Zookeeper é usado para descoberta e coordenação de serviços internos.
Como este é o blog do MinIO, vamos nos concentrar no armazenamento profundo. O armazenamento profundo é um sistema de arquivos compartilhado acessível por todos os servidores Druidas onde os dados são armazenados após serem ingeridos. Em uma implantação de servidor único, trata-se simplesmente de uma unidade local. Em implantações em cluster, o armazenamento profundo assumiria a forma de um armazenamento de objetos distribuídos como S3 ou MinIO, HDFS ou um sistema de arquivos montado em rede.
O armazenamento profundo é como o Druid transfere dados entre processos e faz backup dos dados. Druid armazena dados em arquivos chamados segmentos. Há um mapeamento interno que extrai segmentos do armazenamento profundo para armazená-los em cache em unidades locais e na memória. Para minimizar a latência, as consultas são executadas em segmentos localmente, e não em segmentos armazenados em armazenamento profundo. O armazenamento profundo permite o design elástico e tolerante a falhas do Druid. O Druid fornece durabilidade inicializando a partir do armazenamento profundo no caso de um nó de dados ficar inativo e voltar a funcionar. Uma ressalva é que você precisará de espaço livre suficiente nos nós de dados e em armazenamento profundo para os dados com os quais deseja trabalhar no Druid.
Druid usa a API S3 para armazenamento de objetos para armazenamento profundo. Usar armazenamento de objetos compatível com API S3, como MinIO, oferece a liberdade de executar o Druid em qualquer lugar, o que é algo que você pode querer fazer para melhorar o desempenho e a segurança. MinIO é um excelente armazenamento profundo para Druid porque possui excelente compatibilidade S3, desempenho para atender aos requisitos de OLAP em tempo real e, talvez acima de tudo, capacidade de fornecer desempenho em escala. O MinIO também fornece a proteção de dados necessária e o gerenciamento do ciclo de vida .
Você pode executar Druid, MinIO e Superset diretamente no Linux ou em contêineres no Docker ou Kubernetes. Já existem ótimos recursos por aí que mostram como colocar o Druid em funcionamento, então se por algum motivo esta postagem do blog não o satisfizer, confira Início rápido do Apache Druid para Linux, Docker · Apache Druid para Docker e Clustered Apache Druid® em seu laptop para Kubernetes.
Se você ainda não estiver executando o MinIO, aqui estão as instruções de instalação . O processo é descrito detalhadamente no Guia de início rápido do MinIO .
No Linux, por exemplo, baixe o MinIO e execute-o (fique à vontade para alterar a senha do root - e lembre-se dela):
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 um navegador e conecte-se ao MinIO Server em http://<your-IP-address>:9000
usando o usuário root e a senha que você configurou anteriormente.
Na primeira vez que você fizer login, você será direcionado para a página Buckets.
Crie o balde druidbucket
.
No mundo real, você provavelmente desejaria proteger o acesso aos seus dados do Druida, mas não precisamos fazer isso em nosso laboratório. Você criaria uma conta de serviço (no menu Identidade), editaria a política do usuário para permitir acesso apenas ao druidbucket
e na configuração do Druid abaixo usaria a chave de acesso e a chave secreta da conta de serviço.
A maneira mais fácil de testar o Druid é via Docker. Siga as instruções do Docker · Apache Druid e use este docker-compose.yaml . Isso cria um contêiner para cada serviço Druid, bem como Zookeeper e PostgresSQL. Este método usa um arquivo de ambiente para especificar a configuração do Druid. Baixe este arquivo para onde você salvou os contêineres do Druida. Para as instruções abaixo (Configurar Druid para MinIO), você pode editar o arquivo de ambiente para passar as variáveis para arquivos de configuração padrão do Druid ou editar os arquivos de configuração diretamente no contêiner.
Inicie o Druid com docker-compose up
. Assim que o cluster aparecer, abra um navegador e navegue até http://localhost:8888
para usar o console Druid.
Agora é hora de configurar o Druid para usar MinIO para armazenamento profundo. Nesta etapa, você precisará editar os arquivos de configuração do Druid (ou os arquivos do ambiente Docker conforme descrito acima) para fazer referência ao MinIO e então reiniciar o Druid. O processo está totalmente descrito em Como configurar o Druid para usar o Minio como armazenamento profundo - DZone Big Data e estamos incluindo uma versão abreviada aqui para referência rápida.
Dependendo de como você instalou o Druid, no arquivo conf/druid/_common/common.runtime.properties
, adicione "druid-s3-extensions"
a druid.extensions.loadList
. Adicione extensões por nome, entre aspas e separadas por vírgula, por exemplo:
druid.extensions.loadList=["druid-parser-route", "druid-s3-extensions"]
De acordo com o artigo mencionado acima, a extensão S3 para armazenamento profundo depende do jets3t sob o capô. Você precisa criar um arquivo jets3t.properties
no caminho de classe. Para este exemplo, criaremos um novo jets3t.properties
dentro do diretório conf/druid/_common
com o seguinte:
s3service.s3-endpoint=localhost s3service.s3-endpoint-http-port=9000 s3service.disable-dns-buckets=true s3service.https-only=false
Agora, comente as configurações para armazenamento local na seção “Deep Storage” e adicione valores apropriados para Minio. No meu caso, estou executando o MinIO na mesma máquina que o Druid, portanto, o URL do S3 Endpoint inclui localhost e uma porta. Se estiver executando em outra máquina ou em um contêiner, você precisará alterar esta linha para endereçar MinIO em seu ambiente.
Depois disso, a seção “Deep Storage” deve ficar assim:
# # 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/
Também vamos configurar o Druid para armazenar logs de serviço de indexação no Minio. É uma boa prática armazenar tudo em um só lugar para facilitar a localização - o Druida é complicado o suficiente sem ter que procurar registros em vários locais. Atualize a seção “Logs de serviço de indexação” com valores apropriados em conf/druid/_common/common.runtime.properties
.
Depois disso, a seção “Logs de serviço de indexação” deve ter a seguinte aparência:
# 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
OK! Isso cobre todas as alterações de configuração a serem feitas no Druid. Salve o arquivo e reinicie seu cluster. Ao trabalhar com o Druid, você verá segmentos e índices gravados em druidbucket
.
Apache Superset é uma ferramenta de visualização poderosa que é freqüentemente usada com Druid. Superset é um aplicativo de business intelligence nativo da nuvem que é rápido, leve, repleto de recursos e, o melhor de tudo, é gratuito! A interface intuitiva do Superset torna a criação de painéis interativos relativamente fácil. Superset fornece suporte pronto para uso para a maioria dos bancos de dados SQL. Superset se integra a back-ends de autenticação, como banco de dados, OpenID, LDAP e OAuth para proteger as visualizações.
Como software nativo da nuvem, o Superset é altamente escalonável e disponível. Ele foi projetado para ser dimensionado para ambientes grandes e distribuídos.
Estamos mais interessados em começar com o Superset do que em escalá-lo na produção, então faremos a instalação mais simples possível usando Docker Compose . Esta é a maneira mais rápida de experimentar o Superset no Linux ou Mac OSX.
Se você ainda não possui o Docker instalado, siga as instruções do Docker . Depois de instalar o Docker, instale o Docker Compose .
Abra uma janela de terminal e clone o repositório Superset:
$ git clone https://github.com/apache/superset.git
Isso criará uma pasta superconjunto em seu diretório atual. Navegue até esse diretório e execute os seguintes comandos (que podem levar vários minutos para serem concluídos):
$ docker-compose -f docker-compose-non-dev.yml pull $ docker-compose -f docker-compose-non-dev.yml up
Você verá muito texto de inicialização passando em seu terminal. O Superset estará pronto quando você vir algo assim:
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 um navegador e navegue até http://localhost:8088
para acessar o Superset. Faça login com o nome de usuário padrão “admin” e senha “admin”.
Após fazer login no Superset, você deve conectá-lo ao Druid. No canto superior direito, clique em “+” para adicionar um banco de dados.
Na lista suspensa, selecione Apache Druid. Em seguida, nomeie a conexão e insira o seguinte em SQLALCHEMY URI, certificando-se de atualizar o endereço IP ou substituí-lo por localhost conforme necessário. Se tivéssemos protegido a API Druid exigindo autenticação, também inseriríamos um nome de usuário e uma senha.
druid://10.0.0.10:8888/druid/v2/sql
Teste a conexão para ter certeza de que funciona e clique em Concluir.
Uau! Agora você tem Druid, MinIO e Superset rodando em seu ambiente.
Com o triunvirato Druid, SuperSet e MinIO, podemos ter uma visão completa e oportuna dos dados em tempo real. Existem inúmeras organizações que construíram aplicativos de direcionamento de dados em escala web sobre esta combinação para análise de clickstream (análise web e móvel), análise de risco/fraude, análise de telemetria de rede (monitoramento de desempenho de rede), análise da cadeia de suprimentos (métricas de fabricação) e métricas de desempenho de aplicativos.
Essa pilha de análise e visualização nativa da nuvem é flexível e extensível, além de escalonável e de alto desempenho para que você possa criar aplicativos que encantam seus usuários. Dê-lhes o poder de monitorar, analisar e visualizar dados em tempo real. Deixe-os dividir, filtrar e agrupar por qualquer combinação de colunas para que possam tomar decisões conclusivas e orientadas por dados, no ritmo que os negócios exigem.
Para demonstrar um pouco da funcionalidade que construímos, carregaremos um arquivo de dados do tutorial das edições da Wikipedia ao longo do tempo no Druid e depois visualizaremos as edições no SuperSet. Lembre-se de que isso é apoiado pelo MinIO como armazenamento profundo. As edições da Wikipedia são abordadas com mais detalhes em Quickstart · Apache Druid .
O Druid carrega dados enviando uma especificação de tarefa de ingestão em JSON para o servidor Overlord. Você pode criar uma especificação de ingestão usando a GUI da Web ou escrevê-la você mesmo e agendá-la. Depois de criar e ajustar uma especificação de ingestão, você poderá reutilizar o JSON para não precisar repetir a tarefa. Na produção, as equipes frequentemente agendam e automatizam a ingestão.
Abra um navegador e carregue a interface da web do Druid em http://localhost:8888 .
Na parte superior da janela, clique em Carregar dados. A partir daqui, selecione Dados de exemplo, selecione Edições da Wikipedia no menu suspenso à direita e clique no botão azul Carregar exemplo.
A GUI da web orienta você na construção de uma especificação de ingestão que lerá dados de uma fonte e os armazenará em segmentos em armazenamento profundo. A ingestão é baseada em um carimbo de data/hora usado para particionar e classificar dados, enquanto os dados são armazenados como colunas de dimensões e métricas. Para obter mais informações sobre como otimizar o desempenho na ingestão, consulte Modelagem de dados e desempenho de consulta no Apache Druid .
Com os dados do tutorial, simplesmente clicaremos no fluxo de trabalho de ingestão aceitando os padrões ou clicaremos em Editar especificação JSON e, em seguida, clicaremos em Enviar. Se você quisesse (ou precisasse), você poderia olhar o arquivo bruto como JSON e analisá-lo. Druid cria sua própria coluna de tempo chamada __time
para organizar e segmentar dados. Como o tempo é tão importante para o Druida, ele é muito bom em descobrir como lidar com carimbos de data e hora, independentemente do formato. Além disso, podemos transformar dados e otimizar o desempenho da consulta particionando dados e dimensionando segmentos. Por fim, você pode ajustar o trabalho de ingestão em termos de threads e utilização de memória, agendá-lo e executá-lo.
A GUI envia para você visualizar as tarefas:
Este é um trabalho de ingestão muito pequeno, por isso termina quase imediatamente.
A partir daqui, você pode executar consultas nos dados do Druid e obter respostas extremamente rápidas. Você pode executar consultas por meio da GUI da web ou da API. O Druid está por trás de muitos painéis devido à sua capacidade de fornecer excelente desempenho de consulta em grandes quantidades de dados em escala.
Volte ao navegador onde você fez login no Superset e clique novamente no “+” no canto superior direito da tela inicial. Em seguida, clique em Gráfico.
Poderíamos executar consultas SQL individuais na parte inferior da tela. Painéis são grupos de consultas individuais. As respostas a consultas repetitivas são armazenadas em cache no Superset para melhorar o desempenho.
Selecione o conjunto de dados druid.wikipedia
e selecione uma visualização. Superset inclui uma série de visualizações de séries temporais. Vamos escolher Gráfico de série temporal e clicar em Novo gráfico.
Inicialmente, você não verá nenhum resultado, mas não se deixe enganar. Primeiro, remova o intervalo de tempo configurando-o como “sem filtro”. O Time Grain está definido muito alto em “dia”, então mude para “5 minutos”. Agora estamos visualizando um gráfico do número de edições da Wikipedia acontecendo em janelas de 5 minutos em nossos dados de amostra.
Você pode filtrar e agrupar resultados usando Superset. Para salvar o gráfico, clique em Salvar na parte superior da tela, dê um nome ao gráfico e salve-o.
Até agora você aprendeu as etapas básicas para instalar o Druid e o MinIO, ingerir seu primeiro conjunto de dados e gerar seu primeiro gráfico Superset. Uma próxima etapa útil seria aprender mais sobre como explorar dados no superconjunto .
Nesta postagem do blog, apresentamos um grupo de aplicativos nativos da nuvem: Apache Druid para análise, Apache Superset para visualização e MinIO para armazenamento profundo S3. Esta demonstração simples é o início da construção de uma pilha de análise e visualização nativa da nuvem e pode ser estendida com Apache Spark para ML ou Jupyter para ciência de dados.
Obrigado por ler esta demonstração. Se você tiver alguma dúvida, envie-nos um e-mail para [email protected] ou entre no canal MinIO slack e pergunte.
Também publicado aqui .