Flume realiza almacenamiento persistente de datos de Kafka en HDFS

Escrito en el frente: El bloguero es un "pequeño cerdo montés" que se ha dedicado al negocio del entrenamiento después de un desarrollo y experiencia reales. Su apodo está tomado de "Peng Peng" en la caricatura "El Rey León". Siempre trata a los rodear a las personas con una actitud optimista y positiva. Mi ruta técnica ha ido desde un ingeniero de pila completa de Java hasta el campo del desarrollo de big data y la minería de datos. Ahora he logrado cierto éxito. Me gustaría compartir con ustedes lo que he ganado en el pasado. Espero te será útil en el camino del aprendizaje. Al mismo tiempo, el bloguero también quiere construir una biblioteca técnica completa a través de este intento. Cualquier excepción, error y precaución relacionada con los puntos técnicos del artículo se enumerarán al final. Puede proporcionar materiales de varias maneras. .

  • Critique y señale cualquier error en el artículo, y corríjalo a tiempo.
  • Si tiene alguna pregunta que desee discutir y aprender, comuníquese conmigo: [email protected].
  • El estilo de publicación de los artículos varía de una columna a otra y todos son independientes. Por favor, corríjame si hay alguna deficiencia.

Flume realiza almacenamiento persistente de datos de Kafka en HDFS

Palabras clave en este artículo: Flume, Kafka, HDFS, datos en tiempo real, almacenamiento

1. Descripción del escenario

Para algunos datos generados en tiempo real, además de los cálculos en tiempo real, generalmente es necesario archivarlos y guardarlos para el análisis de datos fuera de línea. La configuración de Flume se puede utilizar para procesar los datos y almacenarlos en una determinada frecuencia de tiempo.En este ejemplo, los datos se almacenarán desde Kafka en diferentes carpetas de HDFS diariamente.

1. Entrada de datos

En este escenario, los datos provienen de una suscripción de tema en Kafka y el formato de datos es json.

2. Canalización de datos

Utilice Flume como canal de procesamiento de datos e implemente reglas de almacenamiento personalizadas a través de la configuración.

3. Salida de datos

Los datos finales se almacenarán en HDFS , y los datos de cada día corresponderán a una carpeta separada.

2. Introducción de componentes

1. Kafka

De Wikipedia: Kafka es una plataforma de procesamiento de secuencias de código abierto desarrollada por Apache Software Foundation, escrita en Scala y Java. El objetivo de este proyecto es proporcionar una plataforma unificada, de alto rendimiento y baja latencia para procesar datos en tiempo real. Su capa de persistencia es esencialmente una "cola de mensajes de publicación/suscripción a gran escala según la arquitectura de registro de transacciones distribuidas", lo que la hace muy valiosa como infraestructura de nivel empresarial para procesar datos de transmisión.

Si necesita consultar los pasos de instalación, puede hacer clic en: Instalación de descompresión Kafka 3.x - Linux

2. Hadoop

De Wikipedia: Apache Hadoop es un marco de software de código abierto que admite aplicaciones distribuidas con uso intensivo de datos y se publica bajo el acuerdo de licencia de Apache 2.0. Ayuda a usar una red de muchas computadoras para resolver problemas de uso intensivo de datos y computación. Basado en el modelo informático MapReduce, proporciona un marco de software para el almacenamiento distribuido y el procesamiento de big data. Todos los módulos de Hadoop tienen la suposición fundamental de que las fallas de hardware son casos comunes y el marco debe manejarlas automáticamente.

Si necesita consultar los pasos de instalación, puede hacer clic en: Implementación de Hadoop 3.x en cada modo - Ubuntu

3. canal

De Wikipedia: Apache Flume es un software distribuido, confiable y disponible para recopilar, agregar y mover de manera eficiente grandes volúmenes de datos de registro. Tiene una arquitectura simple y flexible basada en flujos de datos de transmisión. Es robusto y tolerante a fallas, con mecanismos de confiabilidad ajustables y muchos mecanismos de conmutación por error y recuperación. Utiliza un modelo de datos simple y escalable que permite aplicaciones de análisis en línea.

El funcionamiento de Flume solo necesita preconfigurar el JDK, y el proceso de instalación solo necesita ser descomprimido y configurado con variables de entorno.

3. Preparación

1. Descargar Flume

  • Haga clic en Descargar -> seleccione tar.gz en binario

  • Ingrese a la lista de direcciones espejo, haga clic derecho y copie el enlace de descarga

  • Use wget para descargar al sistema Linux
wget https://dlcdn.apache.org/flume/1.11.0/apache-flume-1.11.0-bin.tar.gz

2. Instalación de canales

Para la instalación del JDK previo al entorno, consulte: Implementación de Hadoop 3.x en varios modos: la parte del entorno previo en Ubuntu [haga clic para ir directamente a la ubicación especificada].

  • Descompresión del canal
tar -zvxf apache-flume-1.11.0-bin.tar.gz
  • Configuración de variables de entorno
vi ~/.bashrc

export FLUME_HOME=/path/to/apache-flume-1.11.0-bin
export PATH=$PATH:$FLUME_HOME/bin

3. Preparación de la fuente de datos

Puede crear un nuevo tema en Kafka para realizar pruebas. Para conocer los pasos específicos, consulte: Instalación de descompresión de Kafka 3.x: la parte de las pruebas de consola en Linux [haga clic para ir directamente a la ubicación especificada].

4. Archivo de configuración

En Flume, se deben configurar tres partes principales, fuente , canal y sumidero . En este ejemplo, la fuente es Kafka, el sumidero es HDFS y el canal también tiene varias opciones.

1. Usa la memoria como canal

  • Ventajas y desventajas
    • Ventajas: mayor velocidad, no ocupa espacio adicional en el disco duro
    • Desventajas: solo confíe en los registros de compensación de Kafka, Flume en sí no almacena información de compensación
  • Elementos de configuración básicos
    • agent.sources.kafka-source.batchSize: la cantidad de datos procesados ​​en cada lote, que se puede modificar según sea necesario
    • agent.sources.kafka-source.kafka.bootstrap.servers: dirección de suscripción de Kafka, incluido el host y el número de puerto
    • agent.sources.kafka-source.kafka.topics: nombre del tema de Kafka
    • agent.sinks.hdfs-sink.hdfs.path: ruta para guardar los datos finales en HDFS, el directorio principal debe crearse manualmente
  • Cree un nuevo archivo de configuración kafka-memory-hdfs.conf en la carpeta conf de Flume :
# Name the components on this agent
agent.sources = kafka-source
agent.channels = memory-channel
agent.sinks = hdfs-sink

# Describe/configure the source
agent.sources.kafka-source.type = org.apache.flume.source.kafka.KafkaSource
agent.sources.kafka-source.batchSize = 1000
agent.sources.kafka-source.kafka.bootstrap.servers = localhost:9092
agent.sources.kafka-source.kafka.topics = my-topic
agent.sources.kafka-source.kafka.consumer.group.id = flume-memory-hdfs
agent.sources.kafka-source.kafka.consumer.auto.offset.reset = earliest

# Describe/configure the channel
agent.channels.memory-channel.type = memory
agent.channels.memory-channel.capacity = 10000
agent.channels.memory-channel.transactionCapacity = 1000

# Describe the sink
agent.sinks.hdfs-sink.type = hdfs
agent.sinks.hdfs-sink.hdfs.path = /flume_data/%Y-%m-%d
agent.sinks.hdfs-sink.hdfs.fileSuffix = .jsonl
agent.sinks.hdfs-sink.hdfs.rollInterval = 3600
agent.sinks.hdfs-sink.hdfs.rollSize = 0
agent.sinks.hdfs-sink.hdfs.rollCount = 1000
agent.sinks.hdfs-sink.transactionCapacity = 1000
agent.sinks.hdfs-sink.hdfs.fileType = DataStream
agent.sinks.hdfs-sink.hdfs.writeFormat = Text

# Bind the source and sink to the channel
agent.sources.kafka-source.channels = memory-channel
agent.sinks.hdfs-sink.channel = memory-channel

2. Usa archivos como canales

  • Ventajas y desventajas
    • Ventajas: puede garantizar que los datos no se pierdan y guardar el estado de los datos en el disco local
    • Desventajas: ocupará espacio de almacenamiento adicional en el disco duro, y la velocidad de lectura y escritura es relativamente lenta, y los archivos históricos deben eliminarse razonablemente
  • Elementos de configuración básicos
    • agent.sources.kafka-source.batchSize: la cantidad de datos procesados ​​en cada lote, que se puede modificar según sea necesario
    • agent.sources.kafka-source.kafka.bootstrap.servers: dirección de suscripción de Kafka, incluido el host y el número de puerto
    • agent.sources.kafka-source.kafka.topics: nombre del tema de Kafka
    • agent.channels.file-channel.checkpointDir: ruta del disco local, el directorio principal debe crearse con anticipación
    • agent.channels.file-channel.useDualCheckpoints: establezca en verdadero para habilitar los puntos de control duales, y se puede establecer una ruta de respaldo adicional
    • agent.channels.file-channel.maxFileSize: la unidad es bytes, cuando se alcanza el tamaño del archivo, automáticamente se dará la vuelta y creará un nuevo archivo
    • agent.sinks.hdfs-sink.hdfs.path: ruta para guardar los datos finales en HDFS, el directorio principal debe crearse manualmente
  • Cree un nuevo archivo de configuración kafka-file-hdfs.conf en la carpeta conf de Flume :
# Name the components on this agent
agent.sources = kafka-source
agent.channels = file-channel
agent.sinks = hdfs-sink

# Describe/configure the source
agent.sources.kafka-source.type = org.apache.flume.source.kafka.KafkaSource
agent.sources.kafka-source.batchSize = 1000
agent.sources.kafka-source.kafka.bootstrap.servers = localhost:9092
agent.sources.kafka-source.kafka.topics = my-topic
agent.sources.kafka-source.kafka.consumer.group.id = flume-file-hdfs
agent.sources.kafka-source.kafka.consumer.auto.offset.reset = earliest

# Describe/configure the channel
agent.channels.file-channel.type = file
agent.channels.file-channel.capacity = 10000
agent.channels.file-channel.transactionCapacity = 1000
agent.channels.file-channel.checkpointDir = /tmp/flume/checkpoint/
agent.channels.file-channel.backupCheckpointDir = /tmp/flume/backup/
agent.channels.file-channel.checkpointInterval = 300
agent.channels.file-channel.maxFileSize = 104857600
agent.channels.file-channel.useDualCheckpoints = true

# Describe the sink
agent.sinks.hdfs-sink.type = hdfs
agent.sinks.hdfs-sink.hdfs.path = /flume_data/%Y-%m-%d
agent.sinks.hdfs-sink.hdfs.fileSuffix = .jsonl
agent.sinks.hdfs-sink.hdfs.rollInterval = 3600
agent.sinks.hdfs-sink.hdfs.rollSize = 0
agent.sinks.hdfs-sink.hdfs.rollCount = 1000
agent.sinks.hdfs-sink.transactionCapacity = 1000
agent.sinks.hdfs-sink.hdfs.fileType = DataStream
agent.sinks.hdfs-sink.hdfs.writeFormat = Text

# Bind the source and sink to the channel
agent.sources.kafka-source.channels = file-channel
agent.sinks.hdfs-sink.channel = file-channel

5. Ejecute la prueba

Después de que comience la ejecución, los datos generados todos los días se almacenarán en diferentes carpetas de acuerdo con las reglas de almacenamiento preconfiguradas **%Y-%m-%d**, pero dado que los datos llegan en lotes, cada archivo habrá varios archivos en la carpeta, pero esto no afecta el cálculo de los datos y se pueden combinar y organizar si es necesario.

1. Ejecutar directamente

Al iniciar Flume, puede especificar el archivo de configuración a través del parámetro conf -f . Se recomienda asignar más memoria para evitar el desbordamiento:

nohup flume-ng agent -c conf -f ptah/to/kafka-memory-hdfs.conf -n agent -Dflume.root.logger=INFO,console -Xmx2g &

El registro en ejecución se puede encontrar en FLUME_HOME/flume.log Una vez que la prueba es estable, el proceso se puede suspender en segundo plano para su ejecución.

2. Supervisar el funcionamiento

Si necesita monitorear los indicadores convenientemente, puede agregar Prometheus al inicio Para conocer los pasos de instalación específicos, consulte la herramienta de monitoreo que puede personalizar los indicadores: la instalación y el despliegue de Prometheus .

  • preparación del entorno jmx

El paquete jar descargado se almacena en una ubicación adecuada: jmx_prometheus_javaagent-0.18.0.jar

  • Modificación del archivo de configuración

Agregue el siguiente contenido en el archivo de configuración flume conf [kafka-memory-hdfs.conf/kafka-file-hdfs.conf]:

flume.monitoring.type = jmx
  • Agregue reglas de monitoreo: config.yaml

Cree un nuevo archivo config.yaml y guárdelo en una ubicación adecuada.

startDelaySeconds: 0
ssl: false
lowercaseOutputName: false
lowercaseOutputLabelNames: false
whitelistObjectNames:
  - 'org.apache.flume.*:*'
blacklistObjectNames: []
  • Agregar configuración de monitoreo: prometheus.yml

Agregue un conjunto de trabajos relacionados con el canal a la configuración de scrape_configs. Después de la modificación, debe volver a cargar el archivo de configuración o reiniciar el proceso de Prometheus .

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "flume"
    static_configs:
      - targets: ["localhost:9998"]
  • Comando de inicio

Al iniciar Flume, especifique adicionalmente la ruta donde se encuentra el paquete jar y la ruta donde se encuentra el archivo de reglas de monitoreo. El número de puerto establecido es 9998, que es consistente con la configuración de Prometheus.

nohup flume-ng agent -c conf -f path/to/kafka-memory-hdfs.conf -n agent -Dflume.root.logger=INFO,console -Xmx2g -javaagent:/path/to/jmx_prometheus_javaagent-0.18.0.jar=9998:/path/to/config.yaml &
  • Efecto de seguimiento

Una vez completada la implementación, puede ver el estado del proceso de Flume a través del indicador jvm_threads_state :

Supongo que te gusta

Origin blog.csdn.net/u012039040/article/details/130939473
Recomendado
Clasificación