Flume简述


发布于 2020-12-21 / 25 阅读 / 0 评论 /
Flume是Cloudera提供的一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。

1.Flume vs Flink

Flume基于流式架构,灵活简单。

Apache Flink是一个数据流处理平台,比Flume更具通用性和功能丰富(例如,支持事件时间,高级窗口,高级API,容错和有状态应用程序......)。我们可以使用Flink实施和执行许多不同类型的流处理应用程序,包括流式分析和CEP。

Flink采用滚动文件接收器将数据流写入HDFS文件,并允许通过用户定义的函数实现各种自定义行为。但是,它不是一个专门的数据摄入HDFS的工具。不要指望这个用例有很多内置的功能。 Flink提供非常好的吞吐量和低延迟。

2.Flume架构

官方架构如下图所示:

Agent是一个JVM进程,它以事件的形式将数据从源端送至目的端。Agent主要由三个部分组成:source、channel、sink。

2.1.Source

Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据,包括:avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy等。

2.2.Sink

Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。Sink组件的目的端包括:hdfs、logger、avro、thrift、ipc、file、hbase、solr等。

2.3.Channel

Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不通的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。Flume自带以下三种Channel:

(1)Memory Channel:内存中的队列。不需关系数据丢失的情景下适用。如果需要关心数据丢失,那么MemoryChannel就不应该使用,因为程序挂掉、机器宕机或重启都会导致数据丢失。

(2)File Channel:将所有事件写到磁盘。因此在程序关闭或机器宕机情况下不会丢失数据。

(3)Kafka Channel:kafka作为队列。

2.4.Event

Event表示传输单元,是Flume数据传输的基本单元,以Event的形式将数据从源端送至目的端。Event由Header和Body两部分组成,Header用来存放该event的一些属性,为K-V结构,Body用来存放该条数据,形式为字节数组。

3.Flume设计

从以下几点来解析Flume的设计与实现。

3.1.Flume事务

Flume中的put和take事务流程如下图所示:

Put在Source端,而Take在Sink端。

3.1.1.Put事务流程

Put事务流程由三部分组成:

(1)doPut:将批数据先写入临时缓冲区putList。

(2)doCommit:检查channel内存队列是否足够合并。

(3)doRollback:channel内存队列空间不足,回滚数据,即把数据重新放回putList。

问题:如果putList满了,该怎么办?进程直接挂掉?

3.1.2.Take事务流程

Take事务流程由三部分组成:

(1)doTake:将数据取到临时缓冲区takeList,并将数据发送到HDFS。

(2)doCommit:如果数据全部发送成功,则清除临时缓冲区takeList。

(3)doRollback:数据发送过程中如果出现异常,rollback将临时缓冲区takeList中的数据归还channel内存队列。

3.2.Flume Agent内部原理

flume数据传输流程如下图所示:

其中,Channel Selector的作用就是选出Event将要被发往哪个Channel。有两种类型:

(1)Replicating Channel Selector(复制,默认类型):Replication会将source过来的events发往所有channel。

(2)Multiplexing Channel Selector(多路复用):Multiplexing可以配置events发往哪些Channel。

Sink Processor有三种类型:

(1)Default Sink Processor:对应单个Sink。

(2)Load Balancing Processor:对应Sink Group,可实现负载均衡。

(3)Failover Sink Processor:对应Sink Group,可实现故障转移。

3.3.Flume拓扑结构

Flume有以下四种基本的拓扑结构。

3.3.1.串联

例如下图所示:

这种模式是将多个 flume 顺序连接起来了,从最初的 source 开始到最终 sink 传送的目的存储系统。此模式不建议桥接过多的 flume 数量,flume 数量过多不仅会影响传输速率,而且一旦传输过程中某个节点 flume 宕机,会影响整个传输系统。

3.3.2.聚合

例如下图所示:

这种模式也是我们最常见的,非常实用。日常web应用通常分布在上百个服务器,大者甚至上千个、上万个服务器。产生的日志,处理起来也非常麻烦。用flume的这种组合方式能很好地解决这一问题。每台服务器部署一个flume采集日志,传送到一个集中收集日志的flume,再由此flume上传到hdfs、hive、hbase等,进行日志分析。

3.3.3.复制和多路复用

这种模式特点是:单个source,多个channel和sink。例如下图所示:

Flume支持将事件流向一个或者多个目的地。这种模式将相同数据复制到多个channel中,或者将不通数据分发到不通的channel中,sink可以选择传送到不同的目的地。

3.3.4.负载均衡和故障转移

例如下图所示:

flume支持使用将多个sink逻辑上分到一个sink组,sink组配合不同的Sink Processor可以实现负载均衡和错误恢复的功能。