Tabla de contenido
2.1 Interceptores de Flume (interceptores)
2.2 Selectores de canal de Flume (selectores)
2.3 Procesadores de sumideros de Flume (procesadores)
3.Monitoreo en tiempo real de Flume
3.1 Monitoreo en tiempo real de registros de Hive y carga a HDFS
3.2 Supervisar varios archivos nuevos cargados en HDFS
4.2 Principio interno del agente de canal
5.3 Equilibrio de carga y conmutación por error
6.1 Ajuste de parámetros de canal
6.2 Mecanismo de transacción de Flume
6.3 ¿Se perderán los datos recopilados por Flume?
1.Definición de la flama
Fiume es un sistema de transmisión, agregación y recopilación masiva de registros distribuidos, altamente confiable y de alta disponibilidad proporcionado por Cloudera. Flume se basa en una arquitectura de transmisión, que es flexible y simple.
1.1 ¿Por qué elegir Flume?
La función principal de Flume es leer los datos del disco local del servidor en tiempo real y escribir los datos en HDFS.
2.Infraestructura de flujo
2.1 Componentes de Flume
- Agente
El agente es un proceso de JVM, envía datos desde el origen al destino en forma de eventos. Hay principalmente tres partes: fuente, canal y sumidero.
- Fuente
El componente responsable de recibir datos a Flume Agent. El componente de origen puede procesar datos de registro de varios tipos y formatos, incluidos avro, thrift, exec, jms, spooling, directorio, netcat, secuencia, generador, syslog, http, legacy
- Lavabo
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, o los envía a otro agente de Flume. Los destinos de los componentes del Sink incluyen hdfs, logger, avro y thrift, Ipc, archivo, Hbase, solr, personalizado.
- Canal
El canal es un búfer entre la fuente y el sumidero, por lo tanto, el canal permite que la fuente y el sumidero funcionen a diferentes velocidades. El canal es seguro para subprocesos y puede manejar varias operaciones de escritura de origen y varias operaciones de lectura de sumidero al mismo tiempo.
Flume viene con dos canales: canal de memoria y canal de archivo
El canal de memoria es una cola en la memoria. El canal de memoria se utiliza en situaciones en las que no es necesario preocuparse por la pérdida de datos. Si necesita preocuparse por la pérdida de datos, entonces el canal de memoria no debe usarse, porque la muerte del programa, el tiempo de inactividad de la máquina o el reinicio causarán la pérdida de datos.
File Channel escribe todos los eventos en el disco, por lo que no se perderán datos en caso de que se apague el programa o se apague la máquina.
- Evento
La unidad de transmisión, la unidad básica de transmisión de datos Flume, envía datos desde el origen al destino en forma de evento. El evento consta de dos partes: Encabezado y Cuerpo. El encabezado se usa para almacenar algunos atributos del evento. Es una estructura kv. El cuerpo se usa para almacenar los datos en forma de matriz de bytes.
2.1 Interceptores de Flume (interceptores)
En Flume, un interceptor puede interceptar y procesar eventos en transmisión. El interceptor debe implementar la interfaz org.apache.flume.interceptor.Interceptor . El interceptor puede modificar o incluso eliminar el evento de acuerdo con la configuración del desarrollador. Flume también admite la cadena de interceptores, que se compone de varios interceptores. Al especificar el orden de los interceptores en el interceptor, el interceptor procesará el evento en secuencia.
2.2 Selectores de canal de Flume (selectores)
Los selectores de canal se utilizan en escenarios en los que el componente de origen transmite eventos a varios canales. Los más utilizados son la replicación (predeterminado) y la multiplexación. La replicación es responsable de replicar eventos en múltiples canales, mientras que la muleiplexación se basa en atributos de eventos y parámetros de configuración. La coincidencia es realizado, y la coincidencia se envía con éxito al canal especificado.
2.3 Procesadores de sumideros de Flume (procesadores)
Los usuarios pueden formar varios sumideros en un todo (grupo de sumideros). Los procesadores de sumidero se pueden utilizar para proporcionar funciones de equilibrio de carga para todos los sumideros del grupo o para implementar la conmutación por error de un sumidero a otro en caso de una falla de tiempo.
3.Monitoreo en tiempo real de Flume
Exec source es adecuado para monitorear un archivo adjunto en tiempo real, pero no puede garantizar que los datos no se perderán. Spooldir Source puede garantizar que los datos no se perderán y puede realizar la transmisión reanudable de apagado, pero el retraso es alto y no se puede monitorear en tiempo real. El directorio recopilado es adecuado para la recopilación fuera de línea Mientras que la fuente Taildir no solo puede realizar la transmisión reanudable de apagado, sino también garantizar que los datos no se pierdan, y también puede realizar en tiempo real monitoreo, que se puede utilizar para la recopilación fuera de línea o la recopilación en tiempo real.
3.1 Monitoreo en tiempo real de registros de Hive y carga a HDFS
análisis de demanda:
Pasos de implementación:
1. Si Flume desea enviar datos a HDFS, debe contener el paquete jar relacionado con Hadoop y copiarlo en la carpeta / opt / module / flume / lib
commons-configuration-1.6.jar、
hadoop-auth-2.7.2.jar、
hadoop-common-2.7.2.jar、
hadoop-hdfs-2.7.2.jar、
commons-io-2.4.jar、
htrace-core-3.1.0-incubating.jar
2. Cree el archivo flume-file-hdfs.conf y agregue el siguiente contenido
# Name the components on this agent
a2.sources = r2
a2.sinks = k2
a2.channels = c2
# Describe/configure the source
a2.sources.r2.type = exec
a2.sources.r2.command = tail -F /opt/module/hive/logs/hive.log
a2.sources.r2.shell = /bin/bash -c
# Describe the sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://bigdata02:9000/flume/%Y%m%d/%H
#上传文件的前缀
a2.sinks.k2.hdfs.filePrefix = logs-
#是否按照时间滚动文件夹
a2.sinks.k2.hdfs.round = true
#多少时间单位创建一个新的文件夹
a2.sinks.k2.hdfs.roundValue = 1
#重新定义时间单位
a2.sinks.k2.hdfs.roundUnit = hour
#是否使用本地时间戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true
#积攒多少个Event才flush到HDFS一次
a2.sinks.k2.hdfs.batchSize = 100
#多久生成一个新的文件
a2.sinks.k2.hdfs.rollInterval = 60
#设置每个文件的滚动大小
a2.sinks.k2.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a2.sinks.k2.hdfs.rollCount = 0
# Use a channel which buffers events in memory
a2.channels.c2.type = memory
a2.channels.c2.capacity = 10000
a2.channels.c2.transactionCapacity = 1000
# Bind the source and sink to the channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2
3. Ejecute Flume
bin / flume-ng agent --conf conf / --name a2 --conf-file job / flume-file-hdfs.conf
4. Encienda Hadoop y HIve para generar registros
5. Ver en HDFS
3.2 Supervisar varios archivos nuevos cargados en HDFS
análisis de demanda:
1. Cree el archivo de configuración flume-dir-hdfs.conf
a3.sources = r3
a3.sinks = k3
a3.channels = c3
# Describe/configure the source
a3.sources.r3.type = spooldir
a3.sources.r3.spoolDir = /opt/module/flume/upload
a3.sources.r3.fileSuffix = .COMPLETED
#忽略所有以.tmp结尾的文件,不上传
a3.sources.r3.ignorePattern = \\S*\\.tmp
# Describe the sink
a3.sinks.k3.type = hdfs
a3.sinks.k3.hdfs.path = hdfs://bigdata02:9000/flume/upload/%Y%m%d/%H
#上传文件的前缀
a3.sinks.k3.hdfs.filePrefix = upload-
#是否按照时间滚动文件夹
a3.sinks.k3.hdfs.round = true
#多少时间单位创建一个新的文件夹
a3.sinks.k3.hdfs.roundValue = 1
#重新定义时间单位
a3.sinks.k3.hdfs.roundUnit = hour
#是否使用本地时间戳
a3.sinks.k3.hdfs.useLocalTimeStamp = true
#积攒多少个Event才flush到HDFS一次
a3.sinks.k3.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a3.sinks.k3.hdfs.fileType = DataStream
#多久生成一个新的文件
a3.sinks.k3.hdfs.rollInterval = 60
#设置每个文件的滚动大小大概是128M
a3.sinks.k3.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a3.sinks.k3.hdfs.rollCount = 0
# Use a channel which buffers events in memory
a3.channels.c3.type = memory
a3.channels.c3.capacity = 10000
a3.channels.c3.transactionCapacity = 1000
# Bind the source and sink to the channel
a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3
2. Inicie la carpeta de seguimiento
bin / flume-ng agent --conf conf / --name a3 --conf-file job / flume-dir-hdfs.conf
3. Agregue archivos a la carpeta de carga
Cree una carpeta de carga en el directorio / opt / module / flume
Agregar archivos a la carpeta de carga
4. Ver los datos en HDFS
5. Espere 1 s, vuelva a consultar la carpeta de carga
4.Flume avanzado
4.1 Transacción Flume
Poner transacción
- doPut: escribe los datos del lote en la lista de almacenamiento temporal del búfer
- doCommit: comprueba si la cola de memoria del canal es suficiente para fusionar
- doPollback: espacio de cola de memoria de canal insuficiente, datos de reversión
Tomar asuntos
- doTake: extrae los datos al búfer temporal takeList y envía los datos a HDFS
- doCommit: si todos los datos se envían correctamente, borre el búfer temporal takeList
- doRollback: si ocurre una excepción durante la transmisión de datos, el rollback devolverá los datos en el búfer temporal takeList a la cola de memoria del canal
4.2 Principio interno del agente de canal
4.2.1 Componentes importantes
1, selector de canales
La función de ChannelSelector es seleccionar a qué canal se enviará el evento. Hay dos tipos, a saber, replicar y multiplexar .
ReplicatingSelector enviará el mismo evento a todos los canales, y la multiplexación enviará diferentes eventos a diferentes canales de acuerdo con los principios correspondientes.
Procesador de fregadero de 2
Hay tres tipos de SinkProcessor, a saber DefaultSinkProcessor , LoadBalancingSinkProcessor y FailoverSinkProcessor
DefaultSinkProcessor corresponde a un solo Sink, LoadBalancingSinkProcessor y FailoverSinkProcessor corresponden al Sink Group, LoadBalancingSinkProcessor puede realizar la función de equilibrio de carga y FailoverSinkProcessor puede realizar la función de failover .
Estructura 5.Flume
5.1 Serie simple
Este modo conecta varios canales en secuencia, comenzando desde la fuente inicial hasta el sistema de almacenamiento de destino del sumidero final. Este modo no se recomienda para salvar demasiadas cantidades de canal. Las cantidades excesivas de canal no solo afectarán la velocidad de transmisión, sino que también una vez que un canal de nodo se cae durante el proceso de transmisión, afectará a todo el sistema de transmisión.
5.2 Copiar y multiplexar
Flume admite el flujo de eventos a uno o más destinos. En este modo, los mismos datos se pueden copiar en múltiples canales, o se pueden distribuir diferentes datos a diferentes canales, y los receptores pueden elegir transmitir a diferentes destinos.
5.3 Equilibrio de carga y conmutación por error
Flume admite el uso de la agrupación lógica de varios sumideros en un grupo de sumideros. El grupo de sumideros se puede utilizar con diferentes SinkProcessors para lograr el equilibrio de carga y la recuperación de errores.
5.4 Agregación
Este modelo es el más común y muy práctico, las aplicaciones web diarias suelen estar distribuidas en cientos de servidores, incluso miles o decenas de miles de servidores. El registro generado también es muy complicado de procesar. Esta combinación de canal puede resolver bien este problema.Cada servidor implementa un canal para recopilar registros, lo transfiere a un canal que recopila registros y carga el canal a hdfs, hive, hbase, etc. para el análisis de registros.
6. Resumen del problema
6.1 Ajuste de parámetros de canal
1. Fuente
Aumentar la cantidad de fuentes (la cantidad de grupos de archivos se puede aumentar cuando se usa Tair Dir Source) puede aumentar la capacidad de la fuente para leer datos. Por ejemplo: cuando hay demasiados archivos generados en un directorio determinado, debe dividir el directorio de archivos en varios directorios de archivos y configurar varias fuentes al mismo tiempo para asegurarse de que la fuente tenga la capacidad suficiente para obtener los datos recién generados.
El parámetro batchSize determina el número de eventos que la fuente se transporta al canal en lotes a la vez. El aumento adecuado de este parámetro puede mejorar el rendimiento de la fuente al transportar eventos al canal.
2. Canal
El canal tiene el mejor rendimiento cuando se selecciona memoria como el tipo, pero los datos se pueden perder si el proceso de Flume se bloquea inesperadamente. El canal tiene una mejor tolerancia a fallas cuando se selecciona el tipo de archivo, pero su rendimiento será peor que el del canal de memoria.
Cuando se utiliza el canal de archivos, dataDirs configura varios directorios en diferentes discos para mejorar el rendimiento.
El parámetro Capacidad determina el número máximo de eventos que puede contener el canal. El parámetro transactionCapacity determina el número máximo de eventos que Source escribe en el canal cada vez y el número máximo de eventos que Sink lee del canal cada vez. transactionCapacity debe ser mayor que los parámetros batchSize de Source y Sink .
3. Fregadero
Aumentar el número de sumideros puede aumentar la capacidad de los sumideros para consumir eventos. El sumidero no es tan grande como sea posible. Demasiados sumideros ocuparán recursos del sistema y causarán un desperdicio innecesario de recursos del sistema.
El parámetro batchSize determina la cantidad de eventos que el receptor lee del canal en lotes a la vez. El aumento adecuado de este parámetro puede mejorar el rendimiento de los eventos de movimiento del receptor desde el canal.
6.2 Mecanismo de transacción de Flume
Mecanismo de transacción de Flume (similar al mecanismo de transacción de la base de datos): Flume utiliza dos transacciones independientes para ser responsable de la entrega de eventos de Soucrce a Channel y de Channel a Sink. Por ejemplo, la fuente del directorio de spool crea un evento para cada línea del archivo. Una vez que todos los eventos de la transacción se envían al canal y el envío es exitoso, Soucrce marcará el archivo como completo. De la misma manera, la transacción maneja el proceso de transferencia de Canal a Sumidero de manera similar, si el evento no puede ser registrado por alguna razón, la transacción será revertida. Y todos los eventos permanecerán en el Canal, esperando a ser entregados nuevamente.
6.3 ¿Se perderán los datos recopilados por Flume ?
Según los principios arquitectónicos de Flume, es imposible que Flume pierda datos. Tiene un mecanismo de transacción interno completo. Source to Channel es transaccional y Channel to Sink es transaccional. Por lo tanto, no habrá pérdida de datos en estos dos enlaces. La única situación posible de pérdida de datos es que el canal usa memoryChannel, el agente está inactivo y los datos se pierden o los datos de almacenamiento del canal están llenos, lo que hace que la fuente ya no escriba y se pierdan los datos no escritos.
Flume no perderá datos, pero puede causar su duplicación. Por ejemplo, si los datos han sido enviados con éxito por Sink pero no se recibe respuesta, S i nk enviará los datos nuevamente, lo que puede causar la duplicación de datos .