Colector de registro distribuido-Canal

Descripción general del canal

Documentos oficiales:

Flume es un servicio de recopilación de datos de registro distribuido, altamente confiable y altamente disponible que puede recopilar, agregar y mover de manera eficiente grandes cantidades de datos de registro. Tiene una arquitectura simple y flexible basada en transmisión de datos. Es robusto y tolerante a fallas, tiene un mecanismo de confiabilidad ajustable y muchos mecanismos de recuperación y conmutación por error. Utiliza un modelo de datos simple y escalable para permitir el análisis en línea de aplicaciones.


Arquitectura de canal y componentes centrales

Diagrama de arquitectura de Flume:
Colector de registro distribuido-Canal

  • Fuente: recopila datos de la fuente al canal
  • Canal: canal de datos, que actúa como búfer y admite el almacenamiento persistente
  • Sink: envía los datos del canal al objetivo

Despliegue de canal

Prepare el entorno JDK:

[root@hadoop01 ~]# java -version
java version "11.0.8" 2020-07-14 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.8+10-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.8+10-LTS, mixed mode)
[root@hadoop01 ~]# 

Descarga Flum:

Copie el enlace de descarga para descargar:

[root@hadoop01 ~]# cd /usr/local/src
[root@hadoop01 /usr/local/src]# wget https://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.16.2.tar.gz
  • Sugerencias: Tenga en cuenta que si desea conectarse a Hadoop, debe ser compatible con la versión de Hadoop. Por ejemplo, el Hadoop que instalé aquí es la versión 2.6.0-cdh5.16.2, así que elija la versión CDH de Flume y asegúrese de que el número final de la versión también sea consistente. , De lo contrario, puede haber problemas de incompatibilidad. Si desea elegir la versión de Apache, se recomienda utilizar la compilación del código fuente y especificar la versión de Hadoop usted mismo.

Descomprima en un directorio adecuado:

[root@hadoop01 /usr/local/src]# tar -zxvf flume-ng-1.6.0-cdh5.16.2.tar.gz -C /usr/local
[root@hadoop01 /usr/local/src]# cd /usr/local/apache-flume-1.6.0-cdh5.16.2-bin/
[root@hadoop01 /usr/local/apache-flume-1.6.0-cdh5.16.2-bin]# ls
bin  CHANGELOG  cloudera  conf  DEVNOTES  docs  lib  LICENSE  NOTICE  README  RELEASE-NOTES  tools
[root@hadoop01 /usr/local/apache-flume-1.6.0-cdh5.16.2-bin]# 

Configure las variables de entorno:

[root@hadoop01 /usr/local/apache-flume-1.6.0-cdh5.16.2-bin]# vim ~/.bash_profile
export FLUME_HOME=/usr/local/apache-flume-1.6.0-cdh5.16.2-bin
export PATH=$PATH:$FLUME_HOME/bin
[root@hadoop01 /usr/local/apache-flume-1.6.0-cdh5.16.2-bin]# source ~/.bash_profile

Edite el archivo de configuración:

[root@hadoop01 ~]# cp $FLUME_HOME/conf/flume-env.sh.template $FLUME_HOME/conf/flume-env.sh
[root@hadoop01 ~]# vim $FLUME_HOME/conf/flume-env.sh
# 配置JDK
export JAVA_HOME=/usr/local/jdk/11
export JAVA_OPTS="-Xms100m -Xmx2000m -Dcom.sun.management.jmxremote"

flume-ngComando de prueba :

[root@hadoop01 ~]# flume-ng version
Flume 1.6.0-cdh5.16.2
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
Revision: df92badde3691ee3eb6074a177f0e96682345381
Compiled by jenkins on Mon Jun  3 03:49:33 PDT 2019
From source with checksum 9336bfa3ff8cfb5e20cd9d700135a2c1
[root@hadoop01 ~]# 

Flume caja real: recopila datos del puerto de red designado y los envía a la consola

La clave para usar Flume es escribir archivos de configuración:

  1. Configurar fuente
  2. Configurar canal
  3. Configurar fregadero
  4. Encadena los tres componentes anteriores juntos

Así que primero crea un archivo de configuración:

[root@hadoop01 ~]# vim $FLUME_HOME/conf/netcat-example.conf
# a1是agent的名称
a1.sources = r1    # source的名称
a1.sinks = k1      # sink的名称
a1.channels = c1   # channel的名称

# 描述和配置source
a1.sources.r1.type = netcat      # 指定source的类型为netcat
a1.sources.r1.bind = localhost   # 指定source的ip
a1.sources.r1.port = 44444       # 指定source的端口

# 定义sink
a1.sinks.k1.type = logger  # 指定sink类型,logger就是将数据输出到控制台

# 定义一个基于内存的channel
a1.channels.c1.type = memory               # channel类型
a1.channels.c1.capacity = 1000             # channel的容量
a1.channels.c1.transactionCapacity = 100   # channel中每个事务的最大事件数

# 将source和sink绑定到channel上,即将三者串连起来
a1.sources.r1.channels = c1   # 指定r1这个source的channel为c1
a1.sinks.k1.channel = c1      # 指定k1这个sink的channel为c1
  • Consejos: preste atención a borrar los comentarios después de los elementos de configuración; de lo contrario, se informará un error al iniciar

Inicie el agente:

[root@hadoop01 ~]# flume-ng agent --name a1 -c $FLUME_HOME/conf -f $FLUME_HOME/conf/netcat-example.conf -Dflume.root.logger=INFO,console

Luego telnetenvíe algunos datos al puerto 44444 por comando:

[root@hadoop01 ~]# telnet localhost 44444
...
hello flume
OK

En este momento, verá los datos recibidos impresos en la salida del canal:

2020-11-02 16:08:47,965 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 68 65 6C 6C 6F 20 66 6C 75 6D 65 0D             hello flume. }
  • El evento es la unidad básica de transmisión de datos FLume. Evento = encabezado opcional + matriz de bytes (cuerpo)

Flume caja real: monitorea un archivo y recopila nuevos datos en tiempo real y los envía a la consola

De manera similar, primero cree un archivo de configuración:

[root@hadoop01 ~]# vim $FLUME_HOME/conf/file-example.conf
# a1是agent的名称
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# 描述和配置source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -f /data/data.log
a1.sources.r1.shell = /bin/sh -c

# 定义sink
a1.sinks.k1.type = logger

# 定义一个基于内存的channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# 将source和sink绑定到channel上,即将三者串连起来
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

Crea un archivo de prueba:

[root@hadoop01 ~]# touch /data/data.log

Inicie el agente:

[root@hadoop01 ~]# flume-ng agent --name a1 -c $FLUME_HOME/conf -f $FLUME_HOME/conf/file-example.conf -Dflume.root.logger=INFO,console

Escribe contenido para data.log:

[root@hadoop01 ~]# echo "hello flume" >> /data/data.log 
[root@hadoop01 ~]# echo "hello world" >> /data/data.log

En este momento, en la salida del canal, verá que se imprimen los nuevos datos del archivo de monitoreo:

2020-11-02 16:21:26,946 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 68 65 6C 6C 6F 20 66 6C 75 6D 65                hello flume }
2020-11-02 16:21:38,707 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 68 65 6C 6C 6F 20 77 6F 72 6C 64                hello world }

Flume la recopilación de registros en tiempo real de casos reales en el servidor A al servidor B

Para lograr este requisito, debe utilizar Source y SInk de Avro. El diagrama de flujo es el siguiente:
Colector de registro distribuido-Canal

Para la comodidad de las pruebas, utilizo una máquina para la simulación aquí. Primero, el archivo de configuración de la máquina A es el siguiente:

[root@hadoop01 ~]# vim $FLUME_HOME/conf/exec-memory-avro.conf
# 定义各个组件的名称
exec-memory-avro.sources = exec-source
exec-memory-avro.sinks = avro-sink
exec-memory-avro.channels = memory-channel

# 描述和配置source
exec-memory-avro.sources.exec-source.type = exec
exec-memory-avro.sources.exec-source.command = tail -f /data/data.log
exec-memory-avro.sources.exec-source.shell = /bin/sh -c

# 定义sink
exec-memory-avro.sinks.avro-sink.type = avro
exec-memory-avro.sinks.avro-sink.hostname = hadoop01
exec-memory-avro.sinks.avro-sink.port = 44444

# 定义一个基于内存的channel
exec-memory-avro.channels.memory-channel.type = memory
exec-memory-avro.channels.memory-channel.capacity = 1000
exec-memory-avro.channels.memory-channel.transactionCapacity = 100

# 将source和sink绑定到channel上,即将三者串连起来
exec-memory-avro.sources.exec-source.channels = memory-channel
exec-memory-avro.sinks.avro-sink.channel = memory-channel

El archivo de configuración de la máquina B es el siguiente:

[root@hadoop01 ~]# vim $FLUME_HOME/conf/avro-memory-logger.conf
# 定义各个组件的名称
avro-memory-logger.sources = avro-source
avro-memory-logger.sinks = logger-sink
avro-memory-logger.channels = memory-channel

# 描述和配置source
avro-memory-logger.sources.avro-source.type = avro
avro-memory-logger.sources.avro-source.bind = hadoop01
avro-memory-logger.sources.avro-source.port = 44444

# 定义sink
avro-memory-logger.sinks.logger-sink.type = logger

# 定义一个基于内存的channel
avro-memory-logger.channels.memory-channel.type = memory
avro-memory-logger.channels.memory-channel.capacity = 1000
avro-memory-logger.channels.memory-channel.transactionCapacity = 100

# 将source和sink绑定到channel上,即将三者串连起来
avro-memory-logger.sources.avro-source.channels = memory-channel
avro-memory-logger.sinks.logger-sink.channel = memory-channel

Inicie el agente de la máquina B primero, de lo contrario, el agente de la máquina A puede informar un error si no puede monitorear el puerto de la máquina de destino:

[root@hadoop01 ~]# flume-ng agent --name avro-memory-logger -c $FLUME_HOME/conf -f $FLUME_HOME/conf/avro-memory-logger.conf -Dflume.root.logger=INFO,console

Inicie el agente de la máquina A:

[root@hadoop01 ~]# flume-ng agent --name exec-memory-avro -c $FLUME_HOME/conf -f $FLUME_HOME/conf/exec-memory-avro.conf -Dflume.root.logger=INFO,console

Escribe contenido para data.log:

[root@hadoop01 ~]# echo "hello flume" >> /data/data.log 
[root@hadoop01 ~]# echo "hello world" >> /data/data.log
[root@hadoop01 ~]# echo "hello avro" >> /data/data.log

En este momento, la salida del agente de la máquina B en la consola es la siguiente, por lo que nos hemos dado cuenta de la función de recopilar los registros del servidor A al servidor B en tiempo real:

2020-11-02 17:05:20,929 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 68 65 6C 6C 6F 20 66 6C 75 6D 65                hello flume }
2020-11-02 17:05:21,486 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 68 65 6C 6C 6F 20 77 6F 72 6C 64                hello world }
2020-11-02 17:05:51,505 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 68 65 6C 6C 6F 20 61 76 72 6F                   hello avro }

Integre Flume y Kafka para completar la recopilación de datos en tiempo real

En el ejemplo anterior, el Agente B envía los datos recopilados a la consola, pero en las aplicaciones reales obviamente no lo hace. En su lugar, generalmente envía los datos a una fuente de datos externa, como HDFS, ES, Kafka, etc. En la arquitectura de procesamiento de flujo en tiempo real, en la mayoría de los casos, Sink to Kafka, y luego los consumidores posteriores (uno o más) reciben los datos para el procesamiento en tiempo real. Como se muestra abajo:
Colector de registro distribuido-Canal

Entonces, según el ejemplo anterior, aquí se explica cómo integrar Kafka. En realidad, es muy simple, simplemente cambie Logger Sink a Kafka Sink. El proceso después de cambiar a Kafka es el siguiente:
Colector de registro distribuido-Canal

Cree un nuevo archivo de configuración con el siguiente contenido:

[root@hadoop01 ~]# vim $FLUME_HOME/conf/avro-memory-kafka.conf
# 定义各个组件的名称
avro-memory-kafka.sources = avro-source
avro-memory-kafka.sinks = kafka-sink
avro-memory-kafka.channels = memory-channel

# 描述和配置source
avro-memory-kafka.sources.avro-source.type = avro
avro-memory-kafka.sources.avro-source.bind = hadoop01
avro-memory-kafka.sources.avro-source.port = 44444

# 定义sink
avro-memory-kafka.sinks.kafka-sink.type = org.apache.flume.sink.kafka.KafkaSink
avro-memory-kafka.sinks.kafka-sink.brokerList = kafka01:9092
avro-memory-kafka.sinks.kafka-sink.topic = flume-topic
# 一个批次里发送多少消息
avro-memory-kafka.sinks.kafka-sink.batchSize = 5
# 指定采用的ack模式,可以参考kafka的ack机制
avro-memory-kafka.sinks.kafka-sink.requiredAcks = 1

# 定义一个基于内存的channel
avro-memory-kafka.channels.memory-channel.type = memory
avro-memory-kafka.channels.memory-channel.capacity = 1000
avro-memory-kafka.channels.memory-channel.transactionCapacity = 100

# 将source和sink绑定到channel上,即将三者串连起来
avro-memory-kafka.sources.avro-source.channels = memory-channel
avro-memory-kafka.sinks.kafka-sink.channel = memory-channel
  • Consejos: La configuración de Kafka Sink aquí es la versión 1.6.0. Se han realizado algunos cambios después de la 1.6.0. Si no está utilizando la versión 1.6.0, consulte la descripción de la configuración en el documento oficial

Una vez completada la configuración, inicie el Agente:

[root@hadoop01 ~]# flume-ng agent --name avro-memory-kafka -c $FLUME_HOME/conf -f $FLUME_HOME/conf/avro-memory-kafka.conf -Dflume.root.logger=INFO,console

Luego inicie otro agente:

[root@hadoop01 ~]# flume-ng agent --name exec-memory-avro -c $FLUME_HOME/conf -f $FLUME_HOME/conf/exec-memory-avro.conf -Dflume.root.logger=INFO,console

Inicie un consumidor de Kafka para observar fácilmente los datos recibidos por Kafka:

[root@kafka01 ~]# kafka-console-consumer.sh --bootstrap-server kafka01:9092 --topic flume-topic --from-beginning

Escribe contenido para data.log:

[root@hadoop01 ~]# echo "hello kafka sink" >> /data/data.log 
[root@hadoop01 ~]# echo "hello flume" >> /data/data.log 
[root@hadoop01 ~]# echo "hello agent" >> /data/data.log

En este momento, la consola del consumidor de Kafka normalmente generará el siguiente contenido, lo que demuestra que Flume y Kafka se han integrado con éxito:

[root@kafka01 ~]# kafka-console-consumer.sh --bootstrap-server kafka01:9092 --topic flume-topic --from-beginning

hello kafka sink
hello flume
hello agent

Supongo que te gusta

Origin blog.51cto.com/zero01/2546278
Recomendado
Clasificación