1.1 定义
Flume是分布式的日志收集系统,它将各个服务器中的数据收集起来并送到指定的地方,比如送到HDFS、Kafk等
Flume的核心是把数据从数据源(source)收集过来,再将收集到的数据送到指定的目的地(sink)。为了保证输送的过程一定成功,在送到目的地(sink)之前,会先缓存数据(channel),待数据真正到达目的地(sink)后,flume再删除己缓存的数据。
1.2 Flume特性
(1)Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。
(2)Flume可以采集文件,socket数据包等各种形式源数据,又可以将采集到的数据输出到HDFS、hbase、hive、kafka等众多外部存储系统中
(3)一般的采集需求,通过对flume的简单配置即可实现
(4)Flume针对特殊场景也具备良好的自定义扩展能力,因此,flume可以适用于大部分的日常数据采集场景
(6)Flume基于流式架构,灵活简单。
(7)Flume可以用于传输大量事件数据,包括但不限于网络流量数据、社交媒体生成的数据、电子邮件消息和几乎所有可能的数据源
1.3 Flume基础架构图:
Agent:
- Flume分布式系统中最核心的角色是agent,flume采集系统就是由一个个agent所连接起来形成,Agent是一个JVM进程,它以事件的形式将数据从源头送至目的。
- Agent主要有3个部分组成:Source、Channel、Sink。
Source:
- Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling
directory、netcat、sequence generator、syslog、http、legacy。 - Source可以监听一个或者多个网络端口,用于接收数据或者可以从本地文件系统读取数据。
- 每个Source必须至少连接一个Channel。基于一些标准,一个Source可以写入几个Channel,复制事件到所有或某些Channel。
Sink:
- Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。
- Sink组件目的地包括hdfs、logger、avro、thrift、ipc、file、HBase、solr、自定义。
- 连续轮询各自的Channel 来读取和删除事件。
- Sink将事件推送到下一阶段,或到最终目的地。
- 一旦在下一阶段或其目的地中的数据是安全的,Sink 通过事务提交通知Channel ,可以从Channel 中删除这些事件。
Channel:
- 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 读取。
- 如果多个Sink从相同的Channel 读取,它可以保证只有一个Sink将会从Channel 读取一个指定特定的事件。
Event:
传输单元,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。Event由Header和Body两部分组成,Header用来存放该event的一些属性,为K-V结构,Body用来存放该条数据,形式为字节数组。
注意:一个flume的agent,可以有多个source,channel,sink
为什么用flume而不用hdfs的put
- 1.同一时刻只能传输一个文件
- 2.put处理的是静态文件