随着Storm、Spark等实时计算框架不断应用到企业级大数据平台,对实时数据采集的技术选型要求也越来越高。因此,迫切急需一套易扩展、高容错、高可用、可恢复的高性能数据采集系统来保证实时数据的收集。Flume是一套分布式、高可用的数据收集系统,可以通过简单配置实现不同数据源的海量数据采集,无需修改Flume的任何代码,并将采集数据准确、高效地传输到不同的存储媒介。Flume属于Hadoop关键组件之一,可与Kafka、ElasticSearch、Hive、HBase等主流框架实现对接,为企业级大数据平台提供简单、高效、准确的轻量级数据采集工具。
Flume原始版本为Flume-OG,经过升级改造已经更名为Flume-NG,由Apache开源发布。Flume-NG采用分层架构设计,共包括三个层次:数据采集层(Source)、数据缓冲层(Channel)、数据处理层(Sink),如下图所示:
Agent:包含Source、Channel、Sink的Flume进程称为Agent,Flume的数据采集是通过一系列的Agent组件构成,Agent从原始数据源接收数据,传递到下一个Agent,直到到达目标存储系统。如下图所示:
Event:在构成Flume数据流水线的Agent中传递的数据称为Event,每个Event由数据头和数据体(字节数组)两部分构成。其中,数据头由一系列的key/value键值对构成,可用于数据路由。数据体由字节数组存储实际要传递的数据。Event由定制开发的客户端程序生成,然后调用Flume提供的二次开发包将Event对象发送给Agent。如下图所示:
Source:是Agent中接收Event对象的组件,Source从定制开发的客户端或上一个Agent接收Event对象数据,并将其写入一个或多个Channel,相当于Channel的生产者。为了快速、简便使用,Flume提供很多的Source实现,包括:Avro Source、Exec Source、Kafka Source、Taildir Source、Spooling Directory
Source等,详细功能请查阅Flume-NG官方介绍。当然,用户也可以根据自己的需要定制开发Source。
Channel:是Event中转临时缓冲区,存储Source收集并且没有被Sink读取的Event,相当于Flume内部的消息队列。Channel是线程安全的,并提供事务性操作。常用的Channel实现包括:Memory Channel、File Channel、Kafka Channel等,详细功能请查阅Flume-NG官方介绍。
Sink:负责从Channel中读取Event数据,并发送给下一个Agent的Source或者将Event保存至目标存储系统,相当于是Channel的消费者。常见的Sink实现包括:HDFS Sink、HBase Sink、Avro/Thrift Sink、ElasticSearch Sink、Kafka Sink等,详细功能请查阅Flume-NG官方介绍。
Flume采用事务机制保证Event传递的可靠性。Sink必须在Event被成功传递给下一个Agent后,才能把Event从Channel中删除掉。这样数据流里的Event无论是在一个Agent还是在多个Agent之间流转,都能保证可靠性。
结束语:除了Source、Channel和Sink外,Flume Agent还提供Interceptor、Channel Selector和Sink Processor等组件,具体组件实现功能将在后续文章中介绍。