What Flume?

Flume 简介:

  • Flume用于将多种来源的日志以流的方式传输至Hadoop或者其它目的地(一种可靠、可用的高效分布式数据收集服务)
  • Flume拥有基于数据流上的简单灵活架构,支持容错、故障转移与恢复

批处理:处理离线数据,冷数据。单个处理数据量大,处理速度比流慢。

流处理:在线,实时产生的数据。单次处理的数据量小,但处理速度更快。

Flume 架构:

Flume的核心是把数据从数据源(source)收集过来,再将收集到的数据送到指定的目的地(sink),为了保证传输过程一定成功,在送到目的地(sink)之前,会先缓存(channel),待数据真正到达目的地(sink)之后,Flume再删除自己缓存的数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3E3Ul3wP-1597663263354)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20200804162246064.png)]

  • Client:客户端,数据产生的地方,如Web服务器
  • Event:事件,指通过Agent传输的单个数据包,如日志数据通常对应一行数据
  • Agent:代理,一个独立的JVM进程,相当于一个数据传输员
  • Flume以一个或多个Agent(分布式)部署运行
  • Agent包含三个组件
  • Source:采集源,用于和数据源对接,以获取数据,Source是数据的收集端,负责将数据捕获后进行特殊的格式化,将数据封装到事件(event) 里,然后将事件推入Channel中。 Flume提供了很多内置的Source, 支持 Avro, log4j, syslog 和 http post(body为json格式)。可以让应用程序同已有的Source直接打交道,如AvroSource,SyslogTcpSource。 如果内置的Source无法满足需要, Flume还支持自定义Source。
  • Channel:Channel是连接Source和Sink的组件,大家可以将它看做一个数据的缓冲区(数据队列),它可以将事件暂存到内存中也可以持久化到本地磁盘上, 直到Sink处理完该事件。介绍两个较为常用的Channel, MemoryChannel和FileChannel。
  • Sink:Sink从Channel中取出事件,然后将数据发到别处,可以向文件系统、数据库、 hadoop存数据, 也可以是其他agent的Source。在日志数据较少时,可以将数据存储在文件系统中,并且设定一定的时间间隔保存数据。

Flume组件:

Source

  • SourceRunner
  • Interceptor
  • Channel
  • ChannelSelector
  • ChannelProcessor
  • Sink
  • SinkRunner
  • SinkProcessor
  • SinkSelector

flume执行流程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ML661Ci6-1597663263356)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20200817094410075.png)]

How Flume?

Flume如何采集数据:

  • 配置文件
//在指定目录下写一个配置文件
cd /opt/flumeconf/
vi conf_0805_readline.properties	//文件名自定义
==>(添加信息)
#在此代理上命名组件
a2.channels=c2
a2.sources=s2
a2.sinks=k2

#描述配置源,监控test1下的所有文件
a2.sources.s2.type=spooldir
a2.sources.s2.spoolDir=/opt/test1

#描述通道中事件信息
a2.channels.c2.type=memory
a2.channels.c2.capacity=10000
a2.channels.c2.transactionCapacity=1000

#描述接收器
a2.sinks.k2.type=logger

#将源与接收器绑定到通道(sinks对应的channel只有一个,即不加 s )
a2.sinks.k2.channel=c2
a2.sources.s2.channels=c2
  • flume启动命令

参数

描述

-n,–name

agent的名称

-c,–conf

在目录使用配置文件。指定配置文件放在什么目录(可以省略)

-Dflume.root.logger

日志级别和输出源

-f,–conf-file

指定配置文件,这个配置文件必须在–conf参数定义的目录下

agent

运行一个Flume Agent

flume-ng agent -n a2 -c conf -f /opt/flumeconf/conf_0805_readline.properties -Dflume.root.logger=INFO,console
  • ·flume数据采集成功,监控文件夹下的源文件后缀都会变成.COMPLTETED,并且文件追加,flume会立即采集。

Flume常用配置:

1.可监控的多种数据源:

  • exec source
  • spooling directory source
  • http source
  • avro source
  • kafka source
  • netcat source
  • Taildir Source

1.exec source

执行Linux指令,并消费指令返回的结果,如“tail -f”

属性

缺省值

描述

type

-

exec

command

-

如“tail -f xxx.log”

shell

-

选择系统Shell程序,如“/bin/sh”

batchSize

20

发送给channel的最大行数

2.spooling directory source

从磁盘文件夹中获取文件数据,可避免重启或者发送失败后数据丢失,还可用于监控文件夹新文件

属性

缺省值

描述

type

-

spooldir

spoolDir

-

需读取的文件夹

fileSuffix

.COMPLETED

文件读取完成后添加的后缀

deletePolicy

never

文件完成后删除策略:never和immediate

3.http source

用于接收HTTP的Get和Post请求

属性

缺省值

描述

type

-

http

port

-

监听端口

bind

0.0.0.0

绑定IP

handler

org.apache.flume.source.http.JSONHandler

数据处理程序类全名

发送http数据:

curl -XPOST localhost:5140 -d'[{"headers":{"h1":"v1","h2":"v2"},"body":"hello body"}]'

4.avro source

监听Avro端口,并从外部Avro客户端接收events

属性

缺省值

描述

type

-

avro

bind

-

绑定IP地址

port

-

端口

threads

-

最大工作线程数量

2.常用的多种channel

  • Memory Channel
    event保存在Java Heap中。如果允许数据小量丢失,但是效率较高,推荐使用
  • File Channel
    event保存在本地文件中,可靠性高,但吞吐量低于Memory Channel
  • JDBC Channel
    event保存在关系数据中,一般不推荐使用
  • Kafka Channel
    数据直接写入kadka,适用于流处理

3.可以选的各种sink

  • avro sink
  • HDFS sink
  • Hive sink
  • HBase sink
  • Kafka sink

1.avro sink

作为avro客户端向avro服务端发送avro事件

属性

缺省值

描述

type

-

avro

hostname

-

服务端IP地址

post

-

端口

batch-size

100

批量发送事件数量

2.HDFS sink

将事件写入Hadoop分布式文件系统(HDFS)

属性

缺省值

描述

type

-

hdfs

hdfs.path

-

hdfs目录

hfds.filePrefix

FlumeData

文件前缀

hdfs.fileSuffix

-

文件后缀

3.Hive sink

包含分隔文本或JSON数据流事件直接进入Hive表或分区,传入的事件数据字段映射到Hive表中相应的列

属性

缺省值

描述

type

-

hive

hive.metastore

-

Hive metastore URI

hive.database

-

Hive数据库名称

hive.table

-

Hive表

serializer

-

序列化器负责从事件中分析出字段并将它们映射为Hive表中的列。序列化器的选择取决于数据的格式。支持序列化器:DELIMITED和JSON

4.HBase sink

属性

缺省值

描述

type

-

hbase

table

-

要写入的 Hbase 表名

columnFamily

-

要写入的 Hbase 列族

zookeeperQuorum

-

对应hbase.zookeeper.quorum

znodeParent

/hbase

zookeeper.znode.parent

serializer

org.apache.flume.sink.hbase.SimpleHbaseEventSerializer

一次事件插入一列

serializer.payloadColumn

-

列名col1

4.拦截器(可用,可以简单优化数据)

  • 拦截器可修改或丢弃事件
  • 设置在source和channel之间
  • 内置拦截器
  • HostInterceptor:在event header中插入“hostname”
  • TimestampInterceptor:插入时间戳
  • StaticInceptor:插入key-value
  • UUIDInceptor:插入UUID
  • ……

多层代理(拓扑结构)

  • 多跳(multi-agent flow)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pAnmosCB-1597663263357)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20200817121259626.png)]
  • 多路数据流(Multiplexing the flow)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2U0AG5Co-1597663263359)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20200817121333384.png)]
  • 合并(Consolidation),将多个源合并到一个目的地
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uL6dzeVN-1597663263363)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20200817122705527.png)]
  • Flume Sink组处理故障转移、负载均衡
  • sink组是用来创建逻辑上的一组sink
  • sink组的行为是由sink处理器(processor)决定的,它决定了event的路由策略
  • processor包括故障转移和负载均衡两类
#故障转移
a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k1 = 5
a1.sinkgroups.g1.processor.priority.k2 = 10
a1.sinkgroups.g1.processor.maxpenalty = 10000
#负载均衡
a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true
a1.sinkgroups.g1.processor.selector = random

Flume 实际案例:

1.Flume自定义拦截器(interceptor):

  • 配置文件
#组件命名
a3.channels=c3
a3.sources=s3
a3.sinks=k3

#配置源文件信息
a3.sources.s3.type=spooldir
a3.sources.s3.spoolDir=/opt/datas
#过滤器相关配置(过滤第一行头字段)
a3.sources.s3.interceptors=userid_filter
a3.sources.s3.interceptors.userid_filter.type=regex_filter
a3.sources.s3.interceptors.userid_filter.regex=userid.*
a3.sources.s3.interceptors.userid_filter.excludeEvents=true

#通道信息
a3.channels.c3.type=memory

#接收器信息
a3.sinks.k3.type=logger

#连接信息(sinks对应的channel只有一个,即不加 s )
a3.sources.s3.channels=c3
a3.sinks.k3.channel=c3

2.监控exec型source

  • 配置文件
#组件命名
a1.sources = s1
a1.channels = c1
a1.sinks = k1

#配置exec型source
a1.sources.s1.type = exec
a1.sources.s1.command = tail -f /opt/datas/exectest.txt

#配置channel
a1.channels.c1.type = memory

#配置sink
a1.sinks.k1.type = logger

#sink与channel连接(sinks对应的channel只有一个,即不加 s )
a1.sinks.k1.channel = c1
#source与channel连接
a1.sources.s1.channels = c1
  • 启动flume后,可以实时地向exectest.txt文件中添加信息,flume会实时监控
echo " hello world " >> exectest.txt 
echo " hello wufan01 " >> exectest.txt

3.flume监控tail source,并实现断点续传

Taildir Source:可实时监控一批文件,并记录每个文件最新消费位置,agent进程重启后不会有重复消费的问题。
使用时建议用1.8.0版本的flume,1.8.0版本中解决了Taildir Source一个可能会丢数据的bug。

  • 配置文件信息
#组件命名
a1.sources = s1
a1.channels = c1
a1.sinks = k1

#source配置,添加文件组
a1.sources.s1.type = TAILDIR
a1.sources.s1.filegroups = f1 f2
#配置filegroups的f1
a1.sources.s1.filegroups.f1 = /opt/datas/tail_1/test1.log
#配置filegroups的f2
a1.sources.s1.filegroups.f2 = /opt/datas/tail_2/.*log.*
#指定position的位置
a1.sources.s1.positionFile =
/opt/datas/tail_position/taildir_position.json
#指定headers,记录每次数据采集后的指针位置
a1.sources.s1.headers.f1.headerKey1 = value1
a1.sources.s1.headers.f2.headerKey1 = value2
a1.sources.s1.headers.f2.headerKey2 = value3
#开启header监控
a1.sources.s1.fileHeader = true

#channel配置
a1.channels.c1.type=memory

#sink配置
a1.sinks.k1.type=logger

#channel连接配置
a1.sinks.k1.channel=c1
a1.sources.s1.channels=c1
  • 新建文件并添加数据
touch test1.log
echo " wufan " >> test1.log
  • 开启flume,监控数据,每次监控指针的信息都会存入position.json文件中。
  • 关闭flume,再次添加数据,当flume开启,都会回到上次关闭时的指针位置,开始数据的采集。

4.flume数据导入HDFS

  • 配置文件信息
#组件命名
a2.channels=c2
a2.sources=s2
a2.sinks=k2

#source配置
a2.sources.s2.type=spooldir
a2.sources.s2.spoolDir=/opt/datas

#channel配置
a2.channels.c2.type=memory
a2.channels.c2.capacity=10000
a2.channels.c2.transactionCapacity=1000

#sink配置
a2.sinks.k2.type=hdfs
#指定文件位置
a2.sinks.k2.hdfs.path=hdfs://192.168.56.104:9000/tmp/customs
#传输参数(具体值如何设置可以参考官方文件)
a2.sinks.k2.hdfs.rollCount=5000
a2.sinks.k2.hdfs.rollSize=600000
a2.sinks.k2.hdfs.batchSize=500

#channel连接
a2.sinks.k2.channel=c2
a2.sources.s2.channels=c2

5.双层flume:avro->avro 多跳实现

  • sink->avro 配置文件信息
#组件命名
a1.sources = s1
a1.channels = c1
a1.sinks = sk1

#设置source类型为exec
a1.sources.s1.type = exec
#采集目标文件地址
a1.sources.s1.command = tail -f /opt/datas/exectest.txt

#指定sink
a1.sinks.sk1.type = avro
a1.sinks.sk1.hostname = localhost
a1.sinks.sk1.port = 44444

#channel配置
a1.channels.c1.type = memory

#source和channel连接
a1.sources.s1.channels = c1
#sink和channel连接
a1.sinks.sk1.channel = c1
  • source->avro 配置文件信息
#组件命名
a3.channels=c3
a3.sources=s3
a3.sinks=k3

#source配置
a3.sources.s3.type=avro
a3.sources.s3.bind= 0.0.0.0[/localhost]
a3.sources.s3.port=44444
 
#channel配置
a3.channels.c3.type=memory

#sink配置
a3.sinks.k3.type=logger

#channel连接
a3.sources.s3.channels=c3
a3.sinks.k3.channel=c3
  • 注意1:启动需要先启动 source->avro flume,再启动 sink->avro flume.
  • 注意2:avro接收器(sink)的hostname需和avro的数据源(source)的bind相同(我测试了就一下几种配置可行)

hostname

0.0.0.0/hostname

192.168.56.104(IP地址)

192.168.56.104(与前者相同)

0.0.0.0

0.0.0.0

sink->hostname

source->bind