Flume为什么是流式处理,如何使用

我们都知道Hadoop、Spark用于处理非常大的数据集,通常假设数据是已经在HDFS中,或者可以批量复制。然而,有很多系统不符合这个假设,他们产生了我们想要的数据流,使用Hadoop进行收集,存储和分析,Apache Flume系统是处理这些问题理想的方案。

640?wx_fmt=png

Flume的一个英文意思是:滑水道,我们在水上乐园可以看到的水道就可以叫flume。我们可以发挥我们的想象力,当我们有一堆木头放在山上的伐木场(source  源),现在要把这些木头从山上运到山下,但是木头太多太大,我们不可能一根一根的将木头从山上搬到山下,这样不仅太耗费体力,效率也低。刚好我们山上有一条小溪(channel  通道),我们可以把木头放到溪水里,让木头随着水流漂到山下,然后我们在山下我们的目的地,挖一个水潭(sink 下沉点)把木头都引到这个水潭里,然后我们要取木头就从水潭里面直接拉上岸。这就是我们的flume采集数据思路的一个简单描述。通过这个故事我们应该明白了为什么Flume是一个流式处理框架了吧。那么我就来进一步了解一下Flume。

640?wx_fmt=png

Flume是设计用于将大容量基于事件的数据存储到Hadoop的工具。一个典型的例子就是使用Flume来收集一系列Web服务器的日志文件,将这些分散的日志事件移动到HDFS中重新汇总用来分析处理。通常的目的地(或Flume水槽)是HDFS。但是,Flume是灵活的足以写入其他系统,如HBase、Solr、kafak。

640?wx_fmt=png

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源将数据转发出去。

640?wx_fmt=png

我们来总结一下:

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、自定义源等。不同的源的特点不同,应用场景也相应不同。需要我们结合自己的业务来选取相应的源类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值