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可以实现负载均衡和错误恢复的功能。