数据采集工具flume


一、flume概述

1.1flume是什么

Flume由Cloudera公司开发,是一个分布式、高可靠、高可用的海量日志采集、聚合、传输的系统。Flume是实时采集日志的数据采集引擎。
特点:
分布式:flume分布式集群部署,扩展性好
可靠性好: 当节点出现故障时,日志能够被传送到其他节点上而不会丢失易用性:flume配置使用较繁琐,对使用人员专业技术要求高
实时采集:flume采集流模式进行数据实时采集

1.2flume体系结构

在这里插入图片描述
Agent本质上是一个 JVM 进程,该JVM进程控制Event数据流从外部日志生产者那里传输到目的地(或者是下一个Agent)。
Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据,包括avro、exec、spooldir、netcat等
Channel是位于Source和Sink之间的缓冲区。Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理多个Source的写入操作及多个Sink的读取操作。
Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。
Event是Flume定义的一个数据流传输的最小单位。
1.3flume拓扑结构
串行模式
将多个flume给顺序连接起来,从最初的source开始到最终sink传送的目的存储系统。

在这里插入图片描述
复制模式(单Souce多Channel、Sink模式)
将事件流向一个或者多个目的地。这种模式将数据源复制到多个channel中,每个channel都有相同的数据,sink可以选择传送的不同的目的地。
在这里插入图片描述
负载均衡模式(单Source、Channel多Sink)
将多个sink逻辑上分到一个sink组,flume将数据发送到不同的sink,主要解决负载均衡和故障转移问题。
在这里插入图片描述
聚合模式
这种模式最常见的,也非常实用,日常web应用通常分布在上百个服务器,大者甚至上千个、上万个服务器。产生的日志,处理起来也非常麻烦。用这种组合方式能很好的解决这一问题,每台服务器部署一个flume采集日志,传送到一个集中收集日志的flume,再由此flume上传到hdfs、hive、hbase、消息队列中。在这里插入图片描述
1.4flume内部原理
在这里插入图片描述
1.source接收事件,交给其Channel处理器处理事件。
2. 处理器通过拦截器Interceptor,对事件一些处理,比如压缩解码,正则拦截,时间戳拦截,分类等。
3. 经过拦截器处理过的事件再传给Channel选择器,将事件写入相应的Channel。Channel Selector有两种:Replicating Channel Selector(默认),会将source过来的Event发往所有Channel(比较常用的场景是,用多个Channel实现冗余副本,保证可用性)Multiplexing Channel Selector,根据配置分发event。此selector会根据event中某个header对应的value来将event发往不同的channel。
4. 最后由Sink处理器处理各个Channel的事件。

二.拦截器

2.1时间添加戳拦截器

这个拦截器会向每个event的header中添加一个时间戳属性进去,key默认是“timestamp ”(也可以通过下面表格中的header来自定义),value就是当前的毫秒值(其实就是用System.currentTimeMillis()方法得到的)

2.2Host添加拦截器

这个拦截器会把当前Agent的 hostname 或者 IP 地址写入到Event的header中,key默认是“host”(也可以通过配置自定义key),value可以选择使用hostname或者IP地址。

2.3正则表达式过滤拦截器

这个拦截器会把Event的body当做字符串来处理,并用配置的正则表达式来匹配。可以配置指定被匹配到的Event丢弃还是没被匹配到的Event丢弃。

三.选择器

source可以向多个channel同时写数据,所以也就产生了以何种方式向多个channel写的问题:
replication(复制,缺省) :数据完整地发送到每一个channel;
multiplexing(多路复用):通过配置来按照一定的规则进行分发;
自定义选择器:自定义选择器就是开发一个org.apache.flume.ChannelSelector接口的实现类。实现类以及依赖的jar包在启动时候都必须放入Flume的classpath。

四.事务机制

事务一个典型的特征就是将一批操作做成原子性的,要么都成功,要么都失败。在Flume中一共有两个事务:
Put事务:在Source到Channel之间
Take事务:Channel到Sink之间
从 Source 到 Channel 过程中,数据在 Flume 中会被封装成 Event 对象,也就是一批 Event ,把这批 Event 放到一个事务中,把这个事务也就是这批event一次性的放入Channel 中。同理,Take事务的时候,也是把这一批event组成的事务统一拿出来到sink放到HDFS上。

4.1Flume中的 Put 事务

事务开始的时候会调用一个doPut方法,doPut方法将一批数据放在putList中;
putList在向 Channel 发送数据之前先检查 Channel 的容量能否放得下,如果放不下一个都不放,只能doRollback;
数据批的大小取决于配置参数batchsize的值;
putList的大小取决于配置 Channel 的参数transactioncapacity的大小,该参数大小就体现在putList上;(Channel的另一个参数capacity指的是 Channel 的容量);
数据顺利的放到putList之后,接下来可以调用doCommit方法,把putList中所有的 Event 放到 Channel 中,成功放完之后就清空putList;
在doCommit提交之后,事务在向 Channel 存放数据的过程中,事务容易出问题。如 Sink取数据慢,而 Source 放数据速度快,容易造成 Channel 中数据的积压,如果 putList 中的数据放不进去,会如何呢?此时会调用 doRollback 方法,doRollback方法会进行两项操作:
将putList清空;抛出 ChannelException异常。source会捕捉到doRollback抛出的异常,然后source就将刚才的一批数据重新采集,然后重新开始一个新的事务,这就是事务的回滚。

4.2Flume中的 Take 事务

Take事务同样也有takeList,HDFS sink配置有一个 batch size,这个参数决定 Sink从 Channel 取数据的时候一次取多少个,所以该 batch size 得小于 takeList 的大小,而takeList的大小取决于transactioncapacity的大小,同样是channel 中的参数。
Take事务流程:事务开始后:doTake方法会将channel中的event剪切到takeList中。如果后面接的是HDFSSink的话,在把Channel中的event剪切到takeList中的同时也往写入HDFS的IO缓冲流中放一份event(数据写入HDFS是先写入IO缓冲流然后flush到HDFS);当takeList中存放了batch size 数量的event之后,就会调用doCommit方法,doCommit方法会做两个操作:针对HDFS Sink,手动调用IO流的flush方法,将IO流缓冲区的数据写入到HDFS磁盘中;2、清空takeList中的数据flush到HDFS的时候组容易出问题。flush到HDFS的时候,可能由于网络原因超时导致数据传输失败,这个时候调用doRollback方法来进行回滚,回滚的时候由于takeList 中还有备份数据,所以将takeList中的数据原封不动地还给channel,这时候就完成了事务的回滚。但是,如果flush到HDFS的时候,数据flush了一半之后出问题了,这意味着已经有一半的数据已经发送到HDFS上面了,现在出了问题,同样需要调用doRollback方法来进行回滚,回滚并没有“一半”之说,它只会把整个takeList中的数据返回给channel,然后继续进行数据的读写。这样开启下一个事务的时候容易造成数据重复的问题。Flume在数据进行采集传输的时候,有可能会造成数据的重复,但不会丢失数据。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值