国科大学习生活(期末复习资料、课程大作业解析、大厂实习经验心得等): 文章专栏(点击跳转)
大数据开发学习文档(分布式文件系统的实现,大数据生态圈学习文档等): 文章专栏(点击跳转)
【数据采集工具】Flume从入门到面试学习总结
1. Flume概述
1.1 什么是Flume?
Flume 是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。
- 分布式:Flume可以运行在多个节点上,支持数据在节点间流动。
- 可扩展性:Flume可以轻松扩展以处理从几百KB到几PB的数据。
- 可靠性:Flume提供了数据不丢失的机制,即使在节点故障的情况下也能确保数据的完整性。
- 有效性:Flume提供了多种数据源和数据接收器,可以有效地从各种数据源收集数据,并将其传输到不同的数据接收器。
- 灵活性:Flume允许用户自定义数据源和数据接收器,以适应不同的数据收集和传输需求。
1.2 Flume基础架构
Agent:一个JVM进程,它以事件的形式将数据从源头送至目的。Agent 主要有3个部分组成,Source、Channel、Sink。
-
Source:数据源,负责从外部系统收集数据,Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、taildir、sequence generator、syslog、http、legacy。
-
Channel:位于Source 和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel 是线程安全的,可以同时处理几个Source 的写入操作和几个 Sink 的读取操作。Flume 自带两种Channel:Memory Channel 和 File Channel。
- Memory Channel :内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。
- File Channel:将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。
-
Sink:数据接收器,会不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。
Event:数据传输单元,Flume以 Event 的形式将数据从源头送至目的地。 Event 由Header 和Body 两部分组成,Header用来存放该event的一些属性,为K-V结构, Body 用来存放该条数据,形式为字节数组。
2. Flume进阶内容
2.1 Flume事务
在 Apache Flume 中,事务是一种确保数据在不同组件之间可靠传递的机制。
由上图可以看出Flume Agent中Sources和Sinks分别在事务中封装了事件的存储/检索,这些事务是由Channel提供的。这确保了事件集合能够可靠地从一个点传递到另一个点。
- Source端Put事务流程
doPut:将批数据先写入临时缓冲区putList
doCommit:检查Channel内存队列是否足够合并
doRollback:Channel内存队列空间不足,回滚数据(此处可能会丢数据) - Sink端Take事务流程
doTake:将数据取到临时缓冲区takeList,并将数据发送到外部文件系统(如HDFS)或另一个Flume Agent
doCommit:如果数据全部发送成功,则清除临时缓冲区takeList
doRollback:数据发送过程中如果出现异常,rollback将临时缓冲区takeList(双端队列)中的数据归还给Channel内存队列(双端队列)(此处可能会导致重复数据产生)
2.2 Flume Agent 内部原理
数据在Flume流动示意图:
总体流程:
- 外部数据被Source监听获取后,会发往ChannelProcessor处理事件(Event);
- 此时数据并不会被直接发往Channel,而是先由Interceptors拦截器链对数据做一些预处理,然后再发往ChannelSelector选出事件(Event)将要被发往哪个Channel;
- ChannelSelector会返回事件Channel列表给ChannelProcessor,然后才根据事件Channel列表将事件发往相应的Channel
- 数据到达Channel后并不是直接发往下游Sink的,而是由SinkProcessor处理后决定发往哪个Sink。
重要组件:
- ChannelSelector
ChannelSelector 的作用就是选出Event将要被发往哪个Channel。其共有两种类型,分别是Replicating(复制)和Multiplexing(多路复用)。- Replicating Selector 会将同一个Event发往所有的Channel(类似与广播)
- Multiplexing 会根据相应的原则,将不同的Event发往不同的Channel
- SinkProcessor
SinkProcessor 共 有 三 种 类 型 , 分 别 是 DefaultSinkProcessor (对应的是单个的 Sink)、
LoadBalancingSinkProcessor 和 FailoverSinkProcessor 对应的是Sink Group,LoadBalancingSinkProcessor 可以实现负载均衡的功能,FailoverSinkProcessor可以实现错误恢复的功能(通过配置Sink优先级实现)。
2.3 Flume 拓扑结构
2.3.1 简单串联
这种模式是将多个flume顺序连接起来了,从最初的source开始到最终sink 传送到目的存储系统。此模式不建议桥接过多的flume数量,因为flume数量过多不仅会影响传输速率,而且一旦传输过程中某个节点flume宕机,会影响整个传输系统。
2.3.2 复制和多路复用
Flume 支持将事件流向一个或者多个目的地。这种模式可以将相同数据**复制(广播)**到多个 channel 中(Channel Selector使用Replicating),或者将不同数据分发到不同的 channel 中(Channel Selector使用Multiplexing 并配合自定义Interceptor),Sink 可以选择传送到不同的目的地。
具体实现见下文Flume 企业开发案例
2.3.3 负载均衡和故障转移
Flume支持使用将多个Sink逻辑上分到一个Sink组,Sink组配合不同的SinkProcessor 可以实现负载均衡(SinkProcessor使用LoadBalancingSinkProcessor)和错误恢复(SinkProcessor使用FailoverSinkProcessor并在配置文件中设置各个Sink的优先级)的功能。
2.3.4 聚合
这种模式是我们最常见的,也非常实用,日常web应用通常分布在上百个服务器,大者甚至上千个、上万个服务器。产生的日志,处理起来也非常麻烦。用f