Flume的基本设计思路我们清楚了(运木头的思路),Flume的基本组成我们也知道了(source + channel + sink)那么Flume采集运输数据的具体过程、他的组成架构具体是什么样的呢?我们来具体说说。
Source源:
首先我们的Source会将各种数据会一条一条读取到,当数据对量到达我们设定的Batch data数之后,进入transaction阶段,调用doPut方法,将数据写入临时缓冲区putList,之后再调用doCommit方法将数据推送到Channel队列中,推送之前会先检查Channel队列内存是否充足,如果内存足够的话就推送,内存不够的话就doRollBack,回滚数据到putList临时缓冲区。
Channel:
Flume自带的有两种Channel,一种是Memory Channel,一种是 File Channel。
Memory Channel:是基于内存缓存的,数据不安全,但是速度快。
File Channel:是Flume的持久化Channel。安全系统宕机数据也不丢失,但是速度慢。
数据在Channel中为一个一个Event的形式。
Sink:
transaction阶段通过调用doTake方法从Channel中拉取数据,放到临时缓冲区takeList中,然后调用doCommit方法将数据发送发到sink源,再由sink源将数据转发出去。
put事务:
doPut:将批数据写入临时缓冲区putList。
doCommit:检查Channel内存队列是否足够合并。
doRollBack:Channel内存不足回滚数据。
Take事务:
doTake事务:先将数据取到临时缓冲区takeList。
doCommit:如果数据全部都发送成功,则清除临时缓冲区takeList
doRollBack:数据发送过程中如果出现异常,rollBack将临时缓冲区takeList中的数据归还给channel内存队列。
要使用Flume,我们需要运行一个Flume代理,它是一个长期存在的Java进程,可以通过通道连接源和数据槽。Flume中的一个源产生事件并将其传递到通道,该事件将一直存储在通道,直到它们被转发到数据槽中。您可以将源---通道----数据槽组合视为基本的Flume构建块。Flume的一大优点在于,使用非常方便,要改变flume的使用只要更改其配置就行了。那么Flume的配置怎么配呢?我们先来看一个配置的例子:
agent1.sources = source1 //配置Source的名称
agent1.sinks = sink1 //配置sink的名称
agent1.channels = channel1 //配置channel的名称
agent1.sources.source1.channels = channel1 //将source和channel关联
agent1.sinks.sink1.channel = channel1 //将sink和channel关联
agent1.sources.source1.type = spooldir //设置数据源类型
agent1.sources.source1.spoolDir = /tmp/spooldir //设置数据源路径
agent1.sinks.sink1.type = logger //设置sink源数据类型
agent1.channels.channel1.type = file //设置channel种类
这是最基本的flume的配置,我们可以根据自己的业务需求设置对应的Source源,Channel、Sink源。另外还可以设置Channel的内存大小和最大负载能力等各种设置,具体大家可以去官网看相对应的配置:Flume官网-使用指南。我们常见的Source源一般有spooling、directory、exec、syslog、avro、netcat等,常见的Sink源有:HDFS、Kafka、logger、avro、File、自定义源等。不同的源的特点不同,应用场景也相应不同。需要我们结合自己的业务来选取相应的源类型。