38. Varios casos de uso de Flume

En el artículo anterior, presentamos la instalación de Flume y su uso sencillo. En este capítulo, presentaremos varios casos específicos basados ​​en Flume, que incluyen: extracción en tiempo real de archivos o directorios locales a HDFS, fan-in y fan de Flume -fuera, etc. Preste atención a la columna "Rompe el capullo y conviértase en una mariposa: Big Data" para ver más contenido relacionado ~


Tabla de contenido

1. Extraiga archivos locales a HDFS en tiempo real

2. Extraiga directorios locales a HDFS en tiempo real

En tercer lugar, el fan-in de Flume

Cuatro, abanico de Flume

4.1 Selector

4.2 grupo fregadero


1. Extraiga archivos locales a HDFS en tiempo real

1. Descripción de los requisitos

Supervise los registros de Hive y cárguelos en HDFS en tiempo real.

2. Realización concreta

(1) Para usar Flume para monitorear archivos cargados en HDFS, primero debe copiar varios paquetes jar al directorio lib de Flume, como se muestra a continuación:

cp /opt/modules/hadoop-2.7.2/share/hadoop/hdfs/hadoop-hdfs-2.7.2.jar /opt/modules/flume/lib/
cp /opt/modules/hadoop-2.7.2/share/hadoop/common/hadoop-common-2.7.2.jar /opt/modules/flume/lib/
cp /opt/modules/hadoop-2.7.2/share/hadoop/common/lib/hadoop-auth-2.7.2.jar /opt/modules/flume/lib/
cp /opt/modules/hadoop-2.7.2/share/hadoop/common/lib/commons-configuration-1.6.jar /opt/modules/flume/lib/
cp /opt/modules/hadoop-2.7.2/share/hadoop/common/lib/commons-io-2.4.jar /opt/modules/flume/lib/
cp /opt/modules/hadoop-2.7.2/share/hadoop/common/lib/htrace-core-3.1.0-incubating.jar /opt/modules/flume/lib/

(2) Cree un archivo de configuración

vim flume-filetoHDFS.conf
# 声明source、channel、sink
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# 配置source
# 要想读取Linux系统中的文件,就得按照Linux命令的规则执行命令。由于Hive日志在Linux系统中,所以读取文件的类型选择:exec,即execute执行的意思。
a1.sources.r1.type = exec
# 日志文件的位置
a1.sources.r1.command = tail -F /tmp/root/hive.log
a1.sources.r1.shell = /bin/bash -c

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

# 设置channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# 连接source、channel、sink
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

3. Ejecutar canal

bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/flume-filetoHDFS.conf

4. Inicie Hive para comprobar si hay datos en HDFS.

2. Extraiga directorios locales a HDFS en tiempo real

1. Descripción de los requisitos

Supervise un directorio local y cárguelo en HDFS en tiempo real.

2. Realización concreta

Cree un archivo de configuración y agregue el siguiente contenido:

a1.sources = r1
a1.sinks = k1
a1.channels = c1

a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /root/files
a1.sources.r1.fileSuffix = .COMPLETED
a1.sources.r1.fileHeader = true
# 忽略所有以.jar结尾的文件,不上传
a1.sources.r1.ignorePattern = ([^ ]*\.jar)

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

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

a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

3. Ejecutar canal

bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/flume-dirtoHDFS.conf

4. Compruebe si hay sincronización en HDFS

En tercer lugar, el fan-in de Flume

Como su nombre lo indica, fan-in significa que Flume tiene múltiples fuentes de datos importadas en una fuente, como se muestra en la siguiente figura:

1. Descripción de los requisitos

Flume en esclavo01 monitorea un archivo de registro, Flume en esclavo02 monitorea el flujo de datos de un puerto determinado, el Flume de los dos últimos nodos esclavos envía los datos al Flume del nodo maestro y el nodo maestro imprime los datos en la consola después de recibir los datos.

2. Realización concreta

(1) Distribuir Flume a los nodos esclavos

xsync /opt/modules/flume

(2) Escriba el archivo de configuración del nodo esclavo01

a1.sources = r1
a1.sinks = k1
a1.channels = c1

a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /root/files/xzw.log
a1.sources.r1.shell = /bin/bash -c

a1.sinks.k1.type = avro
a1.sinks.k1.hostname = master
a1.sinks.k1.port = 6868

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

a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

(3) Escriba el archivo de configuración del nodo slave02

a2.sources = r1
a2.sinks = k1
a2.channels = c1

a2.sources.r1.type = netcat
a2.sources.r1.bind = slave02
a2.sources.r1.port = 44444

a2.sinks.k1.type = avro
a2.sinks.k1.hostname = master
a2.sinks.k1.port = 6868

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

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

(4) Escriba el archivo de configuración del nodo maestro

a3.sources = r1
a3.sinks = k1
a3.channels = c1

a3.sources.r1.type = avro
a3.sources.r1.bind = master
a3.sources.r1.port = 6868

a3.sinks.k1.type = logger

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

a3.sources.r1.channels = c1
a3.sinks.k1.channel = c1

(5) Iniciar canal

bin/flume-ng agent --conf conf/ --name a3 --conf-file conf/flume-mtocon.conf -Dflume.root.logger=INFO,console
bin/flume-ng agent --conf conf/ --name a2 --conf-file conf/flume-s2tom.conf -Dflume.root.logger=INFO,console
bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/flume-s1tom.conf -Dflume.root.logger=INFO,console

(6) Prueba

Agregar datos al registro:

Enviar datos al puerto:

En la consola, puede encontrar que los datos se han impreso:

Cuatro, abanico de Flume

El fan-out de Flume significa que Flume se hunde a diferentes ubicaciones después de recibir los datos, estamos divididos en dos partes, que se realizan mediante selector y se realizan por grupo de sumideros.

4.1 Selector

El uso de selectores para lograr la función de distribución en abanico es usar una fuente única, múltiples canales y métodos de sumidero, como se muestra en la siguiente figura:

1. Descripción de los requisitos

Utilice Flume A para monitorear los cambios de un determinado archivo, Flume A transmite el contenido del archivo modificado a Flume B en tiempo real y Flume B envía el contenido a HDFS. Al mismo tiempo, el Flume A también transmite el contenido modificado al Flume C y el Flume C almacena el contenido localmente.

2. Realización concreta

(1) Escriba el archivo de configuración de Flume A

a1.sources = r1
a1.sinks = k1 k2
a1.channels = c1 c2
# 将数据流复制给所有channel
a1.sources.r1.selector.type = replicating

a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /tmp/root/hive.log
a1.sources.r1.shell = /bin/bash -c

# sink端的avro是一个数据发送者,Avro是由Hadoop创始人Doug Cutting创建的一种语言无关的数据序列化和RPC框架。
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = master 
a1.sinks.k1.port = 8888

a1.sinks.k2.type = avro
a1.sinks.k2.hostname = master
a1.sinks.k2.port = 6868

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

a1.sources.r1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2

(2) Escriba el archivo de configuración de Flume B

a2.sources = r1
a2.sinks = k1
a2.channels = c1

# source端的avro是一个数据接收服务
a2.sources.r1.type = avro
a2.sources.r1.bind = master
a2.sources.r1.port = 8888

a2.sinks.k1.type = hdfs
a2.sinks.k1.hdfs.path = hdfs://master:9000/flume-b/%Y%m%d/%H
#上传文件的前缀
a2.sinks.k1.hdfs.filePrefix = flume-b-
#是否按照时间滚动文件夹
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 = 600
#设置每个文件的滚动大小大概是128M
a2.sinks.k1.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a2.sinks.k1.hdfs.rollCount = 0

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

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

(3) Escriba el archivo de configuración de Flume C

a3.sources = r1
a3.sinks = k1
a3.channels = c2

a3.sources.r1.type = avro
a3.sources.r1.bind = master
a3.sources.r1.port = 6868

a3.sinks.k1.type = file_roll
a3.sinks.k1.sink.directory = /root/files/flume-c

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

a3.sources.r1.channels = c2
a3.sinks.k1.channel = c2

(4) Inicie tres canales por separado

bin/flume-ng agent --conf conf/ --name a3 --conf-file conf/flume-c.conf
bin/flume-ng agent --conf conf/ --name a2 --conf-file conf/flume-b.conf
bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/flume-a.conf

(5) La prueba encontró que los archivos de registro cargados se encontraron localmente y en HDFS

4.2 grupo fregadero

La elección de utilizar el grupo de sumideros para lograr la función de distribución en abanico es usar un método de fuente única, canal y sumidero múltiple.Este método realmente implementa el equilibrio de carga de Flume. Como se muestra abajo:

1. Descripción de los requisitos

Utilice Flume D para monitorear los cambios de puerto. Flume D transmite el contenido monitoreado a Flume E en tiempo real, y Flume E imprime el contenido en la consola. Al mismo tiempo, Flume D también envía el contenido modificado a Flume F y Flume F también imprime el contenido en la consola.

2. Realización concreta

(1) Escriba el archivo de configuración de Flume D

a1.sources = r1
a1.channels = c1
a1.sinkgroups = g1
a1.sinks = k1 k2

a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444

a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true
a1.sinkgroups.g1.processor.selector = round_robin
a1.sinkgroups.g1.processor.selector.maxTimeOut=10000

a1.sinks.k1.type = avro
a1.sinks.k1.hostname = master
a1.sinks.k1.port = 8888

a1.sinks.k2.type = avro
a1.sinks.k2.hostname = master
a1.sinks.k2.port = 6868

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

a1.sources.r1.channels = c1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c1

(2) Escriba el archivo de configuración de Flume E

a2.sources = r1
a2.sinks = k1
a2.channels = c1

a2.sources.r1.type = avro
a2.sources.r1.bind = master
a2.sources.r1.port = 8888

a2.sinks.k1.type = logger

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

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

(3) Escriba el archivo de configuración de Flume F

a3.sources = r1
a3.sinks = k1
a3.channels = c2

a3.sources.r1.type = avro
a3.sources.r1.bind = master
a3.sources.r1.port = 6868

a3.sinks.k1.type = logger

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

a3.sources.r1.channels = c2
a3.sinks.k1.channel = c2

(4) Inicie tres canales por separado

bin/flume-ng agent --conf conf/ --name a3 --conf-file conf/flume-f.conf -Dflume.root.logger=INFO,console
bin/flume-ng agent --conf conf/ --name a2 --conf-file conf/flume-e.conf -Dflume.root.logger=INFO,console
bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/flume-d.conf -Dflume.root.logger=INFO,console

(5) Abra el puerto y genere datos

Puede ver que la consola ha impreso el contenido de la transmisión:

 

Bueno, los anteriores son algunos casos de uso de Flume. Es relativamente simple. ¿Qué problemas encuentra en este proceso? Bienvenido a dejar un mensaje y déjeme ver qué problemas encontró ~

Supongo que te gusta

Origin blog.csdn.net/gdkyxy2013/article/details/112240221
Recomendado
Clasificación