Instalação do Flume-1.9.0, monitoramento de portas, monitoramento de arquivos locais e upload de HDFS, monitoramento de novos arquivos no diretório e upload de HDFS, monitoramento de arquivos adicionais (upload retomado)

Estrutura Flume-Flume, fonte de dados única e várias saídas, failover (Failover), balanceamento de carga, agregação, etc.

Flume-custom interceptor, custom Source para ler dados do MySQL, custom Sink

Instalação da calha

  1. Baixe o Flume do site oficial: http://flume.apache.org/download.html
  2. - :Tar -zxvf apache-flume-1.9.0-bin.tar.gz
  3. Renomeie o diretório: mv apache-flume-1.9.0-bin flume-1.9.0
  4. Renomeie flume-env.sh.template no diretório conf: mv flume-env.sh.template flume-env.sh
  5. Modifique flume-env.sh:
    Insira a descrição da imagem aqui
  6. Modifique / etc / profile:
    Insira a descrição da imagem aqui
  7. fonte / etc / perfil

Insira a descrição da imagem aqui

Caso 1: porta de escuta

    Os parâmetros exigidos pelo arquivo de configuração podem ser visualizados no site oficial e as opções em negrito são obrigatórias.
Insira a descrição da imagem aqui

análise de caso

  1. Envie dados para a porta 44444 da máquina através da ferramenta netcat
  2. O Flume monitora a porta 44444 da máquina e lê os dados por meio da fonte
  3. Flume grava os dados adquiridos no console por meio do coletor

Etapas do caso

  1. Instale o netcat em cada host: yum install -y nc

  2. Verifique se a porta 44444 está ocupada: netstat -tunlp | grep 44444

  3. Uso do Netcat: insira nc -lk 44444 como o servidor e nc host 44444 como o cliente, que podem se comunicar entre si
    Insira a descrição da imagem aqui

  4. Crie o arquivo de configuração do Flume Agent netcat-flume-logger.conf :

     # example.conf: A single-node Flume configuration
     
     # Name the components on this agent
     a1.sources = r1
     a1.channels = c1
     a1.sinks = k1
     
     # Describe/configure the source
     a1.sources.r1.type = netcat
     a1.sources.r1.bind = localhost
     a1.sources.r1.port = 44444
     
     # Describe the sink
     a1.sinks.k1.type = logger
     
     # Use a channel which buffers events in memory
     a1.channels.c1.type = memory
     a1.channels.c1.capacity = 1000
     a1.channels.c1.transactionCapacity = 100
     
     # Bind the source and sink to the channel
     a1.sources.r1.channels = c1
     a1.sinks.k1.channel = c1
    

        O arquivo de configuração possui 5 partes, separadas por linhas em branco

    1. Nomeie os componentes do Agente . a1 é o nome do agente, r1 é o nome da fonte, c1 é o nome do canal e k1 é o nome do coletor. Observe que as palavras estão no plural , indicando que pode haver vários componentes.
    2. Configure a fonte . O tipo de origem de r1 é netcat , o host de escuta é localhost e o número da porta de escuta é 44444.
    3. Configure o coletor . O tipo de k1 é logger , que é enviado para o console.
    4. Configure o canal . O tipo de canal c1 é a memória , a capacidade do buffer é de 1000 eventos (Flume usa Event como unidade de transmissão) e a capacidade de transação é de 100 eventos (dados transmitidos de uma vez).
    5. Vincule três componentes . Como pode haver várias fontes, canais e sumidouros, eles precisam ser vinculados. INFO refere-se a INFO e mensagens acima. Observe o grande número de canais. Uma fonte pode ser vinculada a vários canais, um canal pode ser vinculado a vários coletores e um coletor só pode ser vinculado a um canal .
  5. Inicie o Flume, neste momento Flume como o servidor. conf é o diretório conf sob o diretório Flume, conf-file é um arquivo de configuração escrito por você e name é o nome do Agente.

     bin/flume-ng agent --conf conf --conf-file netcat-flume-logger.conf --name a1 -Dflume.root.logger=INFO,console
     或者
     bin/flume-ng agent --c conf --f netcat-flume-logger.conf --n a1 -Dflume.root.logger=INFO,console
    
  6. Inicie um novo terminal e digite nc localhost 44444 e digite a string
    Insira a descrição da imagem aqui
    Insira a descrição da imagem aqui

  7. Ctrl + c para fechar. Você pode usar kill, mas não use kill -9. Kill -9 não executará o programa de gancho (trabalho de acabamento).

Caso 2: monitoramento de arquivos locais

análise de caso

  1. Flume monitora alterações de arquivos locais
  2. Alterar arquivos em tempo hábil através do crontab
  3. Flume envia dados para o console

Etapas do caso

  1. Crie um arquivo vazio no diretório Flume: toque em date.txt

  2. Crie o arquivo de configuração do Flume Agent exec-flume-logger.conf , o tipo de origem é exec , o tipo de coletor é logger e o comando é tail:

     # Name the components on this agent
     a1.sources = r1
     a1.channels = c1
     a1.sinks = k1
     
     # Describe/configure the source
     a1.sources.r1.type = exec
     a1.sources.r1.command = tail -F /opt/flume-1.9.0/date.txt
     
     # Describe the sink
     a1.sinks.k1.type = logger
     
     # Use a channel which buffers events in memory
     a1.channels.c1.type = memory
     a1.channels.c1.capacity = 1000
     a1.channels.c1.transactionCapacity = 100
     
     # Bind the source and sink to the channel
     a1.sources.r1.channels = c1
     a1.sinks.k1.channel = c1
    
  3. Iniciar Flume

     bin/flume-ng agent -c conf -f exec-flume-logger.conf -n a1 -Dflume.root.logger=INFO,console
    
  4. Inicie um novo terminal, digite crontab -e , edite a tarefa cronometrada, modifique o arquivo a cada minuto e salve
    Insira a descrição da imagem aqui

  5. O efeito final é o seguinte:
    Insira a descrição da imagem aqui

  6. Digite crontab -r para excluir a tarefa de tempo do usuário atual

Caso 3: monitorar arquivos locais e fazer upload de HDFS

análise de caso

  1. Flume monitora arquivos de log do Hive
  2. Inicie o Hive e gere registros
  3. Flume grava os dados adquiridos no HDFS

Etapas do caso

  1. Como os dados precisam ser carregados no HDFS, os pacotes jar relacionados ao Hadoop precisam ser preparados. O pacote jar pode ser encontrado no diretório share / hadoop no diretório de instalação do Hadoop .
    Insira a descrição da imagem aqui

  2. Copie esses pacotes jar para o diretório lib sob o diretório Flume. Quando o Flume iniciar, os pacotes jar sob lib serão carregados na memória: mv tempjar / * /opt/flume-1.9.0/lib

  3. Inicie o HDFS e o Yarn: start-dfs.sh , start-yarn.sh

  4. Crie o arquivo de configuração do Flume Agent exec-flume-hdfs.conf , o tipo de origem é exec e o tipo de coletor é hdfs . Observação: para todas as sequências de escape relacionadas ao tempo, deve haver uma chave de "carimbo de data / hora" no cabeçalho do evento (a menos que hdfs.useLocalTimeStamp seja definido como verdadeiro, este método usará TimestampInterceptor para adicionar automaticamente o carimbo de data / hora).

     # Name the components on this agent
     a1.sources = r1
     a1.channels = c1
     a1.sinks = k1
     
     # Describe/configure the source
     a1.sources.r1.type = exec
     a1.sources.r1.command = tail -F /opt/hive-2.3.7/log/hive.log
     
     # Describe the sink
     a1.sinks.k1.type = hdfs
     # 创建文件的路径
     a1.sinks.k1.hdfs.path = hdfs://master:9000/flume/%Y%m%d/%H
     # 上传文件的前缀
     a1.sinks.k1.hdfs.filePrefix = logs
     # 是否按照时间滚动文件夹
     # 下面3个参数一起配置
     a1.sinks.k1.hdfs.round = true
     # 多久创建一个新的文件夹
     a1.sinks.k1.hdfs.roundValue = 1
     # 定义时间单位
     a1.sinks.k1.hdfs.roundUnit = hour
     # 是否使用本地时间戳(必须配置)
     a1.sinks.k1.hdfs.useLocalTimeStamp = true
     # 积累多少个Event才flush到HDFS一次(单位为事件)
     a1.sinks.k1.hdfs.batchSize = 100
     # 设置文件类型,可支持压缩
     a1.sinks.k1.hdfs.fileType = DataStream
     # 多久滚动生成一个新的文件(单位为秒)
     # 这个参数只是实验用,实际开发需要调大点
     # 下面3个参数一起配置
     a1.sinks.k1.hdfs.rollInterval = 30
     # 设置每个文件的滚动大小(略小于文件块大小128M)
     a1.sinks.k1.hdfs.rollSize = 134217700
     # 文件的滚动与Event数量无关(0则不按照该值)
     a1.sinks.k1.hdfs.rollCount = 0
     
     # Use a channel which buffers events in memory
     a1.channels.c1.type = memory
     a1.channels.c1.capacity = 1000
     a1.channels.c1.transactionCapacity = 100
     
     # Bind the source and sink to the channel
     a1.sources.r1.channels = c1
     a1.sinks.k1.channel = c1
    
  5. Iniciar Flume

     bin/flume-ng agent -c conf -f exec-flume-hdfs.conf -n a1 -Dflume.root.logger=INFO,console
    
  6. Inicie um novo terminal, inicie o hive e execute operações de consulta
    Insira a descrição da imagem aqui
    Insira a descrição da imagem aqui

Problema anormal

2020-06-04 17: 53: 52,961 (conf-file-poller-0) [ERROR - org.apache.flume.node.AbstractConfigurationProvider.loadSinks (AbstractConfigurationProvider.java:469)] O coletor k1 foi removido devido a um erro durante a configuração
java.lang.InstantiationException: configurações de coletor e canal incompatíveis definidas. o tamanho do lote do coletor é maior do que a capacidade de transação dos canais. Dissipador: k1, tamanho do lote = 1000, canal c1, capacidade de transação = 100

    Motivo : as configurações de canal e coletor não correspondem, o tamanho do lote do coletor é maior do que a capacidade de transação do canal.
    Solução : Defina a1.sinks.k1.hdfs.batchSize como menor ou igual a 100

Caso 4: monitoramento de novos arquivos no diretório e upload para HDFS

análise de caso

  1. O Flume monitora o diretório especificado e a pasta monitorada verifica as alterações de arquivo a cada 500 milissegundos
  2. Adicionar novos arquivos ao diretório
  3. Flume grava os dados adquiridos no HDFS. O sufixo local do arquivo carregado é .COMPLETED por padrão . Os arquivos não carregados têm o sufixo .tmp no HDFS .

    O Flume usa o método acima para determinar se há um novo arquivo, mas se houver um arquivo com um sufixo .COMPLETED que não foi carregado no diretório, então o Flume não carregará o arquivo.
    Ao mesmo tempo, se um arquivo com o sufixo .COMPLETED for modificado , o Flume não carregará o arquivo no HDFS, porque ele tem um sufixo .COMPLETED e o Flume pensa que foi carregado.
    Portanto, esse método não pode monitorar dinamicamente os dados alterados.

Etapas do caso

  1. Crie um novo diretório: diretório mkdir .

  2. Crie o arquivo de configuração do Flume Agent spooldir-flume-hdfs.conf , o tipo de origem é o diretório de spool e o tipo de coletor é hdfs

     # Name the components on this agent
     a1.sources = r1
     a1.channels = c1
     a1.sinks = k1
     
     # Describe/configure the source
     a1.sources.r1.type = spooldir
     # 监控的目录
     a1.sources.r1.spoolDir = /opt/flume-1.9.0/directory
     #忽略所有以.tmp 结尾的文件,不上传
     a1.sources.r1.ignorePattern = ([^]*\.tmp)
     
     # Describe the sink
     a1.sinks.k1.type = hdfs
     # 创建文件的路径
     a1.sinks.k1.hdfs.path = hdfs://master:9000/flume/%Y%m%d/%H
     # 上传文件的前缀
     a1.sinks.k1.hdfs.filePrefix = logs
     # 是否按照时间滚动文件夹
     a1.sinks.k1.hdfs.round = true
     # 多久创建一个新的文件夹
     a1.sinks.k1.hdfs.roundValue = 1
     # 定义时间单位
     a1.sinks.k1.hdfs.roundUnit = hour
     # 是否使用本地时间戳(必须配置)
     a1.sinks.k1.hdfs.useLocalTimeStamp = true
     # 积累多少个Event才flush到HDFS一次(单位为事件)
     a1.sinks.k1.hdfs.batchSize = 100
     # 设置文件类型,可支持压缩
     a1.sinks.k1.hdfs.fileType = DataStream
     # 多久滚动生成一个新的文件(单位为秒)
     a1.sinks.k1.hdfs.rollInterval = 30
     # 设置每个文件的滚动大小(略小于文件块大小128M)
     a1.sinks.k1.hdfs.rollSize = 134217700
     # 文件的滚动与Event数量无关(0则不按照该值)
     a1.sinks.k1.hdfs.rollCount = 0
     
     # Use a channel which buffers events in memory
     a1.channels.c1.type = memory
     a1.channels.c1.capacity = 1000
     a1.channels.c1.transactionCapacity = 100
     
     # Bind the source and sink to the channel
     a1.sources.r1.channels = c1
     a1.sinks.k1.channel = c1
    
  3. Iniciar Flume

     bin/flume-ng agent -c conf -f spooldir-flume-hdfs.conf -n a1 -Dflume.root.logger=INFO,console
    
  4. Crie arquivos no diretório do diretório: data> um.txt , data> dois.txt , data> três.txt
    Insira a descrição da imagem aqui
    Insira a descrição da imagem aqui
    Insira a descrição da imagem aqui

Problema anormal

    Se você lançar um arquivo existente no diretório, o Flume relatará um erro. Por exemplo, coloco um one.txt nele, data> um.txt . O Flume relatará um erro de que há um novo arquivo one.txt no diretório do diretório, mas não há sufixo .COMPLETED e há novos arquivos no HDFS. Quando joguei o novo arquivo three.txt no diretório novamente, o novo arquivo não foi renomeado ou carregado, e um arquivo de erro 1B foi carregado.

2020-06-04 20: 22: 32.879 (pool-5-thread-1) [ERROR - org.apache.flume.source.SpoolDirectorySource $ SpoolDirectoryRunnable.run (SpoolDirectorySource.java:296)] FATAL: Fonte do Spool Directory r1: {spoolDir: /opt/flume-1.9.0/directory}: Exceção não detectada no thread SpoolDirectorySource. Reinicie ou reconfigure o Flume para continuar o processamento.
java.lang.IllegalStateException: o nome do arquivo foi reutilizado com arquivos diferentes. Suposições de spool violadas para /opt/flume-1.9.0/directory/one.txt.COMPLETED

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
    Motivo : o novo arquivo usa um nome de arquivo que já existe no diretório. Flume carregou o arquivo primeiro e depois alterou o nome. Ocorreu um erro ao alterar o nome. O erro persistiu depois disso, e o novo arquivo não pôde ser carregado.
    Solução : exclua o arquivo anormal, reinicie o Flume e jogue o arquivo no diretório novamente
Insira a descrição da imagem aqui

Caso 5: monitoramento de arquivos adicionais (upload retomado)

    Taildir Source pode não apenas realizar a transmissão recuperável de pontos de interrupção , mas também garantir que os dados não sejam perdidos, e também pode realizar monitoramento em tempo real.

Etapas do caso

  1. Crie um novo diretório: arquivo mkdir .

  2. Crie dois arquivos no diretório de arquivos: toque em um.txt , toque em dois.txt

  3. Crie o arquivo de configuração do Flume Agent taildir-flume-logger.conf , o tipo de origem é taildir e o tipo de coletor é logger

     # Name the components on this agent
     a1.sources = r1
     a1.channels = c1
     a1.sinks = k1
     
     # Describe/configure the source
     a1.sources.r1.type = TAILDIR
     a1.sources.r1.filegroups = f1
     a1.sources.r1.filegroups.f1 = /opt/flume-1.9.0/file/.*\.txt
     a1.sources.r1.positionFile = /opt/flume-1.9.0/file/position.json
     
     # Describe the sink
     a1.sinks.k1.type = logger
     
     # Use a channel which buffers events in memory
     a1.channels.c1.type = memory
     a1.channels.c1.capacity = 1000
     a1.channels.c1.transactionCapacity = 100
     
     # Bind the source and sink to the channel
     a1.sources.r1.channels = c1
     a1.sinks.k1.channel = c1
    
  4. Inicie o Flume.

     bin/flume-ng agent -c conf -f taildir-flume-logger.conf -n a1 -Dflume.root.logger=INFO,console
    
  5. Inicie um novo terminal, echo A >> one.txt , echo B >> two.txt
    Insira a descrição da imagem aqui

  6. Ctrl + c para fechar o Flume, digite echo C >> one.txt , echo D >> two.txt , reinicie o Flume
    Insira a descrição da imagem aqui

  7. Olhando em position.json, você pode descobrir que o arquivo registra a última localização modificada do arquivo, portanto, pode ser retomado com um ponto de interrupção. (Os sistemas Unix / Linux não usam nomes de arquivo internamente, mas usam inodes para identificar arquivos)
    Insira a descrição da imagem aqui

Problema anormal

    O arquivo de configuração atribui dois arquivos a f1 e, finalmente, one.txt não pode ser monitorado, mas two.txt pode.

a1.sources.r1.filegroups.f1 = /opt/flume-1.9.0/file/one.txt
a1.sources.r1.filegroups.f1 = /opt/flume-1.9.0/file/two.txt

    Isso ocorre porque o segundo substitui o primeiro. Use expressões regulares ou duas variáveis ​​f1, f2.

Acho que você gosta

Origin blog.csdn.net/H_X_P_/article/details/106542199
Recomendado
Clasificación