Flume es el más fácil de usar.


1. Introducción

1. Definición

Flume es un sistema de transmisión, agregación y recopilación masiva de registros distribuido, altamente confiable y altamente disponible proporcionado por Cloudera.

Flume se basa en una arquitectura de transmisión y es flexible y simple.

  1. Dirección del sitio web oficial de Flume: http://flume.apache.org
  2. Dirección de visualización de documentos: http://flume.apache.org/FlumeUserGuide.html
  3. Dirección de descarga: http://archive.apache.org/dist/flume

Insertar descripción de la imagen aquí

2. Infraestructura

La estructura de composición de Flume se muestra en la siguiente figura:

Insertar descripción de la imagen aquí

  • Agente

Agente: la unidad de implementación de Flume es esencialmente un proceso JVM: el Agente envía internamente datos desde el origen al destino en forma de eventos.

Composición: El agente consta principalmente de tres partes: fuente, canal y sumidero.

  • Fuente

Fuente: es el componente responsable de recibir datos al Flume Agent.
Características: El componente de origen puede manejar datos de registro de varios tipos y formatos.Tipo
de componente de origen:

  1. avro: Es esencialmente un marco RPC que admite la transmisión de datos entre idiomas y plataformas. Avro Source se utiliza principalmente para conexiones de agentes en Flume.
  2. netcat: Netcat Source, esencialmente una herramienta de puerto en Linux, se utiliza en Flume para recopilar datos de transmisión de puerto.
  3. exec: Admite la ejecución de comandos y utiliza la salida estándar después de la ejecución del comando como recopilación de datos. Se utiliza principalmente para recopilar un archivo anexable.
  4. spooling directory: Admite monitorear un directorio y recopilar uno o más datos de archivos recién generados en el directorio.
  5. taildir: Admite el monitoreo de múltiples directorios, recopila uno o más archivos anexables en uno o más directorios y admite la reanudación de la descarga en puntos de interrupción.
  6. Además, existen: ahorro, jms, generador de secuencia, syslog, http, fuente personalizada.
  • Hundir

Sink: Es el componente de Flume Agent encargado de enviar datos a sistemas externos.
Características: el componente Sink sondea continuamente los eventos en el canal y los elimina en lotes, y escribe estos eventos en el sistema de almacenamiento o indexación en lotes y transacciones, o los envía a otro agente Flume.
Tipo de componente del fregadero:

  1. logger: El componente Logger Sink escribe datos en el registro de ejecución del marco Flume. Con el parámetro de ejecución -Dflume.root.logger=INFO, la consola puede generar el registro de ejecución de Flume (que contiene los datos recopilados) a la consola. Se utiliza principalmente en entornos de prueba.
  2. hdfs: El componente hdfs Sink es responsable de transferir datos al sistema de archivos distribuido HDFS.
  3. avro: El componente avro Sink coopera con el componente avro Source para realizar la conexión del Agente.
  4. file: El componente File Sink envía directamente los datos recopilados al sistema de archivos local, es decir, al disco de Linux.
  5. Además, existen: thrift, ipc, HBase, solr y custom Sink.
  • Canal

**Canal:** es responsable de almacenar datos temporalmente y es un búfer entre los componentes de origen y receptor.
Características:

  1. Debido a la existencia del componente Canal, los componentes Fuente y Sumidero pueden funcionar a velocidades diferentes.
  2. El canal es seguro para subprocesos y puede manejar operaciones de escritura desde varias fuentes y operaciones de lectura desde varios receptores al mismo tiempo.

Flume viene con dos canales:

  1. Canal de memoria: evento de almacenamiento en cola basado en memoria, adecuado para escenarios que no requieren alta seguridad de datos. Rápido, no seguro
  2. Canal de archivos: basado en eventos de almacenamiento en disco, los datos no se perderán durante el tiempo de inactividad y es adecuado para escenarios con alta sensibilidad a la seguridad de los datos. Lento y seguro
  • Evento

Evento: Evento en agente, la unidad básica de transmisión de datos de Flume, envía datos desde el origen al destino en forma de Evento.
Características: El evento consta de dos partes: encabezado y cuerpo.

  1. Encabezado: se utiliza para almacenar algunos atributos del evento, que es una estructura KV.
  2. Cuerpo: se utiliza para almacenar este dato, en forma de matriz de bytes.

2. Inicio rápido

1. Descomprima el canal

wget https://gitcode.net/weixin_44624117/software/-/raw/master/software/Linux/Flume/apache-flume-1.9.0-bin.tar.gz

descomprimir archivos

tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /opt/module/

Modificar el nombre del directorio de archivos

mv /opt/module/apache-flume-1.9.0-bin /opt/module/flume-1.9.0

Elimine la carpeta lib guava-11.0.2.jarpor compatibilidadHadoop 3.1.3

rm /opt/module/flume-1.9.0/lib/guava-11.0.2.jar

2. Caso 1: Número de puerto de monitoreo

Utilice Flume para escuchar un puerto, recopilar los datos del puerto e imprimirlos en la consola.

Insertar descripción de la imagen aquí

Instale la herramienta netcat (envíe la solicitud HTTP)

sudo yum install -y nc

Determinar si el puerto 44444 está ocupado

sudo netstat -nlp | grep 44444

En el directorio Flume, cree una tarea de trabajo.

cd /opt/module/flume-1.9.0
mkdir -p job/simpleCase
cd /opt/module/flume-1.9.0/job/simpleCase

Agregar archivo de configuración

Nota: El archivo de configuración proviene del manual oficial http://flume.apache.org/FlumeUserGuide.html

vim flume-1-netcat-logger.con
#Name the components on this agent
a1.sources = r1 
a1.sinks = k1 
a1.channels = c1

# 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

explicar:

#Name the components on this agent
a1.sources = r1                                      # 为a1的Source组件命名为r1,多个组件用空格间隔
a1.sinks = k1                                        # 为a1的Sink组件命名为k1,多个组件用空格间隔
a1.channels = c1                                    # 为a1的Channel组件命名为c1,多个组件用空格间隔

# Describe/configure the source
a1.sources.r1.type = netcat                      # 配置r1的类型
a1.sources.r1.bind = localhost                  # 配置r1的绑定地址(注意localhost和hadoop102的区别)
a1.sources.r1.port = 44444                       # 配置r1的监听端口

# Describe the sink
a1.sinks.k1.type = logger                        # 配置k1的类型为logger,输出到控制台

# Use a channel which buffers events in memory
a1.channels.c1.type = memory                    # 配置c1的类型为memory
a1.channels.c1.capacity = 1000                 # 配置c1的容量为1000个事件
a1.channels.c1.transactionCapacity = 100     # 配置c1的事务容量为100个事件

# Bind the source and sink to the channel
a1.sources.r1.channels = c1                    # 配置r1的channel属性,指定r1连接到那个channel
a1.sinks.k1.channel = c1                        # 配置k1的channel属性,指定k1连接到那个channel

Ejecute el puerto de escucha de Flume

#	方式一:
bin/flume-ng agent --conf conf/ --name a1 --conf-file job/simpleCase/flume-1-netcat-logger.conf -Dflume.root.logger=INFO,console
#	方式二:
 bin/flume-ng agent -c conf/ -n a1 -f job/simpleCase/flume-1-netcat-logger.conf -Dflume.root.logger=INFO,console

Descripción de parámetros:

  • --conf/-c: Indica que el archivo de configuración está almacenado en el directorio conf/
  • --name/-n: Indica nombrar al agente a1
  • --conf-file/-f: Especifica que el archivo de configuración que se leerá es el archivo flume-1-1netcat-logger.conf en la carpeta job/simpleCase.
  • -Dflume.root.logger=INFO,console:-D significa modificar dinámicamente el valor del atributo del parámetro flume.root.logger cuando flume se está ejecutando y establecer el nivel de impresión del registro de la consola en el nivel INFO. Los niveles de registro incluyen: registro, información, advertencia, error.

**Prueba:** Inicie nc en Hadoop101 y envíe la solicitud

nc localhost 44444
hello
world
hello world

Insertar descripción de la imagen aquí

3. Caso 2: Archivos en directorios vacíos

Selección de fuente:

  • Fuente ejecutiva: adecuada para monitorear un archivo adjunto en tiempo real y no puede lograr la reanudación del punto de interrupción;
  • Spooldir Source: adecuado para sincronizar archivos nuevos, pero no adecuado para monitorear y sincronizar archivos con registros de anexos en tiempo real;
  • Taildir Source: Adecuado para monitorear múltiples archivos adjuntos en tiempo real y capaz de reanudar descargas en puntos de interrupción.

Requisitos del caso:

  • Utilice Flume para monitorear todo el directorio en busca de archivos adjuntos en tiempo real y cárguelos en HDFS.

Insertar descripción de la imagen aquí

Crear archivo de configuración

cd /opt/module/flume-1.9.0/job/simpleCase
vim flume-2-taildir-hdfs.conf

Archivo de configuración

# Name the components on this agent
a2.sources = r1
a2.sinks = k1
a2.channels = c1

# Describe/configure the source
a2.sources.r1.type = TAILDIR
a2.sources.r1.positionFile = /opt/module/flume-1.9.0/tail_dir.json
a2.sources.r1.filegroups = f1 f2
a2.sources.r1.filegroups.f1 = /opt/module/flume-1.9.0/datas/tailCase/files/.*file.*
a2.sources.r1.filegroups.f2 = /opt/module/flume-1.9.0/datas/tailCase/logs/.*log.*

# Describe the sink
a2.sinks.k1.type = hdfs
a2.sinks.k1.hdfs.path = hdfs://hadoop101:8020/flume/tailDir/%Y%m%d/%H
# 上传文件的前缀
a2.sinks.k1.hdfs.filePrefix = tail-
# 是否按照时间滚动文件夹
a2.sinks.k1.hdfs.round = true
# 多少时间单位创建一个新的文件夹
a2.sinks.k1.hdfs.roundValue = 1
# 重新定义时间单位
a2.sinks.k1.hdfs.roundUnit = hour
# 是否使用本地时间戳
a2.sinks.k1.hdfs.useLocalTimeStamp = true
# 积攒多少个Event才flush到HDFS一次
a2.sinks.k1.hdfs.batchSize = 100
# 设置文件类型,(可选择设置支持压缩的CompressedStream或者不支持压缩的DataStream) 
a2.sinks.k1.hdfs.fileType = DataStream
# 多久生成一个新的文件
a2.sinks.k1.hdfs.rollInterval = 60
# 设置每个文件的滚动大小大概是128M
a2.sinks.k1.hdfs.rollSize = 134217700
# 文件的滚动与Event数量无关
a2.sinks.k1.hdfs.rollCount = 0

# Use a channel which buffers events in memory
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1

Iniciar monitoreo

cd /opt/module/flume-1.9.0
bin/flume-ng agent --conf conf/ --name a2 --conf-file job/simpleCase/flume-2-taildir-hdfs.conf

prueba

Crear un nuevo directorio monitoreado

mkdir -p datas/tailCase/files
mkdir -p datas/tailCase/logs

/opt/module/flume/datas/Cree una carpeta en el directorio y tailCase/filesagregue contenido a los archivos en la carpeta de archivos

prueba/opt/module/flume-1.9.0/datas/tailCase/files/.*file.*

#	当前目录下会上传file的文件
cd /opt/module/flume-1.9.0/datas/tailCase/files

touch file1.txt
echo I am file1 >> file1.txt
touch log1.txt
echo I am log1 >> log1.txt

prueba:/opt/module/flume-1.9.0/datas/tailCase/logs/.*log.*

#	当前目录下,会上传 log的文件
cd /opt/module/flume-1.9.0/datas/tailCase/logs
touch file2.txt
echo I am file2 >> file2.txt
touch log2.txt
echo I am log2 >> log2.txt

Subir archivos a HDFS

Insertar descripción de la imagen aquí

Monitoreo de reanudación de puntos de interrupción

Apague el programa de recolección de flume, agregue archivos en logs/ y files/, luego encienda el programa de recolección de flume para verificar la reanudación del punto de interrupción de flume.

Taildir Source mantiene un archivo de posición en formato json, que actualiza periódicamente la última posición leída por cada archivo en el archivo de posición, para que pueda reanudar la descarga en un punto de interrupción. El formato del archivo de posición es el siguiente:

{
    
    "inode":2496272,"pos":12,"file":"/opt/module/flume/datas/tailCase/files/file1.txt"}
{
    
    "inode":2496275,"pos":12,"file":"/opt/module/flume/datas/tailCase/logs/log2.txt"}

Nota: El área donde se almacenan los metadatos de los archivos en Linux se llama inodo. Cada inodo tiene un número. El sistema operativo usa números de inodo para identificar diferentes archivos. Los sistemas Unix/Linux no usan nombres de archivos internamente, pero usan números de inodo para identificar archivos. . .

3. Canal avanzado

1. Asuntos de canal

Insertar descripción de la imagen aquí

Hay dos transacciones en Flume.

  • Transacción de colocación: entre el componente Fuente y el componente Canal, asegurando la confiabilidad de la transferencia de datos desde el componente Fuente al componente Canal.
  • Realizar transacción: entre el componente del canal y el componente del sumidero, garantice la confiabilidad de la transmisión de datos desde el componente del canal al componente del sumidero.

Poner proceso de transacción

  1. El componente de origen recopila datos externos en el agente y los empaqueta en eventos.
  2. El componente de origen comienza a transmitir eventos al componente de canal.
  3. Primero, se iniciará una transacción. Dentro de la transacción, un lote de datos se colocará en la lista de venta para su almacenamiento mediante el método doPut.
  4. Después de eso, llame al método doCommit para colocar todos los eventos en putList en el canal. Después del éxito, putList se borra.

Mecanismo de reintento fallido

  • Antes de que putList envíe datos en el canal, primero verificará si se puede acomodar la capacidad en el canal. Si no se puede acomodar, no colocará ningún dato y llamará a doRollback.
  • Después de llamar al método doRollback, el método doRollback realizará dos pasos:
    • Borrar putList.
    • Lanza ChannelException.
  • Después de que el componente de origen detecta la excepción lanzada por doRollback, el origen vuelve a recopilar el lote de datos anterior y luego inicia una nueva transacción.
  • El tamaño del lote de datos depende del valor del parámetro de configuración tamaño del lote del componente de origen.
  • El tamaño de putList depende del valor del parámetro de configuración transactionCapacity del componente Canal (el parámetro de capacidad se refiere a la capacidad del Canal).

Tomar proceso de transacción

  1. El componente Sink sondea continuamente el canal e inicia la transacción de toma cuando llegan nuevos eventos.
  2. Una vez iniciada la transacción de toma, se llamará al método doTake para cortar el evento en el componente del canal en la lista de tomas.
  3. Cuando el número del tamaño del lote de eventos se almacena en takeList, se llamará al método doCommit.
  4. En el método doCommit, los datos primero se escribirán en el sistema externo y la takeList se borrará después del éxito.
  5. Cuando la transacción falla, se llamará al método doRollback para revertir, es decir, los datos en takeList se devolverán intactos al canal.

2. Principios internos de Flume Agent

Insertar descripción de la imagen aquí

Nombre del componente Descripción general El componente contiene tipo Características
Selector de Canales Seleccione el canal al que se enviará el evento. Selector de canales de replicación Copiar, opción predeterminada
Selector de canales de multiplexación Multiplexación
FregaderoProcesador Logre diferentes funciones configurando diferentes tipos de SinkProcess Procesador de fregadero predeterminado Fregadero único, predeterminado
Procesador de equilibrio de carga balanceo de carga
Procesador de conmutación por error conmutación por error

Proceso de implementación

  1. El componente Fuente recopila datos externos en el agente y los empaqueta como Evento
  2. Luego, envíe el evento al ChannelProcessor,
    • A través de la interceptación y filtrado de cada interceptor en la cadena de interceptores, los eventos que cumplan con los requisitos se devolverán al ChannelProcessor.
    • Después de pasar ChannelSelector, decida a qué canal irá el evento en función de los diferentes selectores y luego regrese a ChannelProcessor.
  3. Inicie la transacción Put y envíe lotes de Eventos al Canal
  4. Dependiendo del tipo de configuración del componente SinkProcessor y las funciones correspondientes (equilibrio de carga o conmutación por error), eventualmente habrá un solo Sink que pueda extraer datos al mismo tiempo.
  5. El componente Sink sondea continuamente el canal y, cuando llega un nuevo evento al canal, se escribe en el sistema externo.

3. Caso 1: Registro de seguimiento

necesidad:

  • Utilice Flume-1 para monitorear los cambios de archivos.
  • Flume-1 pasa el contenido modificado a Flume-2, y Flume-2 es responsable de almacenarlo en HDFS.
  • Al mismo tiempo, Flume-1 pasa los cambios a Flume-3, y Flume-3 es responsable de enviarlos al sistema de archivos local.

Insertar descripción de la imagen aquí

Archivo de registro de simulación: /opt/module/flume/datas/cree un archivo de registro de simulación en el directoriorealtime.log

mkdir -p /opt/module/flume-1.9.0/datas
touch /opt/module/flume-1.9.0/datas/realtime.log

Archivo de configuración copiado: /opt/module/flume/jobcree enterprise/copyuna carpeta en el directorio

mkdir -p /opt/module/flume-1.9.0/job/enterprise/copy
  • Fuente:flume-1-exec-avro.conf
  • Fregadero: ``flume-2-avro-hdfs flume-3-avro-file`

Perfil 1::flume-1-exec-avro.conf

vim /opt/module/flume-1.9.0/job/enterprise/copy/flume-1-exec-avro.conf
# Name the components on this agent
a1.sources = r1
a1.sinks = k1 k2
a1.channels = c1 c2
# 将数据流复制给所有channel,其实默认就是replicating
a1.sources.r1.selector.type = replicating

# Describe/configure the source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /opt/module/flume-1.9.0/datas/realtime.log
a1.sources.r1.shell = /bin/bash -c

# Describe the sink
# sink端的avro是一个数据发送者
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop101
a1.sinks.k1.port = 4141

a1.sinks.k2.type = avro
a1.sinks.k2.hostname = hadoop101
a1.sinks.k2.port = 4142

# Describe the channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

a1.channels.c2.type = memory
a1.channels.c2.capacity = 1000
a1.channels.c2.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2

Perfil 2:flume-2-avro-hdfs.conf

vim /opt/module/flume-1.9.0/job/enterprise/copy/flume-2-avro-hdfs.conf
# Name the components on this agent
a2.sources = r1
a2.sinks = k1
a2.channels = c1

# Describe/configure the source
# source端的avro是一个数据接收服务
a2.sources.r1.type = avro
a2.sources.r1.bind = hadoop101
a2.sources.r1.port = 4141

# Describe the sink
a2.sinks.k1.type = hdfs
a2.sinks.k1.hdfs.path = hdfs://hadoop101:8020/flume/copy/%Y%m%d/%H
# 上传文件的前缀
a2.sinks.k1.hdfs.filePrefix = copy-
# 是否按照时间滚动文件夹
a2.sinks.k1.hdfs.round = true
# 多少时间单位创建一个新的文件夹
a2.sinks.k1.hdfs.roundValue = 1
# 重新定义时间单位
a2.sinks.k1.hdfs.roundUnit = hour
# 是否使用本地时间戳
a2.sinks.k1.hdfs.useLocalTimeStamp = true
# 积攒多少个Event才flush到HDFS一次
a2.sinks.k1.hdfs.batchSize = 100
# 设置文件类型,可支持压缩
a2.sinks.k1.hdfs.fileType = DataStream
# 多久生成一个新的文件
a2.sinks.k1.hdfs.rollInterval = 60
# 设置每个文件的滚动大小大概是128M
a2.sinks.k1.hdfs.rollSize = 134217700
# 文件的滚动与Event数量无关
a2.sinks.k1.hdfs.rollCount = 0

# Describe the channel
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1

Perfil 3:flume-3-avro-file.conf

vim /opt/module/flume-1.9.0/job/enterprise/copy/flume-3-avro-file.conf
# Name the components on this agent
a3.sources = r1
a3.sinks = k1
a3.channels = c2

# Describe/configure the source
a3.sources.r1.type = avro
a3.sources.r1.bind = hadoop101
a3.sources.r1.port = 4142

# Describe the sink
a3.sinks.k1.type = file_roll
a3.sinks.k1.sink.directory = /opt/module/flume-1.9.0/datas/copy_result

# Describe the channel
a3.channels.c2.type = memory
a3.channels.c2.capacity = 1000
a3.channels.c2.transactionCapacity = 100

# Bind the source and sink to the channel
a3.sources.r1.channels = c2
a3.sinks.k1.channel = c2
mkdir /opt/module/flume-1.9.0/datas/copy_result
cd /opt/module/flume-1.9.0
bin/flume-ng agent -c conf/ -n a3 -f /opt/module/flume-1.9.0/job/enterprise/copy/flume-3-avro-file.conf
bin/flume-ng agent -c conf/ -n a2 -f /opt/module/flume-1.9.0/job/enterprise/copy/flume-2-avro-hdfs.conf
bin/flume-ng agent -c conf/ -n a1 -f /opt/module/flume-1.9.0/job/enterprise/copy/flume-1-exec-avro.conf
echo 2021-10-41 09-10-32 >> /opt/module/flume-1.9.0/datas/realtime.log

4. Caso 2: Multiplexación y adaptación del interceptor

4.1 Principio

necesidad:

Cuando se utiliza Flume para recopilar datos de registro del puerto del servidor, es necesario enviar diferentes tipos de registros a diferentes sistemas de análisis según los diferentes tipos de registros.

principio

  • Antecedentes: en el desarrollo real, un servidor puede generar muchos tipos de registros y es posible que sea necesario enviar diferentes tipos de registros a diferentes sistemas de análisis. La estructura en se
    utilizará en este momento .Flumechannel selecterMultiplexing
  • El principio de multiplexación es enviar diferentes eventos a diferentes canales según el valor de una determinada clave del encabezado del evento.
  • Custom Interceptor: implementa asignar diferentes valores a las claves en el Header de diferentes tipos de eventos.
  • Resumen: En este caso, utilizamos datos del puerto para simular registros y números y letras para simular diferentes tipos de registros. Necesitamos personalizar el interceptor para distinguir números y letras y enviarlos a diferentes sistemas de análisis (Canal).

Insertar descripción de la imagen aquí

4.2 Escritura de código

configuración maven

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.lydms</groupId>
  <artifactId>first-flume</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>first-flume</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>


    <dependency>
      <groupId>org.apache.flume</groupId>
      <artifactId>flume-ng-core</artifactId>
      <version>1.9.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>6</source>
          <target>6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

interfaz:

package com.lydms.flume.interceptor;

import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;

import java.util.List;

public class CustomInterceptor implements Interceptor {
    
    


    @Override
    public void initialize() {
    
    
    }

    @Override
    public Event intercept(Event event) {
    
    
        // 1. 从事件中获取数据
        byte[] body = event.getBody();
        // 2. 判断数据开头的字符是字母还是数据
        if (body[0] >= 'a' && body[0] <= 'z') {
    
    
            event.getHeaders().put("type", "letter");         // 是字母就在事件头部设置type类型为letter
        } else if (body[0] >= '0' && body[0] <= '9') {
    
    
            event.getHeaders().put("type", "number");         // 是数字就在事件头部设置type类型为number
        }
        // 3. 返回事件
        return event;

    }

    // 对批量事件进行拦截
    @Override
    public List<Event> intercept(List<Event> events) {
    
    
        for (Event event : events) {
    
    
            intercept(event);
        }
        return events;
    }

    @Override
    public void close() {
    
    
    }

    // 拦截器对象的构造对象
    public static class Builder implements Interceptor.Builder {
    
    

        @Override
        public Interceptor build() {
    
    
            return new CustomInterceptor();
        }

        @Override
        public void configure(Context context) {
    
    
        }
    }
}

Empaquete el proyecto e impórtelo al directorio lib de flume ( /opt/module/flume-1.9.0/lib).

4.3 Escribir archivos de configuración

Hadoop101:Agregar archivo de configuración

mkdir -p /opt/module/flume-1.9.0/job/custom/multi
vim /opt/module/flume-1.9.0/job/custom/multi/flume-1-netcat-avro.conf
# Name the components on this agent
a1.sources = r1
a1.sinks = k1 k2
a1.channels = c1 c2

# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
a1.sources.r1.interceptors = i1
#	Java文件目录
a1.sources.r1.interceptors.i1.type = com.lydms.flume.interceptor.CustomInterceptor$Builder
a1.sources.r1.selector.type = multiplexing
a1.sources.r1.selector.header = type
a1.sources.r1.selector.mapping.letter = c1
a1.sources.r1.selector.mapping.number = c2

# Describe the sink
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop102
a1.sinks.k1.port = 4141

a1.sinks.k2.type=avro
a1.sinks.k2.hostname = hadoop103
a1.sinks.k2.port = 4242

# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Use a channel which buffers events in memory
a1.channels.c2.type = memory
a1.channels.c2.capacity = 1000
a1.channels.c2.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2

Hadoop102:Agregar archivo de configuración

mkdir -p /opt/module/flume-1.9.0/job/custom/multi
vim /opt/module/flume-1.9.0/job/custom/multi/flume-2-avro-logger.conf
# agent
a2.sources=r1
a2.sinks = k1
a2.channels = c1

# source
a2.sources.r1.type = avro
a2.sources.r1.bind = hadoop102
a2.sources.r1.port = 4141

# sink
a2.sinks.k1.type = logger

# Channel
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100

# bind
a2.sinks.k1.channel = c1
a2.sources.r1.channels = c1

Hadoop103:Agregar archivo de configuración

mkdir -p /opt/module/flume-1.9.0/job/custom/multi
vim /opt/module/flume-1.9.0/job/custom/multi/flume-3-avro-logger.conf
# agent
a3.sources = r1
a3.sinks = k1
a3.channels = c1

# source
a3.sources.r1.type = avro
a3.sources.r1.bind = hadoop103
a3.sources.r1.port = 4242

# sink
a3.sinks.k1.type = logger

# Channel
a3.channels.c1.type = memory
a3.channels.c1.capacity = 1000
a3.channels.c1.transactionCapacity = 100

# bind
a3.sinks.k1.channel = c1
a3.sources.r1.channels = c1
4.4 Pruebas

Proyecto de inicio

cd /opt/module/flume-1.9.0
bin/flume-ng agent -c conf/ -n a3 -f /opt/module/flume-1.9.0/job/custom/multi/flume-3-avro-logger.conf -Dflume.root.logger=INFO,console
bin/flume-ng agent -c conf/ -n a2 -f /opt/module/flume-1.9.0/job/custom/multi/flume-2-avro-logger.conf -Dflume.root.logger=INFO,console
bin/flume-ng agent -c conf/ -n a1 -f /opt/module/flume-1.9.0/job/custom/multi/flume-1-netcat-avro.conf -Dflume.root.logger=INFO,console

prueba:

nc localhost 44444
hello
world
1231231
41341

Insertar descripción de la imagen aquí

5. Caso 3: Agregación

Caso:

  • hadoop102:archivo de monitoreo flume-1 /opt/module/flume-1.9.0/datas/.*file*.,
  • hadoop103:flume-2 monitorea el flujo de datos de un determinado puerto.
  • hadoop104:flume-3, recibe flume-1la flume-2suma de datos y flume-3 imprime los datos finales en la consola.

Insertar descripción de la imagen aquí

Hadoop101:Archivo de configuraciónflume-1-exec-avro.conf

mkdir /opt/module/flume-1.9.0/job/enterprise/juhe
vim /opt/module/flume-1.9.0/job/enterprise/juhe/flume-1-exec-avro.conf
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /opt/module/flume-1.9.0/datas/realtime.log
a1.sources.r1.shell = /bin/bash -c

# Describe the sink
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop103
a1.sinks.k1.port = 4141

# Describe the channel
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

Hadoop102 :Archivo de configuraciónflume-2-netcat-avro.conf

mkdir -p /opt/module/flume-1.9.0/job/enterprise/juhe
vim /opt/module/flume-1.9.0/job/enterprise/juhe/flume-2-netcat-avro.conf
# Name the components on this agent
a2.sources = r1
a2.sinks = k1
a2.channels = c1

# Describe/configure the source
a2.sources.r1.type = netcat
a2.sources.r1.bind = hadoop102
a2.sources.r1.port = 44444

# Describe the sink
a2.sinks.k1.type = avro
a2.sinks.k1.hostname = hadoop103
a2.sinks.k1.port = 4141

# Use a channel which buffers events in memory
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1

Hadoop103:Archivo de configuraciónflume-1-exec-avro.conf

mkdir -p /opt/module/flume-1.9.0/job/enterprise/juhe
vim /opt/module/flume-1.9.0/job/enterprise/juhe/flume-3-avro-logger.conf
# Name the components on this agent
a3.sources = r1
a3.sinks = k1
a3.channels = c1

# Describe/configure the source
a3.sources.r1.type = avro
a3.sources.r1.bind = hadoop103
a3.sources.r1.port = 4141

# Describe the sink
a3.sinks.k1.type = logger

# Describe the channel
a3.channels.c1.type = memory
a3.channels.c1.capacity = 1000
a3.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a3.sources.r1.channels = c1
a3.sinks.k1.channel = c1

prueba:

#	Hadoop103
/opt/module/flume-1.9.0/bin/flume-ng agent –c conf/ -n a3 -f /opt/module/flume-1.9.0/job/enterprise/juhe/flume-3-avro-logger.conf -Dflume.root.logger=INFO,console
#	Hadoop102
/opt/module/flume-1.9.0/bin/flume-ng agent –c conf/ -n a2 -f /opt/module/flume-1.9.0/job/enterprise/juhe/flume-2-netcat-avro.conf
#	Hadoop101
/opt/module/flume-1.9.0/bin/flume-ng agent –c conf/ -n a1 -f /opt/module/flume-1.9.0/job/enterprise/juhe/flume-1-exec-avro.conf

Hadoop101: Añade contenido /opt/module/flume/datas/al directorio.realtime.log

echo 'Hello Worlld Hadoop101' > /opt/module/flume-1.9.0/datas/realtime.log

Hadoop102: 44444Enviar datos al puerto

nc hadoop102 44444
hello world

Hadoop103: Ver datos

Insertar descripción de la imagen aquí

4. Monitoreo del flujo de datos del canal

1. Introducción a los ganglios

Los ganglios constan de tres partes: gmond, gmetad y gweb.

  • gmond (Ganglia Monitoring Daemon):
    es un servicio liviano instalado en cada host de nodo que necesita recopilar datos de indicadores.
    Con gmond, puede recopilar fácilmente muchos datos indicadores del sistema, como CPU, memoria, disco, red y datos de procesos activos.
  • gmetad (Ganglia Meta Daemon):
    un servicio que integra toda la información y la almacena en el disco en formato RRD.
  • gweb (Ganglia Web) Herramienta de visualización de Ganglia:
    gweb es una interfaz PHP que utiliza un navegador para mostrar datos almacenados por gmetad.
    Una variedad de datos de indicadores diferentes recopilados bajo el estado de ejecución del clúster se muestran gráficamente en la interfaz web.

2. Planificación de la implementación

web metada mod
Hadoop101 tura verdadero verdadero
Hadoop102 verdadero
Hadoop103 verdadero

Pasos de instalación

#	Hadoop101
sudo yum -y install epel-release
sudo yum -y install ganglia-gmetad
sudo yum -y install ganglia-web
sudo yum -y install ganglia-gmond

#	Hadoop102
sudo yum -y install epel-release
sudo yum -y install ganglia-gmond

#	Hadoop103
sudo yum -y install epel-release
sudo yum -y install ganglia-gmond

3. Modifique el archivo de configuración:hadoop101

Modificar configuración: Hadoop101

  • Modificar archivo de configuración/etc/httpd/conf.d/ganglia.conf
sudo vim /etc/httpd/conf.d/ganglia.conf
#	修改内容(2种配置。二选一)
Require ip 192.168.1.1          
#	Require all granted  

Insertar descripción de la imagen aquí

Modificar archivo de configuración/etc/ganglia/gmetad.conf

sudo vim /etc/ganglia/gmetad.conf
#	修改内容
data_source "my cluster" hadoop101

Insertar descripción de la imagen aquí

Modificar archivo de configuración/etc/selinux/config

sudo vim /etc/selinux/config
#	修改内容
SELINUX=disabled
SELINUXTYPE=targeted

4. Modificar el archivo de configuración3台

Modificar configuración: Hadoop101, Hadoop102, Hadoop103

Modificar archivo de configuración/etc/sudganglia/gmond.conf

sudo vim /etc/ganglia/gmond.conf 
#	修改内容==================
# 数据发送给hadoop101
host = hadoop101

# 接收来自任意连接的数据
bind = 0.0.0.0

Insertar descripción de la imagen aquí

5. Inicie el servicio

Modificar permisos de archivos

chown ganglia:ganglia /var/lib/ganglia
sudo chmod -R 777 /var/lib/ganglia

Script de inicio (Hadoop101)

sudo systemctl start gmond
sudo systemctl start httpd
sudo systemctl start gmetad

Dirección de conexión: http://hadoop101/ganglia

Cuando no se pueda ver la página, modifique el archivo de configuración y reinicie.

Require ip 192.168.1.1  

Insertar descripción de la imagen aquí

3. Prueba

Insertar descripción de la imagen aquí
EventPutAttemptCountsource El número total de eventos que se intentaron escribir en el canal.
Insertar descripción de la imagen aquíEventPutSuccessCountEl número total de eventos escritos exitosamente en el canal y enviados. imagenHora de iniciocanalDetener hora
imagenEventTakeAttemptCountsource El número total de eventos que se intentaron escribir en el canal. imagenEventTakeSuccessCountEl número total de eventos escritos exitosamente en el canal y enviados. imagenStopTimehora de parada del canal
imagenChannelSizeEl número total de eventos en el canal actual imagenChannelFillPercentageporcentaje de ocupación del canal imagenCapacidad del canalCapacidad del canal

Supongo que te gusta

Origin blog.csdn.net/weixin_44624117/article/details/133219833
Recomendado
Clasificación