1.简介
apache flume 是一种分布式的、可靠的、可用的系统,主要用于高效地收集、聚合和移动大量来自不同来源的日志数据到一个集中的数据存储区。
flume的使用不仅限于日志的数据聚合。由于数据源是可定制的,flume可以用于传输大量的事件数据,包括但不限于网络流量数据、数字媒体生志的数据。电子邮件消息和几乎任何可能的数据源。
2.flume事件(event)
flume的核心是把数据从数据源(source)收集过来,在将收集到的数据送到指定的目的地(sink)。这了保证数据传输过程的成功率,在送到目的地(sink)之前,会先缓存数据(channel),待数据真正到达目的地(sink)后,flume才会删除缓存的数据。
在整个数据传输的过程中,流动的是event,即事务保证是在event级别,event是flume传输数据的基本单元,如果是文本文件,通常是一条记录,event也是事务的基本单位。event从source, 流向channel,再到sink,其本身是一个字节数组,并可携带头信息(headers)。event代表着一个数据的最小完整单元,从外部数据源来,向外部目的地去。
为了方便大家理解,给出一张event的数据流向图:
3.flume的基本组成架构
flume之所这么神奇,是源于它自身的一个设计,这个设计就是agent,agent本身是一个java进程,运行在日志收集节点—所谓日志收集节点就是服务器节点。
agent里面包含3个核心的组件:source—->channel—–>sink,类似生产者、仓库、消费者的架构。
- source:source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定义。
- channel:source组件把数据收集来以后,临时存放在channel中,即channel组件在agent中是专门用来存放临时数据的——对采集到的数据进行简单的缓存,可以存放在memory、jdbc、file等等。
- sink:sink组件是用于把数据发送到目的地的组件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定义。
4.flume的运行机制
flume的核心就是一个agent,这个agent对外有两个进行交互的地方,一个是接收数据的输入(Source),一个是数据的输出(sink),Sink负责将数据发送到外部指定的目的地。其运行机制如下:source接收到数据后,将数据发送给channel, channel作为一个数据缓冲区会临时存放这些数据,随后sink会将channel中的数据发送到指定的地方。(注:只有在sink将channel中的数据成功发出去以后,channel才会将临时数据进行删除,这种机制保证了数据传输的可靠性与安全性。)
5.flume的广义用法
flume之所以这么神奇其原因在于flume可以支持多级flume的agent,即flume可以定义多路或者复用的拓仆架构,例如sink可以将数据写到下一个agent的source中,这样的话就可以连成串了,可以整体处理了。flume支持扇入(fan-in)、扇出(fan-out)。所谓扇入就是source可以接收多个输入,所谓扇出就是sink可以将数据输出至多个目的地中。
有关flume更加详细的用法,后文会逐步通过实例展开。