Tutorial Apache Flume: O que é, ArchiExemplo de arquitetura e Hadoop

⚡ Resumo Inteligente

O Apache Flume é um serviço distribuído para coletar, agregar e mover grandes volumes de dados de log para o HDFS, construído em torno de agentes que encadeiam uma origem, um canal e um destino.

  • 🔘 Anatomia do agente: Cada agente Flume é um processo JVM que contém uma fonte, um ou mais canais e um destino.
  • ☑️ Confiabilidade: A entrega com o melhor esforço não tolera falhas em nós; a entrega de ponta a ponta sobrevive a múltiplas falhas em nós.
  • Configuração: As classes de origem personalizadas são compiladas em um arquivo JAR que é colocado no diretório lib do Flume.
  • 🧪 Configuração: Um arquivo de propriedades define os nomes da origem, do canal e do destino, além de configurar o caminho HDFS e os limites de rotação.
  • 🛠️ Lançamento: Inicie o pipeline com o agente flume-ng, nomeando o agente e apontando para o arquivo flume.conf.
  • ⚠️ Exemplo antigo: O endpoint de streaming do Twitter v1.1 foi desativado em março de 2023, portanto, trate este exercício como um padrão de fonte personalizada.

Tutorial do Apache Flume abordando a arquitetura do agente, configuração e um exemplo de streaming com Hadoop.

O que é Apache Flume no Hadoop?

O Apache Flume é um sistema confiável e distribuído para coletar, agregar e mover grandes quantidades de dados de log. Possui uma arquitetura simples, porém flexível, baseada em fluxos de dados contínuos. O Apache Flume é usado para coletar dados de log presentes em arquivos de log de servidores web e agregá-los em... HDFS para análise.

O Flume no Hadoop suporta múltiplas fontes, incluindo:

  • 'tail' (que envia dados de um arquivo local e os grava no HDFS via Flume, semelhante ao comando 'tail' do Unix)
  • Logs do sistema
  • Log4j do Apache (que permite) Java aplicativos para gravar eventos em arquivos no HDFS via Flume).

A versão atual é Flume 1.11.0, publicado em 25 de outubro de 2022 e disponível em Página de download do Apache FlumeEste guia foi escrito com base na versão 1.4.0, portanto, várias etapas abaixo contêm uma observação indicando que a versão atual se comporta de maneira diferente.

Calha Archiarquitetura

Um agente Flume é um JVM O processo possui três componentes – fonte Flume, canal Flume e destino Flume – através dos quais os eventos se propagam após serem iniciados em uma fonte externa. O diagrama abaixo mostra como eles se conectam.

Diagrama da arquitetura do Flume mostrando um agente com uma fonte, um canal e um coletor alimentando o HDFS.

  1. Os eventos gerados pela fonte externa (um servidor web) são consumidos pela fonte Flume. A fonte externa envia eventos para a fonte Flume em um formato que a fonte de destino reconhece.
  2. A fonte Flume recebe um evento e o armazena em um ou mais canais. O canal funciona como um repositório que mantém o evento até que ele seja consumido pelo coletor Flume. Esse canal pode usar um sistema de arquivos local para armazenar esses eventos.
  3. O coletor Flume remove o evento de um canal e o armazena em um repositório externo, como o HDFS. Pode haver vários agentes Flume; nesse caso, o coletor Flume encaminha o evento para a fonte Flume do próximo agente no fluxo.

Algumas características importantes do canal de descida

  • O Flume possui um design flexível baseado em fluxos de dados contínuos. É tolerante a falhas e robusto, com múltiplos mecanismos de failover e recuperação. O Flume oferece diferentes níveis de confiabilidade, incluindo 'entrega com o melhor esforço' e 'entrega de ponta a ponta'. Entrega com melhor esforço não tolera nenhuma falha nos nós do Flume, enquanto entrega de ponta a ponta Garante a entrega mesmo em caso de falhas em múltiplos nós.
  • O Flume transporta dados entre fontes e destinos. Essa coleta de dados pode ser agendada ou orientada a eventos. O Flume possui seu próprio mecanismo de processamento de consultas, o que facilita a transformação de cada novo lote de dados antes de ser enviado ao destino pretendido.
  • Possiveis Pias de calha incluem HDFS e HBaseO Flume também pode transportar dados de eventos, como dados de tráfego de rede, dados gerados por sites de redes sociais e mensagens de e-mail.

Configuração de flume, biblioteca e código fonte

Antes de começarmos o processo propriamente dito, certifique-se de ter o Hadoop instalado; caso contrário, siga as instruções. Como instalar o Hadoop Primeiro, altere o usuário para 'hduser' (o ID usado durante a configuração do Hadoop; você pode alternar para o ID de usuário usado durante sua própria configuração do Hadoop).

Alterne para o usuário hduser no terminal antes do início da configuração do Flume.

Passo 1) Crie um novo diretório com o nome 'FlumeTutorial'.

sudo mkdir FlumeTutorial
  1. Conceda permissões de leitura, gravação e execução.
    sudo chmod -R 777 FlumeTutorial
  2. Copie os arquivos MeuTwitterSource.java e MyTwitterSourceForFlume.java neste diretório.

Baixe os arquivos de entrada daqui

Verifique as permissões de todos esses arquivos, conforme abaixo, e conceda permissão de 'leitura' caso esteja faltando.

O terminal lista as permissões de arquivo do arquivo baixado. Java Arquivos Fonte

Passo 2) Baixe 'Apache Flume' de https://flume.apache.org/download.html.

Apache Flume 1.4.0 foi usado neste tutorial do Flume.

Página de download do Apache Flume mostrando o link para o arquivo tar.gz binário para seleção.

Em seguida, clique para acessar um espelho.

A página do Apache foi acessada após clicar no link do arquivo tar do Flume.

Passo 3) Copie o arquivo tarball baixado para o diretório de sua escolha e execute o comando.tracPara visualizar o conteúdo, utilize o seguinte comando.

sudo tar -xvf apache-flume-1.4.0-bin.tar.gz

Terminal extraccompactando o arquivo tar do Flume com o comando sudo tar -xvf

Isso cria um novo diretório chamado apache-flume-1.4.0-bin e extraccoloca os arquivos nele. Esse diretório é chamado de no restante do artigo.

Passo 4) Configuração da biblioteca Flume. Copie os arquivos twitter4j-core-4.0.1.jar, flume-ng-configuration-1.4.0.jar, flume-ng-core-1.4.0.jar e flume-ng-sdk-1.4.0.jar para

/lib/

Um ou mais dos arquivos JAR copiados podem ter a permissão de execução definida, o que pode causar problemas na compilação do código. Portanto, revogue essa permissão. No meu caso, o arquivo twitter4j-core-4.0.1.jar tinha a permissão de execução. Eu a revoguei conforme descrito abaixo.

sudo chmod -x twitter4j-core-4.0.1.jar

O terminal revoga a permissão de execução no arquivo JAR principal do twitter4j.

Em seguida, o comando abaixo concede permissão de 'leitura' ao arquivo twitter4j-core-4.0.1.jar para todos.

sudo chmod +rrr /usr/local/apache-flume-1.4.0-bin/lib/twitter4j-core-4.0.1.jar

Observe que baixei o arquivo twitter4j-core-4.0.1.jar de Repositório Mavene todos os JARs do Flume, ou seja, flume-ng-*-1.4.0.jar, de os artefatos org.apache.flume.

Carregar dados do Twitter usando Flume

Passo 1) Acesse o diretório que contém os arquivos do código-fonte.

Passo 2) Defina o CLASSPATH para conter /lib/* e ~/FlumeTutorial/flume/mytwittersource/*.

export CLASSPATH="/usr/local/apache-flume-1.4.0-bin/lib/*:~/FlumeTutorial/flume/mytwittersource/*"

Terminal exportando o CLASSPATH que aponta para os diretórios de biblioteca e de origem do Flume.

Passo 3) Compile o código-fonte usando o comando abaixo.

javac -d . MyTwitterSourceForFlume.java MyTwitterSource.java

Terminal compilando os dois Java arquivos de origem com javac

Passo 4) Crie um arquivo JAR. Primeiro, crie um arquivo Manifest.txt usando um editor de texto de sua preferência e adicione a linha abaixo a ele.

Main-Class: flume.mytwittersource.MyTwitterSourceForFlume

Aqui, `flume.mytwittersource.MyTwitterSourceForFlume` é o nome da classe principal. Observe que você precisa pressionar a tecla Enter no final desta linha, como mostrado abaixo.

Abra o arquivo Manifest.txt em um editor de texto com a entrada Main-Class.

Agora, crie o arquivo JAR 'MyTwitterSourceForFlume.jar' da seguinte forma.

jar cfm MyTwitterSourceForFlume.jar Manifest.txt flume/mytwittersource/*.class

O terminal empacota as classes compiladas em MyTwitterSourceForFlume.jar.

Passo 5) Copie este arquivo JAR para /lib/.

sudo cp MyTwitterSourceForFlume.jar <Flume Installation Directory>/lib/

O terminal copia o arquivo JAR de origem personalizado para o diretório lib do Flume.

Passo 6) Acesse o diretório de configuração do Flume. /conf.

Se o arquivo flume.conf não existir, copie o arquivo flume-conf.properties.template e renomeie-o para flume.conf.

sudo cp flume-conf.properties.template flume.conf

Terminal copiando flume-conf.properties.template para flume.conf

Se o arquivo flume-env.sh não existir, copie o arquivo flume-env.sh.template e renomeie-o para flume-env.sh.

sudo cp flume-env.sh.template flume-env.sh

Terminal copiando flume-env.sh.template para flume-env.sh

Criando um aplicativo do Twitter

Leia isto primeiro. O streaming v1.1 statuses/filter O endpoint necessário para o twitter4j 4.0.1 foi desativado em 9 de março de 2023, e o fluxo filtrado da API v2 que o substituiu, agora em desenvolvedor.x.com, está disponível apenas em um plano pago. Considere as telas abaixo como um padrão de origem personalizada e, em seguida, direcione o mesmo agente para uma origem de arquivo, executável ou Kafka.

Passo 1) Crie um aplicativo do Twitter fazendo login no portal do desenvolvedor.

Página de login de desenvolvedor do Twitter usada para acessar a lista de aplicativos

Página inicial da conta de desenvolvedor do Twitter exibida após o login.

Passo 2) Acesse "Meus aplicativos" (essa opção aparece ao clicar no botão "Ovo" no canto superior direito).

A página "Meus aplicativos" do portal de desenvolvedores do Twitter.

Passo 3) Crie um novo aplicativo clicando em 'Criar novo aplicativo'.

Passo 4) Preencha os detalhes da candidatura, especificando o nome da candidatura, uma descrição e um website. Pode consultar as notas indicadas abaixo de cada campo de entrada.

Formulário para criação de aplicativo do Twitter com campos para nome, descrição e site.

Passo 5) Desça a página até o final, aceite os termos marcando "Sim, concordo" e clique no botão "Criar seu aplicativo do Twitter".

A caixa de seleção "Termos" e o botão "Criar aplicativo" na parte inferior do formulário do Twitter.

Passo 6) Na janela do aplicativo recém-criado, acesse a guia 'Chaves de API', role a página para baixo e clique no botão 'Criar meu token de acesso'.

A aba "Chaves de API" do novo aplicativo do Twitter antes da existência de um token de acesso.

Os detalhes do token de acesso são exibidos após o uso do botão "Criar meu token de acesso".

Passo 7) Recarregue a página.

Passo 8) Clique em 'Testar OAuth'. Isso exibirá as configurações de 'OAuth' do aplicativo.

Tela de teste OAuth exibindo as configurações OAuth do aplicativo.

Passo 9) Modifique o arquivo 'flume.conf' usando estas configurações de OAuth. Os passos para modificar o 'flume.conf' são apresentados abaixo.

Configurações OAuth listando a chave do consumidor, o segredo do consumidor e os valores do token de acesso.

Precisamos copiar a chave do consumidor, o segredo do consumidor, o token de acesso e o segredo do token de acesso para atualizar o arquivo 'flume.conf'.

Nota: Esses valores pertencem ao usuário e, portanto, são confidenciais, não devendo ser compartilhados.

Modifique o arquivo 'flume.conf'

Passo 1) Abra o arquivo 'flume.conf' em modo de escrita e defina os valores para os parâmetros abaixo.

sudo gedit flume.conf

Copie o conteúdo abaixo.

MyTwitAgent.sources = Twitter
MyTwitAgent.channels = MemChannel
MyTwitAgent.sinks = HDFS
MyTwitAgent.sources.Twitter.type = flume.mytwittersource.MyTwitterSourceForFlume
MyTwitAgent.sources.Twitter.channels = MemChannel
MyTwitAgent.sources.Twitter.consumerKey = <Copy consumer key value from Twitter App>
MyTwitAgent.sources.Twitter.consumerSecret = <Copy consumer secret value from Twitter App>
MyTwitAgent.sources.Twitter.accessToken = <Copy access token value from Twitter App>
MyTwitAgent.sources.Twitter.accessTokenSecret = <Copy access token secret value from Twitter App>
MyTwitAgent.sources.Twitter.keywords = guru99
MyTwitAgent.sinks.HDFS.channel = MemChannel
MyTwitAgent.sinks.HDFS.type = hdfs
MyTwitAgent.sinks.HDFS.hdfs.path = hdfs://localhost:54310/user/hduser/flume/tweets/
MyTwitAgent.sinks.HDFS.hdfs.fileType = DataStream
MyTwitAgent.sinks.HDFS.hdfs.writeFormat = Text
MyTwitAgent.sinks.HDFS.hdfs.batchSize = 1000
MyTwitAgent.sinks.HDFS.hdfs.rollSize = 0
MyTwitAgent.sinks.HDFS.hdfs.rollCount = 10000
MyTwitAgent.channels.MemChannel.type = memory
MyTwitAgent.channels.MemChannel.capacity = 10000
MyTwitAgent.channels.MemChannel.transactionCapacity = 1000

Abra o arquivo flume.conf em um editor com as propriedades de origem, canal e destino do MyTwitAgent.

Passo 2) Além disso, defina TwitterAgent.sinks.HDFS.hdfs.path conforme abaixo.

TwitterAgent.sinks.HDFS.hdfs.path = hdfs:// : / /flume/tweets/

A propriedade hdfs.path do coletor HDFS foi definida com o nome do host, o número da porta e o diretório inicial do HDFS.

Para encontrar , e , veja o valor do parâmetro 'fs.defaultFS' definido em $HADOOP_HOME/etc/hadoop/core-site.xml, mostrado abaixo.

A propriedade fs.defaultFS dentro do arquivo core-site.xml fornece o nome do host e a porta.

Passo 3) Para que os dados sejam gravados no HDFS assim que chegarem, exclua a entrada abaixo, caso exista.

TwitterAgent.sinks.HDFS.hdfs.rollInterval = 600

Exemplo: streaming de dados do Twitter usando Flume

Passo 1) Abra o arquivo 'flume-env.sh' em modo de escrita e defina os valores para os parâmetros abaixo.

JAVA_HOME=<Installation directory of Java>
FLUME_CLASSPATH="<Flume Installation Directory>/lib/MyTwitterSourceForFlume.jar"

Abra o arquivo flume-env.sh em um editor com as variáveis ​​de ambiente JAVA_HOME e FLUME_CLASSPATH configuradas.

Passo 2) Inicie o Hadoop.

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

Passo 3) Dois dos arquivos JAR do pacote tar do Flume não são compatíveis com o Hadoop 2.2.0, portanto, neste exemplo do Apache Flume, seguimos os passos abaixo para tornar o Flume compatível com o Hadoop 2.2.0. Essa troca de JAR é uma correção da era 1.4.0; o Flume 1.11.0 já inclui versões atualizadas do protobuf e do Guava, então um pacote tar moderno normalmente não precisa disso.

a. Mova o arquivo protobuf-java-2.4.1.jar para fora de ' /lib'. Acesse esse diretório primeiro.

cd /lib

sudo mv protobuf-java-2.4.1.jar ~/

O terminal está movendo o arquivo protobuf-java-2.4.1.jar para fora do diretório lib do Flume.

b. Localize o arquivo JAR 'guava' conforme abaixo.

find . -name "guava*"

O comando `find` do Terminal localiza o arquivo JAR do Guava incluído.

Mova o arquivo guava-10.0.1.jar para fora de ' /lib'.

sudo mv guava-10.0.1.jar ~/

Terminal movendo guava-10.0.1.jar para fora do diretório lib do Flume

c. Baixe o arquivo guava-17.0.jar de Repositório Maven, mostrado abaixo.

Página do repositório Maven para o Guava 17.0, o JAR substituto para download.

Agora, copie este arquivo JAR baixado para ' /lib'.

Passo 4) Vá para ' /bin' e inicie o Flume da seguinte forma.

./flume-ng agent -n MyTwitAgent -c conf -f <Flume Installation Directory>/conf/flume.conf

Terminal iniciando o agente Flume chamado MyTwitAgent com o comando flume-ng

A janela do prompt de comando onde o Flume está buscando tweets tem esta aparência.

Prompt de comando mostrando o agente Flume buscando tweets e gravando-os no HDFS.

Pela mensagem na janela de comando, podemos ver que a saída foi gravada no diretório /user/hduser/flume/tweets/. Agora, abra este diretório usando um navegador da web.

Passo 5) Para ver o resultado do carregamento de dados, abra http://localhost:50070/ em um navegador, navegue pelo sistema de arquivos e acesse o diretório onde os dados foram carregados.

/flume/tweets/

A porta 50070 é a da interface web do NameNode no Hadoop 2; o Hadoop 3 moveu a mesma página para a porta 9870.

Navegador HDFS exibindo o diretório flume/tweets com os arquivos de tweets carregados.

Flume é metade da ingestão: Sqoop Importa tabelas em lotes, o Flume transmite eventos e então Porco or Colméia formatar os arquivos e oozie Os horários da cadeia. Veja também ferramentas de análise de big data, MapReduce: junções e contadores e Talend.

Perguntas Frequentes

Não conforme descrito. O endpoint de status/filtro de streaming v1.1 foi desativado em 9 de março de 2023 e a API v2, que o substitui, requer um plano pago. A mecânica do Flume ainda se aplica como um exercício de código-fonte personalizado.

Os modelos estabelecem uma linha de base normal para o volume do logaritmo e o formato da mensagem, e então sinalizam desvios que os limites fixos não detectam. Eles também agrupam pilhas repetidas. traccondensar os incidentes em um único relatório e elaborar uma causa provável, agilizando a triagem.

O Copilot cria blocos de origem, canal e destino rapidamente, mas inventa nomes de propriedades e mistura versões. Verifique cada chave no Guia do Usuário do Flume para a sua versão antes de iniciar o agente.

O Flume transmite dados de eventos, como logs, continuamente para o HDFS. O Sqoop move tabelas estruturadas entre bancos de dados relacionais e o Hadoop em lotes agendados. Eles abrangem diferentes aspectos da ingestão e funcionam bem em conjunto.

Um canal de memória é o mais rápido, mas perde eventos armazenados em buffer se o agente for encerrado. Um canal de arquivo grava em disco e sobrevive a reinicializações, embora com menor taxa de transferência. Prefira a durabilidade para tudo o que não puder ser reenviado.

O Kafka é o padrão atualmente, pois retém dados e atende a muitos consumidores. O Flume 1.11.0, de outubro de 2022, ainda é adequado para coleta simples de logs unidirecionais no HDFS.

Quase sempre é um conflito de JAR: o pacote tarball do Flume inclui suas próprias versões do Guava e do protobuf, que entram em conflito com as versões carregadas pelo Hadoop. Remover o JAR mais antigo geralmente resolve o problema.

Eles definem quando o coletor fecha um arquivo e abre um novo: rollSize em bytes, rollCount pela contagem de eventos e rollInterval em segundos. O valor zero desativa esse gatilho específico.

Resuma esta postagem com: