21.大数据学习之旅——flume进阶

flume的Source
source学习网址:
http://flume.apache.org/FlumeUserGuide.html
一、Avro 类型的Source
监听Avro 端口来接收外部avro客户端的事件流。和netcat不同的是,avro-source接收到的是经过avro序列化后
的数据,然后反序列化数据继续传输。所以,如果是avro-source的话,源数据必须是经过avro序列化后的数
据。而netcat接收的是字符串格式。
利用Avro source可以实现多级流动、扇出流、扇入流等效果。
另外,也可以接收通过flume提供的avro客户端发送的日志信息。
Avro Source可配选项说明
21.大数据学习之旅——flume进阶_第1张图片
实现步骤:
1.修改配置文件,source的type属性为avro
2.根据指定的配置文件启动flume
格式代码,template-avro.conf为例子:

#配置Agent a1 的组件
a1.sources=r1
a1.channels=c1
a1.sinks=s1
#描述/配置a1的source1
a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=44444
#描述sink
a1.sinks.s1.type=logger
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

3.执行启动指令,如果出现如下提示,证明启动成功
21.大数据学习之旅——flume进阶_第2张图片
4.执行agent-avro客户端指令:

./flume-ng avro-client -H 0.0.0.0 -p 44444 -F ../mydata/1.txt -c ../conf/

(注:可以通过执行:./flume-ng help 来查看指令)
如果出现:
21.大数据学习之旅——flume进阶_第3张图片

二、Exec类型的Source
可以将命令产生的输出作为源
Exec Source 可配置选项说明
21.大数据学习之旅——flume进阶_第4张图片
在这里插入图片描述

实现步骤:
1.修改配置文件,source的type属性为avro
配置代码:

#配置Agent a1 的组件
a1.sources=r1
a1.channels=c1
a1.sinks=s1
#描述/配置a1的source1
a1.sources.r1 .type=exec
a1.sources.r1 .comman d=ping 192.168.234.163
#描述sink
a1.sinks.s1.type=logger
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

2.进入到bin目录执行指令:

./flume-ng agent --conf ../conf --conf-file ../conf/template-exec.conf --name a1 -
Dflume.root.logger=INFO,console

21.大数据学习之旅——flume进阶_第5张图片

结果为ping 当前主机返回的结果
(也可以尝试其他的linux指令,比如cat 1.txt 查看文件内容)
三、Spooling Directory类型的Source
将指定的文件加入到“自动搜集”目录中。flume会持续监听这个目录,把文件当做source来处理。注意:一旦
文件被放到“自动收集”目录中后,便不能修改,如果修改,flume会报错。此外,也不能有重名的文件,如果
有,flume也会报错。
在这里插入图片描述
21.大数据学习之旅——flume进阶_第6张图片

实现步骤:
1.配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.channels=c1
a1.sinks=s1
#描述/配置a1的source1
a1.sources.r1.type=spooldir
a1.sources.r1.spoolDir=/home/work/data
#描述sink
a1.sinks.s1.type=logger
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

2.创建相关的文件夹
3.根据指定的配置文件,启动flume
出现下图,证明flume正在监听指定的文件目录:
21.大数据学习之旅——flume进阶_第7张图片
4.向指定的文件目录下传送一个日志文件,发现flume的控制台打印相关的信息
此外,会发现被处理的文件,会追加一个后缀:completed,表示已处理完。
(重名文件包括已加后缀的文件)
四、NetCat Source
一个NetCat Source用来监听一个指定端口,并接收监听到的数据。
21.大数据学习之旅——flume进阶_第8张图片

配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.channels=c1
a1.sinks=s1
#描述/配置a1的r1
a1.sources.r1.type=netcat
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=44444
#描述a1的s1
a1.sinks.s1.type=logger
#描述a1的c1
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

五、Sequence Generator Source --序列发生源
一个简单的序列发生器,不断的产生事件,值是从0开始每次递增1。主要用来测试。
可配置选项
在这里插入图片描述
21.大数据学习之旅——flume进阶_第9张图片

配置示例

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1
a1.channels=c1
#描述/配置a1的source1
a1.sources.r1.type=seq
#描述sink
a1.sinks.s1.type=logger
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

六、HTTP source
此Source接受HTTP的GET和POST请求作为Flume的事件。其中GET方式应该只用于试验。
如果想让flume正确解析Http协议信息,比如解析出请求头、请求体等信息,需要提供一个可插拔的"处理器"来将
请求转换为事件对象,这个处理器必须实现HTTPSourceHandler接口。
这个处理器接受一个 HttpServletRequest对象,并返回一个Flume Envent对象集合。
flume提供了一些常用的Handler(处理器):
JSONHandler
可以处理JSON格式的数据,并支持UTF-8 UTF-16 UTF-32字符集
该handler接受Evnet数组,并根据请求头中指定的编码将其转换为Flume Event
如果没有指定编码,默认编码为UTF-8.

JSON格式如下:

[{
"headers" : {
"timestamp" : "434324343",
"host" : "random_host.example.com"
},
"body" : "random_body"
},
{
"headers" : {
"namenode" : "namenode.example.com",
"datanode" : "random_datanode.example.com"
},
"body" : "really_random_body"
}]

BlobHandler
BlobHandler是一种将请求中上传文件信息转化为event的处理器。
参数说明,加!为必须属性:
!handler – The FQCN of this class: org.apache.flume.sink.solr.morphline.BlobHandler
handler.maxBlobLength 100000000 The maximum number of bytes to read and buffer for a given
request
21.大数据学习之旅——flume进阶_第10张图片

配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1
a1.channels=c1
#描述/配置a1的source1
a1.sources.r1.type=http
a1.sources.r1.port=8888
#描述sink
a1.sinks.s1.type=logger
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

2.执行启动命令
3.执行curl 命令,模拟一次http的Post请求

curl -X POST -d '[{"headers":{"a":"a1"},"body":"hello 123"}]' http://0.0.0.0:8888

注:这种格式是固定的,因为我们用的是flume自身提供的Json格式的Handler。此外,需要包含header 和body两关
键字,这样,handler在解析时才能拿到对应的数据

flume的Sink
一、Logger Sink
记录指定级别(比如INFO,DEBUG,ERROR等)的日志,通常用于调试
要求,在 --conf(-c )参数指定的目录下有log4j的配置文件
根据设计,logger sink将体内容限制为16字节,从而避免屏幕充斥着过多的内容。如果想要查看调
试的完整内容,那么你应该使用其他的sink,也许可以使用file_roll sink,它会将日志写到本地文件
系统中。
可配置项说明
21.大数据学习之旅——flume进阶_第11张图片

配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.channels=c1
a1.sinks=s1
#描述/配置a1的r1
a1.sources.r1.type=netcat
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=44444
#描述a1的s1
a1.sinks.s1.type=logger
#描述a1的c1
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

二、File Roll Sink
在本地系统中存储事件。
每隔指定时长生成文件保存这段时间内收集到的日志信息。
可配置参数说明
21.大数据学习之旅——flume进阶_第12张图片

配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1
a1.channels=c1
#描述/配置a1的source1
a1.sources.r1.type=netcat
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=8888
#描述sink
a1.sinks.s1.type=file_roll
a1.sinks.s1.sink.directory=/home/work/rolldata
a1.sinks.s1.sink.rollInterval=60
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

创建指定的文件目录/home/work/rolldata
启动测试

../bin/flume-ng agent -c ./ -f ./template.conf -n a1

三、Avro Sink
是实现多级流动、扇出流(1到多) 扇入流(多到1) 的基础。
可配置项说明
21.大数据学习之旅——flume进阶_第13张图片

3.1 多级流动案例需求说明:
让01机的flume通过netcat source源接收数据,然后通过avro sink 发给02机==》02机的flume利用
avro source源收数据,然后通过avro sink 传给03机==》03机通过avro source源收数据,通过
logger sink 输出到控制台上
(本例中,02机的ip:192.168.234.212 || 03机的ip:192.168.234.213)
实现步骤:
1.准备三台虚拟机,并安装好flume(关闭每台机器的防火墙)
2.配置每台flume的配置文件
3.启动测试

01机的配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1
a1.channels=c1
#描述/配置a1的source
a1.sources.r1.type=netcat
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=8888
#描述sink
a1.sinks.s1.type=avro
a1.sinks.s1.hostname=192.168.234.212
a1.sinks.s1.port=9999
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

02机的配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1
a1.channels=c1
#描述/配置a1的source
a1.sources.r1.type= avro
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=9999
#描述sink
a1.sinks.s1.type= avro
a1.sinks.s1.hostname= 192.168.234.213
a1.sinks.s1.port=9999
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

03机的配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1
a1.channels=c1
#描述/配置a1的source1
a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=9999
#描述sink
a1.sinks.s1.type=logger
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

3.2扇出流案例需求说明
01机发出的数据,让02,03来接收
实现步骤:
1.准备三台虚拟机,并安装好flume(关闭每台机器的防火墙)
2.配置每台flume的配置文件
3.启动测试
01机的配置文件

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1 s2
a1.channels=c1 c2
#描述/配置a1的source1
a1.sources.r1.type=netcat
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=8888
#描述sink
a1.sinks.s1.type=avro
a1.sinks.s1.hostname=192.168.234.212
a1.sinks.s1.port=9999
a1.sinks.s2.type=avro
a1.sinks.s2.hostname=192.168.234.213
a1.sinks.s2.port=9999
#描述内存channel
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
#位channel 绑定 source和sink
a1.sources.r1.channels=c1 c2
a1.sinks.s1.channel=c1
a1.sinks.s2.channel=c2

02,03配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1
a1.channels=c1
#描述/配置a1的source1
a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=9999
#描述sink
a1.sinks.s1.type=logger
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

3.3 扇入案列需求说明
02,03机收到的数据都发往01
02,03的配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1
a1.channels=c1
#描述/配置a1的source1
a1.sources.r1.type=netcat
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=8888
#描述sink
a1.sinks.s1.type=avro
a1.sinks.s1.hostname=192.168.234.163
a1.sinks.s1.port=9999
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

01机的配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1
a1.channels=c1
#描述/配置a1的source1
a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=9999
#描述sink
a1.sinks.s1.type=logger
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

四、HDFS Sink
此Sink将事件写入到Hadoop分布式文件系统HDFS中。
目前它支持创建文本文件和序列化文件。
对这两种格式都支持压缩。
这些文件可以分卷,按照指定的时间或数据量或事件的数量为基础。
它还通过类似时间戳或机器属性对数据进行 buckets/partitions 操作 It also
buckets/partitions data by attributes like timestamp or machine where the event
originated.
HDFS的目录路径可以包含将要由HDFS替换格式的转移序列用以生成存储事件的目录/文件名。
使用这个Sink要求haddop必须已经安装好,以便Flume可以通过hadoop提供的jar包与HDFS进行通信。
可配置项说明
在这里插入图片描述
21.大数据学习之旅——flume进阶_第14张图片
配置文件
#配置Agent a1 的组件

a1.sources=r1
a1.sinks=s1
a1.channels=c1
#描述/配置a1的source1
a1.sources.r1.type=netcat
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=8888
#描述sink
a1.sinks.s1.type=hdfs
a1.sinks.s1.hdfs.path=hdfs://192.168.234.21:9000/flume
#处理数据的类型,DataStream为普通的文本类型
a1.sinks.s1.hdfs.fileType=DataStream
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink

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

报错是因为flume缺少相关hadoop的依赖jar包,找到以下的jar包,放到flume的lib目录下即可。
commons-configuration-1.6.jar
hadoop-auth-2.5.2.jar
hadoop-common-2.5.2.jar
hadoop-hdfs-2.5.2.jar
hadoop-mapreduce-client-core-2.5.2.jar
但是一个一个找特别麻烦,所以解决办法是将hadoop的jar包都拷贝到flume的lib目录下:
进入到hadoop安装目录的share目录下的hadoop目录
执行:

scp common/* common/lib/* hdfs/* hdfs/lib/* mapreduce/* mapreduce/lib/*
tools/lib/* 192.168.234.163:/home/software/flume/lib/

flume的Channel
一、Memory Channel
事件将被存储在内存中(指定大小的队列里)
非常适合那些需要高吞吐量且允许数据丢失的场景下
属性说明:
21.大数据学习之旅——flume进阶_第15张图片

配置示例略
二、JDBC Channel
事件会被持久化(存储)到可靠的数据库里,目前支持嵌入式Derby数据库。即source=》
channel=》sink。在传输的过程中,会先把事件存到关系型数据库里。但是Derby数据库不太
好用,所以JDBC Channel目前仅用于测试,不能用于生产环境。
三、FileChannel
好处:数据不丢失
坏处:极大的降低flume的吞吐量,因为要频繁的发生磁盘I/O
性能比较低,但是即使程序出错数据不会丢失
性能会比较低下,但是即使程序出错数据不会丢失
21.大数据学习之旅——flume进阶_第16张图片
配置示例:

a1.sources=r1
a1.channels=c1
a1.channels=c1
a1.sinks=s1
a1.sources.r1.type=netcat
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=8888
a1.sinks.s1.type=logger
a1.channels.c1.type=file
a1.channels.c1.dataDirs=/home/filechannel
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

四、内存溢出通道
优先把Event存到内存中,如果存不下,在溢出到文件中,目前处于测试阶段,还未能用于生
产环境

flume的Interceptors
概述
Flume有能力在运行阶段修改/删除Event,这是通过拦截器(Interceptors)来实现的。
拦截器需要实现org.apache.flume.interceptor.Interceptor接口。
拦截器可以修改或删除事件基于开发者在选择器中选择的任何条件。
拦截器采用了责任链模式,多个拦截器可以按指定顺序拦截。
一个拦截器返回的事件列表被传递给链中的下一个拦截器。
如果一个拦截器需要删除事件,它只需要在返回的事件集中不包含要删除的事件即可。
如果要删除所有事件,只需返回一个空列表。
一、Timestamp Interceptor
这个拦截器在事件头中插入以毫秒为单位的当前处理时间。
头的名字为timestamp,值为当前处理的时间戳。
如果在之前已经有这个时间戳,则保留原有的时间戳。
可配置项说明
21.大数据学习之旅——flume进阶_第17张图片
配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1 s2
a1.channels=c1 c2
#描述/配置a1的source1
a1.sources.r1.type=http
a1.sources.r1.port=8888
a1.sources.r1.selector.type=multiplexing
a1.sources.r1.selector.header=state
a1.sources.r1.selector.mapping.cn=c1
a1.sources.r1.selector.mapping.us=c2
a1.sources.r1.selector.default=c2
a1.sources.r1.interceptors=i1
a1.sources.r1.interceptors.i1.type=timestamp
#描述sink
a1.sinks.s1.type=avro
a1.sinks.s1.hostname=192.168.234.212
a1.sinks.s1.port=9999
a1.sinks.s2.type=avro
a1.sinks.s2.hostname=192.168.234.213
a1.sinks.s2.port=9999
#描述内存channel
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
#位channel 绑定 source和sink
a1.sources.r1.channels=c1 c2
a1.sinks.s1.channel=c1
a1.sinks.s2.channel=c2

结果:
在这里插入图片描述

二、Host Interceptor
这个拦截器插入当前处理Agent的主机名或ip
头的名字为host或配置的名称
值是主机名或ip地址,基于配置。
参数说明:
21.大数据学习之旅——flume进阶_第18张图片

配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1 s2
a1.channels=c1 c2
#描述/配置a1的source1
a1.sources.r1.type=http
a1.sources.r1.port=8888
a1.sources.r1.selector.type=multiplexing
a1.sources.r1.selector.header=state
a1.sources.r1.selector.mapping.cn=c1
a1.sources.r1.selector.mapping.us=c2
a1.sources.r1.selector.default=c2
a1.sources.r1.interceptors=i1 i2
a1.sources.r1.interceptors.i1.type=timestamp
a1.sources.r1.interceptors.i2.type=host
#描述sink
a1.sinks.s1.type=avro
a1.sinks.s1.hostname=192.168.234.212
a1.sinks.s1.port=9999
a1.sinks.s2.type=avro
a1.sinks.s2.hostname=192.168.234.213
a1.sinks.s2.port=9999
#描述内存channel
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
#位channel 绑定 source和sink
a1.sources.r1.channels=c1 c2
a1.sinks.s1.channel=c1
a1.sinks.s2.channel=c2

结果
在这里插入图片描述

三、Static Interceptor
此拦截器允许用户增加静态头信息使用静态的值到所有事件。
目前的实现中不允许一次指定多个头。
如果需要增加多个静态头可以指定多个Static interceptors
21.大数据学习之旅——flume进阶_第19张图片
在这里插入图片描述
配置示意:
21.大数据学习之旅——flume进阶_第20张图片
结果示意:
在这里插入图片描述
四.UUID Interceptor
这个拦截器在所有事件头中增加一个全局一致性标志。
其实就是UUID。
可配置说明
21.大数据学习之旅——flume进阶_第21张图片
配置示例:
21.大数据学习之旅——flume进阶_第22张图片
结果示意:
在这里插入图片描述
五.Search and Replace Interceptor
这个拦截器提供了简单的基于字符串的正则搜索和替换功能。
可配置项说明
21.大数据学习之旅——flume进阶_第23张图片
配置示意:
21.大数据学习之旅——flume进阶_第24张图片
发送的数据示意(比如在body里写一些数字):
在这里插入图片描述
结果示意:
在这里插入图片描述
六.Regex Filtering Interceptor
此拦截器通过解析事件体去匹配给定正则表达式来筛选事件。
所提供的正则表达式即可以用来包含或刨除事件。
属性说明:
21.大数据学习之旅——flume进阶_第25张图片
配置示意:
21.大数据学习之旅——flume进阶_第26张图片
结果将过滤到以jp开头的信息,即如果发送的是以jp开头的信息,则收不到
在这里插入图片描述

七.Regex Extractor Interceptor
使用指定正则表达式匹配事件,并将匹配到的组作为头加入到事件中。
它也支持插件化的序列化器用来格式化匹配到的组在加入他们作为头之前。
属性说明:
!type – 类型,必须是regex_extractor
!regex – 要匹配的正则表达式
!serializers – Space-separated list of serializers for mapping matches to
header names and serializing their values. (See example below) Flume provides
built-in support for the following serializers:
org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer
org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer
serializers..type default Must be default
(org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer),
org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer, or the
FQCN of a custom class that implements
org.apache.flume.interceptor.RegexExtractorInterceptorSerializer
serializers..name –
serializers.*– Serializer-specific properties

If the Flume event body contained 1:2:3.4foobar5 and the following configuration
was used
a1.sources.r1.interceptors.i1.regex = (\d)?\d)?\d)
a1.sources.r1.interceptors.i1.serializers = s1 s2 s3
a1.sources.r1.interceptors.i1.serializers.s1.name = one
a1.sources.r1.interceptors.i1.serializers.s2.name = two
a1.sources.r1.interceptors.i1.serializers.s3.name = three
The extracted event will contain the same body but the following headers will have
been added one=>1, two=>2, three=>3

flume的Selector
一、Selector的复制模式
选择器可以工作在复制、多路复用(路由) 模式下
Selector 默认是复制模式(replicating),即把source复制,然后分发给多个sink
21.大数据学习之旅——flume进阶_第27张图片

针对每个Source,都有一个配置参数,即selector.type

21.大数据学习之旅——flume进阶_第28张图片
配置示例:

a1.sources = r1
a1.channels = c1 c2 c3
a1.source.r1.selector.type = replicating(这个是默认的)
a1.source.r1.channels = c1 c2 c3
a1.source.r1.selector.optional = c3

二、多路复用模式
在这种模式下,用户可以指定转发的规则。selector根据规则进行数据的分发
可配置参数
21.大数据学习之旅——flume进阶_第29张图片
案例需求说明:
01机利用http resource接收数据,根据路由规则,发往02,03机。02,03通过avro source接收数据,通过logger sink 打印数据
说明:
检测的头信息是state关键字,如果state=CN,进c1通道。如果state=US,进c2,c3通道。如果不满足以上的情况,进c4通道。
配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1 s2
a1.channels=c1 c2
#描述/配置a1的source1
a1.sources.r1.type=http
a1.sources.r1.port=8888
a1.sources.r1.selector.type=multiplexing
a1.sources.r1.selector.header=state
a1.sources.r1.selector.mapping.cn=c1
a1.sources.r1.selector.mapping.us=c2
a1.sources.r1.selector.default=c2
#描述sink
a1.sinks.s1.type=avro
a1.sinks.s1.hostname=192.168.234.212
a1.sinks.s1.port=9999
a1.sinks.s2.type=avro
a1.sinks.s2.hostname=192.168.234.213
a1.sinks.s2.port=9999
#描述内存channel
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
#位channel 绑定 source和sink
a1.sources.r1.channels=c1 c2
a1.sinks.s1.channel=c1
a1.sinks.s2.channel=c2

02,03配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1
a1.channels=c1
#描述/配置a1的source1
a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=9999
#描述sink
a1.sinks.s1.type=logger
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

然后执行:

curl -X POST -d '[{"headers":{"state":"cn"},"body":"hello china" }]' http://192.168.150.137:8888

flume的Process

概述
Sink Group允许用户将多个Sink组合成一个实体。
Flume Sink Processor 可以通过切换组内Sink用来实现负载均衡的效果,或在一个Sink故障
时切换到另一个Sink。
格式要求:
sinks – 用空格分隔的Sink集合
processor.type default 类型名称,必须是 default、failover 或
load_balance
Default Sink Processor
Default Sink Processor 只接受一个 Sink。这是默认的策略。即如果不配置Processor,用
的是这个策略。
Failover Sink Processor
Failover Sink Processor 维护一个sink们的优先表。确保只要一个是可用的就事件就可以被
处理。
失败处理原理是,为失效的sink指定一个冷却时间,在冷却时间到达后再重新使用。
sink们可以被配置一个优先级,数字越大优先级越高。
如果sink发送事件失败,则下一个最高优先级的sink将会尝试接着发送事件。
如果没有指定优先级,则优先级顺序取决于sink们的配置顺序,先配置的默认优先级高于后配
置的。
在配置的过程中,设置一个group processor ,并且为每个sink都指定一个优先级。
优先级必须是唯一的。
另外可以设置maxpenalty属性指定限定失败时间。
可配置项说明
21.大数据学习之旅——flume进阶_第30张图片
在这里插入图片描述
配置示意:
21.大数据学习之旅——flume进阶_第31张图片
测试示意:首先向park01发送数据=》sink到park02和park03,但是park03的优先级高,所以
park03会收到。=》当把park03关机之后,经过超时时间后,park02才会收到数据。
在这里插入图片描述
Load balancing Sink Processor
Load balancing Sink processor 提供了在多个sink之间实现负载均衡的能力。
它维护了一个活动sink的索引列表。
它支持轮询 或 随机方式的负载均衡,默认值是轮询方式,可以通过配置指定。
也可以通过实现AbstractSinkSelector接口实现自定义的选择机制。
21.大数据学习之旅——flume进阶_第32张图片
21.大数据学习之旅——flume进阶_第33张图片
配置示意
注:负载均衡模式,通道为1个。此外,在启动flume时,先启动要负载的节点02,03,再启动
负责负载均衡的01节点:
01的配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1 s2
a1.channels=c1
a1.sinkgroups=g1
#描述/配置a1的source1
a1.sources.r1.type=http
a1.sources.r1.port=8888
a1.sinkgroups.g1.sinks=s1 s2
a1.sinkgroups.g1.processor.type=load_balance
a1.sinkgroups.g1.processor.selector=round_robin
轮叫调度算法(轮询发送)
#描述sink
a1.sinks.s1.type=avro
a1.sinks.s1.hostname=192.168.234.212
a1.sinks.s1.port=9999
a1.sinks.s2.type=avro
a1.sinks.s2.hostname=192.168.234.213
a1.sinks.s2.port=9999
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
a1.sinks.s2.channel=c1

02,03的配置示例:

#配置Agent a1 的组件
a1.sources=r1
a1.sinks=s1
a1.channels=c1
#描述/配置a1的source1
a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=9999
#描述sink
a1.sinks.s1.type=logger
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#位channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

Flume事务机制

概述
Flume的事务机制与可靠性保证的实现,最核心的组件是Channel(通道)。如果没有
Channel组件,而紧靠Source与Sink组件是无从谈起的。
文件通道(File Channel)
文件通道指的是将事件存储到代理(Agent)本地文件系统中的通道。虽然要比内存通道慢一
些,不过它却提供了持久化的存储路径,可以应对大多数情况,它应该用在数据流中不允许出
现缺口的场合。
内存通道
File channel虽然提供了持久化,但是其性能较差,吞吐量会受到一定的限制。相反,
memory channel则牺牲可靠性换取吞吐量。当然,如果机器断电重启,则无法恢复。在实
际应用中,大多数企业都是选择内存通道,因为在通过flume收集海量数据场景下,使用
FileChannel所带来的性能下降是很大的甚至是无法忍受的。
Flume内存通道事务机制
编程模型
21.大数据学习之旅——flume进阶_第34张图片
Put事务流程
Put事务可以分为以下阶段:
doPut:将批数据先写入临时缓冲区putList(Linkedblockingdequeue)
doCommit:检查channel内存队列是否足够合并。
doRollback:channel内存队列空间不足,回滚,等待内存通道的容量满足合并
putList就是一个临时的缓冲区,数据会先put到putList,最后由commit方法会检查channel是
否有足够的缓冲区,有则合并到channel的队列。
Take事务
21.大数据学习之旅——flume进阶_第35张图片
Take事务分为以下阶段:
doTake:先将数据取到临时缓冲区takeList(linkedBlockingDequeue)
将数据发送到下一个节点
doCommit:如果数据全部发送成功,则清除临时缓冲区takeList
doRollback:数据发送过程中如果出现异常,rollback将临时缓冲区takeList中的数据归还给
channel内存队列。

上一篇 20.大数据学习之旅——flume安装和配置

你可能感兴趣的:(大数据学习之旅,大数据)