文章目录
- 1.定义
- 组成架构
- 组件
- Agent
- Source:接受各种数据
- exec、tailDir、spoolDir监控文件的区别
- Channel:缓冲区
- channel selector
- Sink
- Event
- innode
- 内部原理
- 自定义拦截器
- 实际应用
- 拓扑结构
- 自定义
1.定义
Flume(水道 )是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。
最主要的作用是实时读取服务器本地数据到HDFS
组成架构
组件
Agent
Agent是一个JVM进程,它以事件的形式将数据从源头送至目的,是Flume数据传输的基本单元。
Agent主要有3个部分组成,Source、Channel、Sink。
Source:接受各种数据
Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。
可以轻量处理数据,如拦截。
用的最多的就是日志文件
exec、tailDir、spoolDir监控文件的区别
- exec是在执行 tailDir命令,监控单个文件,但不能保证数据不丢失;
- Spooldir Source 能够保证数据不丢失,且能够实现断点续传,但延迟较高,不能实时监控;
- Taildir Source 既能够实现断点续传,又可以保证数据不丢失,还能够进行实时监控。
Channel:缓冲区
Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。
Flume自带两种Channel:Memory Channel和File Channel。
- Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。
- File Channel将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。
channel selector
- replicating:复制
发送的每个channel - multiplexing:多路复用
选择发送
Sink
Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。
Sink是完全事务性的。在从Channel批量删除数据之前,每个Sink用Channel启动一个事务。批量事件一旦成功写出到存储系统或下一个Flume Agent,Sink就利用Channel提交事务。事务一旦被提交,该Channel从自己的内部缓冲区删除事件。
Sink组件目的地包括hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定义。其中hdfs和kafka最常用
Event
传输单元,Flume数据传输的基本单元,以事件的形式将数据从源头送至目的地。读取日志的时候一次读一行
Header:事件的一些属性,key-value
Body:存放该条数据,形式为字节数组
innode
Linux 中储存文件元数据的区域就叫做 inode,每个 inode 都有一个号码,操作系统 用 inode 号码来识别不同的文件,Unix/Linux 系统内部不使用文件名,而使用 inode 号码来识别文件
内部原理
sink处理器有三种
- defaultProfessor(单个sink)
- LoadBalancingProfessor(负载均衡,用的最多)
- FailOverProfessor(故障转移)
自定义拦截器
实际应用
将不同日志发送到不同文件目录下
拓扑结构
- 简单串联
将数据连接起来了,但是影响速率和有单点故障 - 多路复用
配置多个channel和sink,发送到不同目的地 - 负载均衡和故障转移
Flume 支持使用将多个 sink 逻辑上分到一个 sink 组,sink 组配合不同的 SinkProcessor 可以实现负载均衡和错误恢复的功能。
- 聚合
最符合实际应用场景,将多台服务器的日志数据采集,并汇总到hdfs、hive等进行处理
自定义
flume可自定义source、sink、interceptpr