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安装流程 + Flume采集nc数据:
flume–安装流程:https://blog.csdn.net/weixin_42151880/article/details/108048279
注意:flume安装在被监控的节点上(有几个节点就需要安装几个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
-