Tutorial de Apache Flume: ¿Qué es? ArchiEjemplo de tecnología y Hadoop

⚡ Resumen inteligente

Apache Flume es un servicio distribuido para recopilar, agregar y transferir grandes volúmenes de datos de registro a HDFS, construido en torno a agentes que encadenan una fuente, un canal y un destino.

  • 🔘 Anatomía del agente: Cada agente de Flume es un proceso JVM que contiene una fuente, uno o más canales y un sumidero.
  • ☑️ Fiabilidad: La entrega con el mejor esfuerzo no tolera fallos en los nodos; la entrega de extremo a extremo sobrevive a múltiples fallos de nodos.
  • Configuración: Las clases de código fuente personalizadas se compilan en un archivo JAR que se coloca en el directorio lib de Flume.
  • 🧪 Configuración: Un archivo de propiedades especifica el origen, el canal y el destino, y establece la ruta HDFS y los límites de rotación.
  • 🛠️ Lanzamiento: Inicie la canalización con el agente flume-ng, nombrándolo y apuntando a flume.conf.
  • ⚠️ Ejemplo antiguo: El punto final de transmisión de Twitter v1.1 dejó de funcionar en marzo de 2023, así que considere este ejercicio como un patrón de fuente personalizada.

Tutorial de Apache Flume que cubre la arquitectura del agente, la configuración y un ejemplo de transmisión de datos en Hadoop.

¿Qué es Apache Flume en Hadoop?

Apache Flume es un sistema confiable y distribuido para recopilar, agregar y mover grandes cantidades de datos de registro. Tiene una arquitectura simple pero flexible basada en flujos de datos en tiempo real. Apache Flume se utiliza para recopilar datos de registro presentes en archivos de registro de servidores web y agregarlos en HDFS para analizar.

Flume en Hadoop admite múltiples fuentes, entre ellas:

  • 'tail' (que envía datos desde un archivo local y los escribe en HDFS a través de Flume, de forma similar al comando 'tail' de Unix).
  • Registros del sistema
  • apache log4j (lo que permite Java aplicaciones para escribir eventos en archivos en HDFS a través de Flume).

La versión actual es Flume 1.11.0, publicado el 25 de octubre de 2022 y disponible en el Página de descarga de Apache FlumeEste tutorial se elaboró ​​para la versión 1.4.0, por lo que varios pasos a continuación incluyen una nota donde se indica que la versión actual se comporta de manera diferente.

Canal de flujo Architectura

Un agente Flume es un JVM Proceso con tres componentes: fuente Flume, canal Flume y sumidero Flume, a través de los cuales se propagan los eventos tras iniciarse en una fuente externa. El siguiente diagrama muestra cómo se conectan.

Diagrama de arquitectura de Flume que muestra un agente con una fuente, un canal y un sumidero que alimentan HDFS.

  1. Los eventos generados por la fuente externa (un servidor web) son procesados ​​por la fuente Flume. La fuente externa envía eventos a la fuente Flume en un formato que la fuente de destino reconoce.
  2. La fuente de Flume recibe un evento y lo almacena en uno o más canales. El canal actúa como un almacén que guarda el evento hasta que el receptor de Flume lo consume. Este canal puede usar un sistema de archivos local para almacenar dichos eventos.
  3. El receptor de Flume elimina el evento de un canal y lo almacena en un repositorio externo, como HDFS. Puede haber varios agentes de Flume; en ese caso, el receptor de Flume reenvía el evento al origen de Flume del siguiente agente en el flujo.

Algunas características importantes de Flume

  • Flume tiene un diseño flexible basado en flujos de datos en tiempo real. Es tolerante a fallos y robusto, con múltiples mecanismos de conmutación por error y recuperación. Flume ofrece diferentes niveles de fiabilidad, incluyendo: 'entrega con el mejor esfuerzo' y 'entrega de extremo a extremo'. Entrega de mejores esfuerzos no tolera ningún fallo del nodo Flume, mientras que entrega de principio a fin Garantiza la entrega incluso en caso de fallos en varios nodos.
  • Flume transfiere datos entre fuentes y destinos. Esta recopilación de datos puede programarse o activarse por eventos. Flume cuenta con su propio motor de procesamiento de consultas, lo que facilita la transformación de cada nuevo lote de datos antes de su transferencia al destino previsto.
  • Posibles Fregaderos de canal incluir HDFS y HBaseFlume también puede transportar datos de eventos, como datos de tráfico de red, datos generados por sitios web de redes sociales y mensajes de correo electrónico.

Configuración de canal, biblioteca y código fuente

Antes de comenzar con el proceso propiamente dicho, asegúrese de tener Hadoop instalado; de lo contrario, trabaje a través de Cómo instalar Hadoop Primero, cambie el usuario a 'hduser' (el ID utilizado al configurar Hadoop; puede cambiar al ID de usuario utilizado durante su propia configuración de Hadoop).

Cambiar el usuario de Linux a hduser en la terminal antes de que comience la configuración de Flume.

Paso 1) Crea un nuevo directorio con el nombre 'FlumeTutorial'.

sudo mkdir FlumeTutorial
  1. Otorgar permisos de lectura, escritura y ejecución.
    sudo chmod -R 777 FlumeTutorial
  2. Copiar los archivos MiTwitterSource.java y MiTwitterSourceForFlume.java en este directorio.

Descargue archivos de entrada desde aquí

Compruebe los permisos de todos estos archivos, como se indica a continuación, y otorgue el permiso de "lectura" si no lo tiene.

La terminal muestra los permisos de archivo en el archivo descargado. Java archivos fuente

Paso 2) Descarga 'Apache Flume' desde https://flume.apache.org/download.html.

En este tutorial de Flume se ha utilizado Apache Flume 1.4.0.

Página de descarga de Apache Flume que muestra el enlace del archivo tarball binario para seleccionar

A continuación, haz clic para acceder a un espejo.

Se accede a la página espejo de Apache tras hacer clic en el enlace del archivo tarball de Flume.

Paso 3) Copie el archivo tarball descargado en el directorio que prefiera y expulsetract el contenido usando el siguiente comando.

sudo tar -xvf apache-flume-1.4.0-bin.tar.gz

Terminal extracComprimiendo el archivo tarball de Flume con el comando sudo tar -xvf

Esto crea un nuevo directorio llamado apache-flume-1.4.0-bin y extracts los archivos en él. Ese directorio se denomina en el resto del artículo.

Paso 4) Configuración de la biblioteca Flume. Copie twitter4j-core-4.0.1.jar, flume-ng-configuration-1.4.0.jar, flume-ng-core-1.4.0.jar y flume-ng-sdk-1.4.0.jar a

/lib/

Es posible que uno o todos los archivos JAR copiados tengan permisos de ejecución, lo que puede causar problemas con la compilación del código; por lo tanto, revoque dichos permisos. En mi caso, twitter4j-core-4.0.1.jar tenía permisos de ejecución. Los revoqué como se indica a continuación.

sudo chmod -x twitter4j-core-4.0.1.jar

La terminal revoca el permiso de ejecución en el JAR principal de twitter4j.

Después de esto, el comando a continuación otorga permiso de 'lectura' en twitter4j-core-4.0.1.jar a todos.

sudo chmod +rrr /usr/local/apache-flume-1.4.0-bin/lib/twitter4j-core-4.0.1.jar

Tenga en cuenta que descargué twitter4j-core-4.0.1.jar de Repositorio Maveny todos los JAR de Flume, es decir, flume-ng-*-1.4.0.jar, desde los artefactos org.apache.flume.

Cargar datos de Twitter usando Flume

Paso 1) Dirígete al directorio que contiene los archivos de código fuente.

Paso 2) Establezca CLASSPATH para contener /lib/* y ~/FlumeTutorial/flume/mytwittersource/*.

export CLASSPATH="/usr/local/apache-flume-1.4.0-bin/lib/*:~/FlumeTutorial/flume/mytwittersource/*"

Terminal que exporta el CLASSPATH que apunta a los directorios de la biblioteca y el código fuente de Flume.

Paso 3) Compile el código fuente utilizando el siguiente comando.

javac -d . MyTwitterSourceForFlume.java MyTwitterSource.java

Terminal compilando los dos Java archivos fuente con javac

Paso 4) Crea un archivo JAR. Primero, crea un archivo Manifest.txt usando un editor de texto de tu elección y agrega la siguiente línea.

Main-Class: flume.mytwittersource.MyTwitterSourceForFlume

Aquí, flume.mytwittersource.MyTwitterSourceForFlume es el nombre de la clase principal. Tenga en cuenta que debe presionar la tecla Enter al final de esta línea, como se muestra a continuación.

Abra Manifest.txt en un editor de texto con la entrada Main-Class.

Ahora, cree el archivo JAR 'MyTwitterSourceForFlume.jar' de la siguiente manera.

jar cfm MyTwitterSourceForFlume.jar Manifest.txt flume/mytwittersource/*.class

Empaquetando las clases compiladas en MyTwitterSourceForFlume.jar mediante la terminal.

Paso 5) Copie este JAR a /lib/.

sudo cp MyTwitterSourceForFlume.jar <Flume Installation Directory>/lib/

Copia del JAR de origen personalizado en el directorio lib de Flume desde la terminal.

Paso 6) Ve al directorio de configuración de Flume, /conf.

Si no existe el archivo flume.conf, copie el archivo flume-conf.properties.template y cámbiele el nombre a flume.conf.

sudo cp flume-conf.properties.template flume.conf

Copiando el archivo flume-conf.properties.template a flume.conf desde la terminal.

Si flume-env.sh no existe, copie flume-env.sh.template y cámbiele el nombre a flume-env.sh.

sudo cp flume-env.sh.template flume-env.sh

Copiando el archivo flume-env.sh.template a flume-env.sh desde la terminal.

Creando una aplicación de Twitter

Lee esto primero. Transmisión v1.1 statuses/filter El punto final que necesita twitter4j 4.0.1 se retiró el 9 de marzo de 2023, y el flujo filtrado de la API v2 que lo reemplazó, ahora en desarrollador.x.com, se encuentra detrás de un nivel de pago. Considere las pantallas a continuación como un patrón de fuente personalizada, luego dirija el mismo agente a un archivo, ejecutable o fuente Kafka.

Paso 1) Crea una aplicación de Twitter iniciando sesión en el portal para desarrolladores.

Página de inicio de sesión para desarrolladores de Twitter utilizada para acceder a la lista de aplicaciones.

Se muestra la página de inicio de la cuenta de desarrollador de Twitter después de iniciar sesión.

Paso 2) Ve a 'Mis aplicaciones' (esta opción se despliega al hacer clic en el botón 'Huevo' en la esquina superior derecha).

La página "Mis aplicaciones" del portal para desarrolladores de Twitter.

Paso 3) Crea una nueva aplicación haciendo clic en 'Crear nueva aplicación'.

Paso 4) Complete los datos de la solicitud indicando el nombre, una descripción y la dirección del sitio web. Puede consultar las notas que aparecen debajo de cada campo.

Formulario de creación de aplicación de Twitter con los campos de nombre, descripción y sitio web.

Paso 5) Desplázate hacia abajo en la página, acepta los términos marcando "Sí, acepto" y haz clic en el botón "Crea tu aplicación de Twitter".

la casilla de verificación de términos y el botón para crear la solicitud en la parte inferior del formulario de Twitter

Paso 6) En la ventana de la aplicación recién creada, diríjase a la pestaña "Claves de API", desplácese hacia abajo y haga clic en el botón "Crear mi token de acceso".

Pestaña Claves API de la nueva aplicación de Twitter antes de que exista un token de acceso.

Los detalles del token de acceso se muestran después de usar el botón Crear mi token de acceso.

Paso 7) Recarga la página.

Paso 8) Haz clic en 'Probar OAuth'. Esto mostrará la configuración de 'OAuth' de la aplicación.

Pantalla de prueba de OAuth que muestra la configuración de OAuth de la aplicación.

Paso 9) Modifique el archivo 'flume.conf' utilizando esta configuración de OAuth. Los pasos para modificar 'flume.conf' se detallan a continuación.

Configuración de OAuth que enumera los valores de clave de consumidor, secreto de consumidor y token de acceso.

Necesitamos copiar la clave de consumidor, el secreto de consumidor, el token de acceso y el secreto del token de acceso para actualizar 'flume.conf'.

Nota: Estos valores pertenecen al usuario y, por lo tanto, son confidenciales, así que no deben compartirse.

Modificar el archivo 'flume.conf'

Paso 1) Abra el archivo 'flume.conf' en modo de escritura y configure los valores para los parámetros que se indican a continuación.

sudo gedit flume.conf

Copia el contenido que aparece a continuación.

MyTwitAgent.sources = Twitter
MyTwitAgent.channels = MemChannel
MyTwitAgent.sinks = HDFS
MyTwitAgent.sources.Twitter.type = flume.mytwittersource.MyTwitterSourceForFlume
MyTwitAgent.sources.Twitter.channels = MemChannel
MyTwitAgent.sources.Twitter.consumerKey = <Copy consumer key value from Twitter App>
MyTwitAgent.sources.Twitter.consumerSecret = <Copy consumer secret value from Twitter App>
MyTwitAgent.sources.Twitter.accessToken = <Copy access token value from Twitter App>
MyTwitAgent.sources.Twitter.accessTokenSecret = <Copy access token secret value from Twitter App>
MyTwitAgent.sources.Twitter.keywords = guru99
MyTwitAgent.sinks.HDFS.channel = MemChannel
MyTwitAgent.sinks.HDFS.type = hdfs
MyTwitAgent.sinks.HDFS.hdfs.path = hdfs://localhost:54310/user/hduser/flume/tweets/
MyTwitAgent.sinks.HDFS.hdfs.fileType = DataStream
MyTwitAgent.sinks.HDFS.hdfs.writeFormat = Text
MyTwitAgent.sinks.HDFS.hdfs.batchSize = 1000
MyTwitAgent.sinks.HDFS.hdfs.rollSize = 0
MyTwitAgent.sinks.HDFS.hdfs.rollCount = 10000
MyTwitAgent.channels.MemChannel.type = memory
MyTwitAgent.channels.MemChannel.capacity = 10000
MyTwitAgent.channels.MemChannel.transactionCapacity = 1000

El archivo flume.conf se abre en un editor con las propiedades de origen, canal y destino de MyTwitAgent.

Paso 2) Además, configure TwitterAgent.sinks.HDFS.hdfs.path como se indica a continuación.

TwitterAgent.sinks.HDFS.hdfs.path = hdfs://://flume/tweets/

La propiedad hdfs.path del destino HDFS se establece en un nombre de host, un número de puerto y un directorio principal de HDFS.

Para encontrar , y Consulte el valor del parámetro 'fs.defaultFS' establecido en $HADOOP_HOME/etc/hadoop/core-site.xml, que se muestra a continuación.

La propiedad fs.defaultFS dentro de core-site.xml, que proporciona el nombre de host y el puerto.

Paso 3) Para volcar los datos a HDFS a medida que lleguen, elimine la entrada que aparece a continuación, si existe.

TwitterAgent.sinks.HDFS.hdfs.rollInterval = 600

Ejemplo: transmisión de datos de Twitter usando Flume

Paso 1) Abra el archivo 'flume-env.sh' en modo de escritura y configure los valores para los parámetros que se indican a continuación.

JAVA_HOME=<Installation directory of Java>
FLUME_CLASSPATH="<Flume Installation Directory>/lib/MyTwitterSourceForFlume.jar"

Abra flume-env.sh en un editor con JAVA_HOME y FLUME_CLASSPATH configurados.

Paso 2) Iniciar Hadoop.

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

Paso 3) Dos de los archivos JAR del tarball de Flume no son compatibles con Hadoop 2.2.0, por lo que en este ejemplo de Apache Flume seguimos los pasos que se indican a continuación para que Flume sea compatible con Hadoop 2.2.0. Este cambio de JAR es una corrección de la era 1.4.0; Flume 1.11.0 ya incluye compilaciones actuales de protobuf y Guava, por lo que un tarball moderno normalmente no necesita nada de eso.

a. Mover protobuf-java-2.4.1.jar fuera de ' /lib'. Ve primero a ese directorio.

cd /lib

sudo mv protobuf-java-2.4.1.jar ~/

El terminal está moviendo protobuf-java-2.4.1.jar fuera del directorio lib de Flume.

b. Busque el archivo JAR 'guava' como se muestra a continuación.

find . -name "guava*"

Comando find en la terminal para localizar el archivo JAR de Guava incluido.

Mueva guava-10.0.1.jar fuera de ' /lib'.

sudo mv guava-10.0.1.jar ~/

La terminal está moviendo guava-10.0.1.jar fuera del directorio lib de Flume.

c. Descargue guava-17.0.jar desde Repositorio Maven, mostrado a continuación.

Página del repositorio Maven para Guava 17.0, el JAR de reemplazo para descargar

Ahora, copie este archivo JAR descargado a ' /lib'.

Paso 4) Ir a ' /bin' y comience Flume de la siguiente manera.

./flume-ng agent -n MyTwitAgent -c conf -f <Flume Installation Directory>/conf/flume.conf

Terminal iniciando el agente Flume llamado MyTwitAgent con el comando flume-ng

La ventana del símbolo del sistema donde Flume obtiene los tweets se ve así.

Símbolo del sistema que muestra al agente Flume obteniendo tweets y escribiéndolos en HDFS.

En el mensaje de la ventana de comandos podemos ver que la salida se escribe en el directorio /user/hduser/flume/tweets/. Ahora, abre este directorio con un navegador web.

Paso 5) Para ver el resultado de la carga de datos, abra http://localhost:50070/ en un navegador, explore el sistema de archivos y luego vaya al directorio donde se han cargado los datos, es decir

/flume/tweets/

El puerto 50070 es la interfaz web de NameNode en Hadoop 2; Hadoop 3 trasladó la misma página al puerto 9870.

El navegador HDFS muestra el directorio flume/tweets con los archivos de tweets cargados.

Flume es la mitad de la ingestión: sqoop importa tablas en lotes, Flume transmite eventos, luego Cerdo or Colmena dar forma a los archivos y oozie programa la cadena. Ver también herramientas de análisis de grandes datos, Uniones y contadores de MapReduce y Talend.

Preguntas Frecuentes

No es como está escrito. El punto final de estados/filtros de transmisión v1.1 se retiró el 9 de marzo de 2023 y la API v2 que lo reemplaza requiere un plan de pago. La mecánica de Flume sigue vigente como un ejercicio de código fuente personalizado.

Los modelos establecen como referencia el volumen normal del registro y la forma del mensaje, y luego señalan las desviaciones que no se detectan con los umbrales fijos. También agrupan las pilas repetidas. traces en un solo incidente y redactar una causa probable, acortando el triaje.

Copilot crea rápidamente bloques de origen, canal y destino, pero inventa nombres de propiedades y mezcla versiones. Antes de iniciar el agente, compruebe cada clave con la Guía del usuario de Flume correspondiente a su versión.

Flume transmite continuamente datos de eventos, como registros, a HDFS. Sqoop mueve tablas estructuradas entre bases de datos relacionales y Hadoop en lotes programados. Cubren diferentes aspectos de la ingesta de datos y se complementan bien.

Un canal de memoria es el más rápido, pero pierde los eventos almacenados en búfer si el agente falla. Un canal de archivos escribe en disco y se conserva tras los reinicios, aunque con un rendimiento menor. Se recomienda la durabilidad para todo aquello que no se pueda reenviar.

Kafka es ahora la opción predeterminada habitual porque retiene datos y da servicio a muchos consumidores. Flume 1.11.0, de octubre de 2022, sigue siendo adecuado para la recopilación simple de registros unidireccionales en HDFS.

Casi siempre se trata de un conflicto de archivos JAR: el archivo tarball de Flume incluye sus propias versiones de Guava y protobuf, que entran en conflicto con las que carga Hadoop. Eliminar el archivo JAR antiguo incluido suele solucionar el problema.

Deciden cuándo el receptor cierra un archivo y abre uno nuevo: rollSize en bytes, rollCount en cantidad de eventos, rollInterval en segundos. Cero desactiva ese activador en particular.

Resumir este post con: