Organización del Código Fuante y Módulos Principales
El ecosistema de Apache Flume se distribuye en múltiples módulos Maven que encapsulan funcionalidades específicas para la ingesta de datos. A continuación, se detalla la distribución interna del repositorio:
apache-flume-source/
├── flume-ng-core/ # Lógica central y abstracciones del framework
├── flume-ng-channels/ # Implementaciones de canales (Memory, JDBC, File)
├── flume-ng-sources/ # Conectores de entrada (Avro, Spooling, Kafka)
├── flume-ng-sinks/ # Conectores de salida (HDFS, Hive, Elasticsearch)
├── flume-ng-node/ # Punto de entrada y gestión del ciclo de vida del agente
├── flume-ng-sdk/ # API para clientes externos
├── flume-ng-auth/ # Mecanismos de seguridad y autenticación
├── flume-ng-clients/ # Utilidades de conexión para productores
├── flume-ng-tests/ # Suite de pruebas de integración
├── flume-tools/ # Scripts y utilidades auxiliares
├── flume-ng-doc/ # Documentación técnica y manuales
├── pom.xml # Descriptor raíz de Maven
└── README.md # Instrucciones generales del proyecto
Ejecución del Agente y Parámetros de Inicio
El núcleo de ejecución reside en el módulo flume-ng-node, específicamente en la clase org.apache.flume.node.Application. Para instanciar un agente, se utiliza el script wrapper proporcionado en el directorio binario.
Ejemplo de comando de arranque para un agente de ingesta:
bin/flume-ng agent \
--conf ./config \
--conf-file ./config/hdfs_ingestion.conf \
--name ingestor_node \
-Dflume.root.logger=DEBUG,console \
-Dflume.monitoring.type=http \
-Dflume.monitoring.port=34545
agent: Indica al script que debe iniciar un proceso de agente Flume.--conf: Directorio base que contiene los archivos de entorno y topología.--conf-file: Ruta exacta al archivo de propiedades que define el flujo de datos.--name: Idantificador único del agente que debe coincidir con el prefijo en el archivo de configuración.-Dflume.root.logger: Directiva JVM para conrtolar la verbosidad y el destino de los logs.
Definición de Topologías y Entorno de Ejecución
La configuración se divide en la definición del flujo de eventos y las variables de entorno del sistema. Estos archivos suelen alojarse en el directorio conf/.
Topología de Flujo (hdfs_ingestion.conf)
En este ejemplo, se configura un flujo que lee archivos desde un directorio local y los persiste en un clúster HDFS, utilizando un canal en memoria para el buffer intermedio.
# Declaración de componentes del agente 'ingestor_node'
ingestor_node.sources = spool_source
ingestor_node.sinks = hdfs_sink
ingestor_node.channels = mem_buffer
# Configuración del origen (Spooling Directory)
ingestor_node.sources.spool_source.type = spooldir
ingestor_node.sources.spool_source.spoolDir = /var/data/incoming
ingestor_node.sources.spool_source.fileHeader = true
# Configuración del canal (Memoria)
ingestor_node.channels.mem_buffer.type = memory
ingestor_node.channels.mem_buffer.capacity = 5000
ingestor_node.channels.mem_buffer.transactionCapacity = 500
# Configuración del destino (HDFS)
ingestor_node.sinks.hdfs_sink.type = hdfs
ingestor_node.sinks.hdfs_sink.hdfs.path = hdfs://namenode:8020/flume/events/%y-%m-%d/
ingestor_node.sinks.hdfs_sink.hdfs.filePrefix = logs-
ingestor_node.sinks.hdfs_sink.hdfs.rollInterval = 3600
ingestor_node.sinks.hdfs_sink.hdfs.rollSize = 134217728
# Enlace de componentes
ingestor_node.sources.spool_source.channels = mem_buffer
ingestor_node.sinks.hdfs_sink.channel = mem_buffer
Variables de Entorno (flume-env.sh)
Este script bash permite inyectar variables de entorno y ajustar los parámetros de la máquina virtual Java antes de que el proceso inicie.
# Ubicación del JDK
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
# Ajustes de memoria y recolección de basura para la JVM
export JAVA_OPTS="-Xms1024m -Xmx2048m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
# Inclusión de librerías externas (ej. conectores JDBC o clientes HDFS específicos)
export FLUME_CLASSPATH="/opt/flume/custom_libs/*:/etc/hadoop/conf"