Canal artificial
1. Fondo de canal
1.1 El problema
Los datos de HDFS, MapReduce, HBase te los da tu jefe
Necesita código para manejar una empresa en el trabajo, y el jefe solo mencionará los requisitos. Primero, sabe cómo es el tipo de datos.
Los datos de los pedidos, los datos del usuario y los datos del producto se almacenan en mysql,
Alta eficiencia, porque seleccione * de productos cuyo nombre sea% s%
Los hombres ven un determinado producto más que las mujeres, ¡pero no en la base de datos!
En otras palabras, la base de datos almacenará datos, ¡pero algunas empresas no tienen datos!
¡Así que tenemos que recopilar datos!
1.2 Recopilar datos
Fuentes de datos:
- expediente
- base de datos
- Solo rastreador para datos públicos, es proporcionar uso compartido para que todos puedan usar
- Cooperación, compra (WeChat + JD) atracción de tráfico, intercambio de datos, desviación
Pregunta 1: ¿Por qué no hay Taobao en WeChat?
Problemas encontrados:
¿Cuántas veces una persona mira un producto ?, ¿cuál
compra
más veces ?
Mire los datos del producto (datos fríos ) cuando la cantidad de datos sea grande, no se colocarán en la base de datos porque deben calcularse
Datos fríos: los datos generalmente no cambian, datos históricos, datos de registro
Tipo de formato
- coma csv
- tabla tsv
- json
- xml
- texto
- Línea
- De columna
- compresión
1.3 Soluciones
Conclusión final: es necesario resolver la inconsistencia del formato de datos y la ubicación de almacenamiento.
Esperanza: un componente puede resolver todos los problemas
http://hadoop.apache.org/
http://flume.apache.org/
no en la página de inicio, donado por cloudera
1.4 Problemas existentes
Flujo de procesamiento de big data:
- recopilación de datos
- ETL de datos
- almacenamiento de datos
- Cálculo y análisis de datos
- Visualización de datos
Dificultades en la recopilación de datos:
- Varias fuentes de datos
- Gran cantidad de datos, cambios rápidos, transmisión de datos
- Evite los datos duplicados
- Asegurar la calidad de los datos
- Rendimiento de la recopilación de datos
nombre:
- flume OG (generación original) versión anterior a 1.0
- Después de flume NG (próxima generación) 1.0
2. Introducción a Flume
Ventajas: fiabilidad, horizontalidad.
Pasos generales:
- Recopilación de datos de canal
- Limpieza, cálculo de MapReduce
- Guardar en HBase
- Estadísticas y análisis de Hive
- Guardar en la tabla de Hive
- Exportación de Sqoop
- MySQL
- Visualización web
2.1 Introducción a Flume
- Evento: Es la unidad básica de transmisión de datos de Flume, que envía datos desde el origen al destino final en forma de eventos.
- Cliente: Envuelva un registro original en Eventos y envíelo a una o más entidades
- Agente: Transferir eventos de un nodo a otro nodo o destino final
El agente incluye fuente, canal, sumidero
- Fuente: se utiliza para conectarse a la fuente de datos, aceptar el evento o empaquetar los datos recopilados en el evento
- Canal: Incluyendo eventos de conducción y sondeo de dos tipos.
La fuente debe estar asociada con al menos un canal.
Puede funcionar con cualquier número de fuentes y receptores. Se
utiliza para almacenar en caché los eventos entrantes, conectar la fuente y el receptor, y ejecutarse en la memoria.
- sumidero: Almacene el evento en el terminal de destino final, como HDFS, HBase
Similar al grupo de búfer de datos JDBC, alto rendimiento sin insertar uno por uno
2.2 Arquitectura de Flume
2.2.1 Un solo agente recopila datos
2.2.2 Recopilación de datos de la serie Multi-Agent
2.2.3 Recopilación de datos en serie combinada de agentes múltiples
2.2.4 Recopilación de datos de series de fusión de agentes múltiples
3. Instalación y configuración del canal
3.1 Cargue el paquete de instalación en CentOS
Descomprima el paquete de instalación en el directorio hadoop
tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /usr/hadoop
3.2 Configurar variables de entorno
vi /etc/profile
Agregue el siguiente código al final, guarde y salga
export FLUME_HOME=/usr/hadoop/apache-flume-1.9.0-bin
export PATH=$FLUME_HOME/bin:$PATH
Configuración efectiva
source /etc/profile
3.3 Entorno de verificación
flume-ng version
Aparecen los siguientes resultados y la configuración es correcta
Flume 1.9.0
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
Revision: d4fcab4f501d41597bc616921329a4339f73585e
Compiled by fszabo on Mon Dec 17 20:45:25 CET 2018
From source with checksum 35db629a3bda49d23e9b3690c80737f9
3.4 Configurar archivo Flume
//
reglas de flume en /usr/hadoop/apache-flume-1.9.0-bin :
- Especifique el nombre del Agente y los nombres de los distintos componentes del Agente especificado
- Especificar fuente
- Especificar canal
- Fregadero designado
- Especificar la relación entre Fuente, Canal y Receptor
Descargue el paquete de instalación de telnet e instálelo
rpm -ivh your-package
Cree y modifique archivos de configuración en Flume. Tenga en cuenta que se crea en /hadoop/apache-flume-1.9.0-bin
mkdir agent
Abrir bajo el agente: vi netcat-logger.properties
Añadir:
Configure el nombre del agente, la fuente, el canal y el receptor
# 配置Agent名称、Source、Channel、Sink的名称
a1.sources=r1
a1.channels=c1
a1.sinks=k1
# 配置Channel组件属性c1
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
# 配置Source组件属性r1
a1.sources.r1.type=netcat
a1.sources.r1.bind=localhost
a1.sources.r1.port=8888
# 配置Sink组件属性k1
a1.sinks.k1.type=logger
#连接关系
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
Guardar y Salir
No se preocupe> inicie Agent para recopilar datos
-c conf:指定flume自身配置文件所在目录
-n a1:指定agent的名字
-f agent/netcat-logger.properties:指定采集规则目录
-D:Java配置参数
Ingrese el siguiente comando bajo el agente:
flume-ng agent -c conf -n a1 -f ../agent/netcat-logger.properties -Dflume.root.logger=INFO,console
Abra el maestro en una nueva ventana y use el comando telnet; telnet localhost 8888 ingrese "hola"
Continuar ingresando evento para generar evento
4. Componentes del canal
4.1 Fuente
Las fuentes más utilizadas en Flume incluyen NetCat, Avro, Exec, Spooling Directory, Taildir y las fuentes también se pueden personalizar de acuerdo con las necesidades de los escenarios comerciales. La introducción específica es la siguiente.
4.1.1 Fuente NetCat
NetCat Source puede usar dos protocolos, TCP y UDP. El método de uso es básicamente el mismo. Transmite datos monitoreando la IP y el puerto especificados. Convierte cada línea de datos que monitorea en un Evento y lo escribe en el Canal. (Los parámetros obligatorios están marcados con @, lo mismo a continuación)
canales @ -
type @ -El tipo se especifica como: netcat
bind @ -bind nombre de máquina o dirección IP
puerto @ -número de puerto
max-line-length
Nombre de la propiedad | Defecto | Descripción |
---|---|---|
canales @ | - | |
tipo@ | - | Tipo especificado como: netcat |
enlazar@ | - | Vincular el nombre de la máquina o la dirección IP |
Puerto@ | - | El número de puerto |
max-line-length | 512 | Número máximo de bytes en una línea |
Ack-every-event | cierto | Regrese OK al evento aceptado exitosamente |
selector.type | replicando | Tipo de selector de replicación o multiplexación |
selector.* | Parámetros relacionados con el selector | |
interceptores | - | Lista de interceptores, separados por espacios |
interceptores. * | Parámetros relacionados con el interceptor |
4.1.2 Fuente Avro
Los agentes en diferentes hosts pueden usar fuentes para transmitir datos a través de la red. Generalmente, aceptan datos de clientes Avro o existen en pares con el Avro Sink del agente de nivel superior.
Nombre de la propiedad | Defecto | Descripción |
---|---|---|
canales @ | - | |
tipo@ | - | Tipo especificado como: avro |
enlazar@ | - | Escuchando nombre de host o dirección IP |
Puerto@ | - | El número de puerto |
hilos | - | Número máximo de subprocesos que se pueden utilizar para la transmisión |
selector.type | ||
selector.* | ||
interceptores | - | Lista de interceptores |
interceptores. * | ||
tipo de compresión | ninguna | Se puede configurar en "ninguno" o "desinflar". El tipo de compresión debe coincidir con AvroSource |
4.1.3 Fuente ejecutiva
Exec source transmite los datos de resultados ejecutando un comando Unix dado, como cat, tail -F, etc., con un alto rendimiento en tiempo real, pero una vez que el proceso del Agente tiene un problema, puede causar la pérdida de datos.
Nombre de la propiedad | Defecto | Descripción |
---|---|---|
canales @ | - | |
tipo@ | - | El tipo se especifica como: exec |
mando@ | - | Comandos a ejecutar |
cáscara | - | Archivo de script de shell para ejecutar el comando |
reiniciar el acelerador | 10000 | Reiniciar tiempo de espera |
reiniciar | falso | Si la ejecución del comando falla, si reiniciar |
logStdErr | falso | Ya sea para registrar el registro de errores |
tamaño del lote | 20 | El número máximo de registros escritos en el canal en lotes |
batchTimeout | 3000 | Tiempo máximo de espera para datos de escritura por lotes (ms) |
selector.type | replicando | Tipo de selector de replicación o multiplexación |
selector.* | Otros parámetros del selector | |
interceptores | - | Lista de interceptores, separados por múltiples espacios |
interceptores. * |
4.1.4 Spooling Directory Source
Al monitorear una carpeta para convertir el contenido del nuevo archivo en datos de transmisión de eventos, la característica es que no se perderán datos. Dos puntos a tener en cuenta al usar Spooling Directory Source son:
1. No se pueden realizar cambios en los archivos recién agregados en la carpeta supervisada.
2.新增到监控文件夹的文件名称必须是唯一的。由于是对整个新增文件的监控,Spooling Directory Source的实时性相对较低,不过可以采用对文件高粒度分割达到近似实时。
Property Name | Default | Description |
---|---|---|
channels@ | – | |
type@ | – | 类型指定:spooldir. |
spoolDir@ | – | 被监控的文件夹目录 |
fileSuffix | .COMPLETED | 完成数据传输的文件后缀标志 |
deletePolicy | never | 删除已经完成数据传输的文件时间:never or immediate |
fileHeader | false | 是否在header中添加文件的完整路径信息 |
fileHeaderKey | file | 如果header中添加文件的完整路径信息时key的名称 |
basenameHeader | false | 是否在header中添加文件的基本名称信息 |
basenameHeaderKey | basename | 如果header中添加文件的基本名称信息时key的名称 |
includePattern | ^.*$ | 使用正则来匹配新增文件需要被传输数据的文件 |
ignorePattern | ^$ | 使用正则来忽略新增的文件 |
trackerDir | .flumespool | 存储元数据信息目录 |
consumeOrder | oldest | 文件消费顺序:oldest, youngest and random. |
maxBackoff | 4000 | 如果channel容量不足,尝试写入的超时时间,如果仍然不能写入,则会抛出ChannelException |
batchSize | 100 | 批次处理粒度 |
inputCharset | UTF-8 | 输入码表格式 |
decodeErrorPolicy | FAIL | 遇到不可解码字符后的处理方式:FAIL,REPLACE,IGNORE |
selector.type | replicating | 选择器类型:replicating or multiplexing |
selector.* | 选择器其他参数 | |
interceptors | – | 拦截器列表,空格分隔 |
interceptors.* |
4.1.5 Taildir Source
可以实时的监控指定一个或多个文件中的新增内容,由于该方式将数据的偏移量保存在一个指定的json文件中,即使在Agent挂掉或被kill也不会有数据的丢失,需要注意的是,该Source不能在Windows上使用。
Property Name | Default | Description |
---|---|---|
channels@ | – | |
type@ | – | 指定类型:TAILDIR. |
filegroups@ | – | 文件组的名称,多个空格分隔 |
filegroups.@ | – | 被监控文件的绝对路径 |
positionFile | ~/.flume/taildir_position.json | 存储数据偏移量路径 |
headers… | – | Header key的名称 |
byteOffsetHeader | false | 是否添加字节偏移量到key为‘byteoffset’值中 |
skipToEnd | false | 当偏移量不能写入到文件时是否跳到文件结尾 |
idleTimeout | 120000 | 关闭没有新增内容的文件超时时间(毫秒) |
writePosInterval | 3000 | 在positionfile 写入每一个文件lastposition的时间间隔 |
batchSize | 100 | 批次处理行数 |
fileHeader | false | 是否添加header存储文件绝对路径 |
fileHeaderKey | file | fileHeader启用时,使用的key |
4.2 Channels
官网提供的Channel有多种类型可供选择,这里介绍Memory Channel和File Channel。
4.2.1 Memory Channel
Memory Channel是使用内存来存储Event,使用内存的意味着数据传输速率会很快,但是当Agent挂掉后,存储在Channel中的数据将会丢失。
Property Name | Default | Description |
---|---|---|
type@ | – | 类型指定为:memory |
capacity | 100 | 存储在channel中的最大容量 |
transactionCapacity | 100 | 从一个source中去或者给一个sink,每个事务中最大的事件数 |
keep-alive | 3 | 对于添加或者删除一个事件的超时的秒钟 |
byteCapacityBufferPercentage | 20 | 定义缓存百分比 |
byteCapacity | see description | Channel中允许存储的最大字节总数 |
4.2.2 File Channel
File Channel使用磁盘来存储Event,速率相对于Memory Channel较慢,但数据不会丢失。
Property Name | Default | Description |
---|---|---|
type@ | – | 类型指定:file. |
checkpointDir | ~/.flume/file-channel/checkpoint | checkpoint目录 |
useDualCheckpoints | false | 备份checkpoint,为True,backupCheckpointDir必须设置 |
backupCheckpointDir | – | 备份checkpoint目录 |
dataDirs | ~/.flume/file-channel/data | 数据存储所在的目录设置 |
transactionCapacity | 10000 | Event存储最大值 |
checkpointInterval | 30000 | checkpoint间隔时间 |
maxFileSize | 2146435071 | 单一日志最大设置字节数 |
minimumRequiredSpace | 524288000 | 最小的请求闲置空间(以字节为单位) |
capacity | 1000000 | Channel最大容量 |
keep-alive | 3 | 一个存放操作的等待时间值(秒) |
use-log-replay-v1 | false | Expert: 使用老的回复逻辑 |
use-fast-replay | false | Expert: 回复不需要队列 |
checkpointOnClose | true |
4.3 Sinks
Flume常用Sinks有Log Sink,HDFS Sink,Avro Sink,Kafka Sink,当然也可以自定义Sink。
4.3.1 Logger Sink
Logger Sink以INFO 级别的日志记录到log日志中,这种方式通常用于测试。
Property Name | Default | Description |
---|---|---|
channel@ | – | |
type@ | – | 类型指定:logger |
4.3.2 HDFS Sink
Sink数据到HDFS,目前支持text 和 sequence files两种文件格式,支持压缩,并可以对数据进行分区,分桶存储。
Name | Default | Description |
---|---|---|
channel@ | – | |
type@ | – | 指定类型:hdfs |
hdfs.path@ | – | HDFS的路径 hdfs://namenode/flume/webdata/ |
hdfs.filePrefix | FlumeData | 保存数据文件的前缀名 |
hdfs.fileSuffix | – | 保存数据文件的后缀名 |
hdfs.inUsePrefix | – | 临时写入的文件前缀名 |
hdfs.inUseSuffix | .tmp | 临时写入的文件后缀名 |
hdfs.rollInterval | 30 | 间隔多长将临时文件滚动成最终目标文件,单位:秒, 如果设置成0,则表示不根据时间来滚动文件 |
hdfs.rollSize | 1024 | 当临时文件达到多少(单位:bytes)时,滚动成目标文件, 如果设置成0,则表示不根据临时文件大小来滚动文件 |
hdfs.rollCount | 10 | 当 events 数据达到该数量时候,将临时文件滚动成目标文件,如果设置成0,则表示不根据events数据来滚动文件 |
hdfs.idleTimeout | 0 | 当目前被打开的临时文件在该参数指定的时间(秒)内, 没有任何数据写入,则将该临时文件关闭并重命名成目标文件 |
hdfs.batchSize | 100 | 每个批次刷新到 HDFS 上的 events 数量 |
hdfs.codeC | – | 文件压缩格式,包括:gzip, bzip2, lzo, lzop, snappy |
hdfs.fileType | SequenceFile | 文件格式,包括:SequenceFile, DataStream,CompressedStre, 当使用DataStream时候,文件不会被压缩,不需要设置hdfs.codeC; 当使用CompressedStream时候,必须设置一个正确的hdfs.codeC值; |
hdfs.maxOpenFiles | 5000 | 最大允许打开的HDFS文件数,当打开的文件数达到该值,最早打开的文件将会被关闭 |
hdfs.minBlockReplicas | – | HDFS副本数,写入 HDFS 文件块的最小副本数。 该参数会影响文件的滚动配置,一般将该参数配置成1,才可以按照配置正确滚动文件 |
hdfs.writeFormat | Writable | 写 sequence 文件的格式。包含:Text, Writable(默认) |
hdfs.callTimeout | 10000 | 执行HDFS操作的超时时间(单位:毫秒) |
hdfs.threadsPoolSize | 10 | hdfs sink 启动的操作HDFS的线程数 |
hdfs.rollTimerPoolSize | 1 | hdfs sink 启动的根据时间滚动文件的线程数 |
hdfs.kerberosPrincipal | – | HDFS安全认证kerberos配置 |
hdfs.kerberosKeytab | – | HDFS安全认证kerberos配置 |
hdfs.proxyUser | 代理用户 | |
hdfs.round | false | 是否启用时间上的”舍弃” |
hdfs.roundValue | 1 | 时间上进行“舍弃”的值 |
hdfs.roundUnit | second | 时间上进行”舍弃”的单位,包含:second,minute,hour |
hdfs.timeZone | Local Time | 时区。 |
hdfs.useLocalTimeStamp | false | 是否使用当地时间 |
hdfs.closeTries 0 | Number | hdfs sink 关闭文件的尝试次数;如果设置为1,当一次关闭文件失败后,hdfs sink将不会再次尝试关闭文件, 这个未关闭的文件将会一直留在那,并且是打开状态; 设置为0,当一次关闭失败后,hdfs sink会继续尝试下一次关闭,直到成功 |
hdfs.retryInterval | 180 | hdfs sink 尝试关闭文件的时间间隔, 如果设置为0,表示不尝试,相当于于将hdfs.closeTries设置成1 |
serializer | TEXT | 序列化类型 |
serializer.* |
4.3.3 Avro Sink
Nombre de la propiedad | Defecto | Descripción |
---|---|---|
canal@ | - | |
tipo@ | - | Tipo especificado: avro. |
nombre de host @ | - | Nombre de host o IP |
Puerto@ | - | El número de puerto |
tamaño del lote | 100 | Número de eventos por lotes |
tiempo de espera de conexión 20000 | El tiempo de conexión expiro | |
pide tiempo fuera | 20000 | Pide tiempo fuera |
tipo de compresión | ninguna | Tipo de compresión, "ninguna" o "desinflar". |
nivel de compresión | 6 | Nivel de compresión, 0 significa sin compresión, cuanto mayor sea el número 1-9, mayor será la relación de compresión |
ssl | falso | Usar cifrado ssl |
4.3.4 Fregadero Kafka
Para transferir datos a Kafka, debe prestar atención a la compatibilidad de la versión Flume y la versión Kafka
Nombre de la propiedad | Defecto | Descripción |
---|---|---|
tipo | - | Tipo especificado: org.apache.flume.sink.kafka.KafkaSink |
kafka.bootstrap.servers | - | Dirección de servicio de Kafka |
kafka.topic | tema-canal-predeterminado | tema kafka |
FlumeBatchSize | 100 | Número de eventos escritos en kafka en lotes |
5. Use Flume para monitorear carpetas
5.1 Generar archivos de prueba
Operar en el nodo maestro
mkdir wallasunRui-log
cd wallasunRui-log
vi 1.log
Siéntase libre de agregar contenido al archivo 1.log wallasunRui
cp 1.log 2.log
5.2 Archivo de configuración
Cree el archivo de configuración spooldir-hdfs.properties en la carpeta del agente
#agent名, source、channel、sink的名称
agent1.sources = source1
agent1.channels = channel1
agent1.sinks = sink1
#配置source
agent1.sources.source1.type = spooldir
agent1.sources.source1.spoolDir = /usr/wallasunRui-log
agent1.sources.source1.fileHeader=false
#配置拦截器
agent1.sources.source1.interceptors=i1
agent1.sources.source1.interceptors.i1.type = host
agent1.sources.source1.interceptors.i1.hostHeader = hostname
# 配置sink
agent1.sinks.sink1.type = hdfs
agent1.sinks.sink1.hdfs.path =hdfs://master:8020/flume-log/%y-%m-%d/%H-%M
agent1.sinks.sink1.hdfs.filePrefix = events
#最大同时打开文件的数量
agent1.sinks.sink1.hdfs.maxOpenFiles = 5000
#批次传输的个数
agent1.sinks.sink1.hdfs.batchSize= 100
agent1.sinks.sink1.hdfs.fileType = DataStream
agent1.sinks.sink1.hdfs.writeFormat =Text
#HDFS上的文件达到128M时生成一个文件
agent1.sinks.sink1.hdfs.rollSize = 102400
agent1.sinks.sink1.hdfs.rollCount = 1000000
#HDFS上的文件达到60秒生成一个文件
agent1.sinks.sink1.hdfs.rollInterval = 60
agent1.sinks.sink1.hdfs.useLocalTimeStamp = true
#配置channel
agent1.channels.channel1.type = memory
agent1.channels.channel1.keep-alive=120
agent1.channels.channel1.capacity = 10000
agent1.channels.channel1.transactionCapacity = 100
#组装source、channel、sink
agent1.sources.source1.channels = channel1
agent1.sinks.sink1.channel = channel1
5.3 Ejecutar canal
Copie el archivo de configuración de hadoop en la configuración de flume
cp core-site.xml hdfs-site.xml /usr/hadoop/apache-flume-1.9.0-bin/conf
Ingrese a la carpeta flume / bin
flume-ng agent -c conf -n agent1 -f ../agent/spooldir-hdfs.properties
Parámetros opcionales: deje que la consola muestre datos
-Dflume.root.logger=INFO,console
Ingrese yoseng-log y cambie el nombre del archivo
1.log.COMPLETED 2.log.COMPLETED
Ingrese a la interfaz web para ver el directorio hdfs y ver el archivo de eventos generado
http://192.168.147.10:50070/explorer.html#/flume-log
O ver a través del código
hadoop fs -ls /flume-log/
hdfs dfs -ls /flume-log
5.4 Resumen
- spooldir se usa para monitorear carpetas, si se agrega un archivo a la carpeta, será detectado
- Cuando el sufijo del nombre de archivo es '.COPLETED', el canal no
- El contenido del archivo cambia y no se recopilará