大数据技术之Flume
概述
Flume定义
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构(采集日志的单位是一行),灵活简单
Flume最主要的作用就是:实时读取服务器本地磁盘的数据,将数据写入HDFS
Flume的优点
-
可以与任意存储进程集成
-
输入的数据速率大于写入目的的存储速率,flume会进行缓冲,减小hdfs的压力
-
flume中的事务基于channel,使用了两个事务模型(sender+receiver),确保消息被可靠发送。
Flume使用两个独立的事务分别负责从soucrce到channel,以及从channel到sink的事件传递。一旦事务中所有的数据全部成功提交到channel,那么source才认为该数据读取完成。同理,只有成功被sink写出去的数据,才会从channel中移除
Flume的组成架构
-
数据输入端将数据发送给source。
-
source拿到数据后将数据推送channel。
推送时,会经过Put事务Transaction。
- doPut:将批数据线写入临时缓冲区putList。
- doCommit:检查channe内存队列是否足够合并。
- doRollback:channel内存队列空间不足,回滚数据。
-
sink向channel拉取数据。
拉取时,会经过Take事务Transaction。
- doTake:先将数据取到临时缓冲区takeList。
- doCommit:如果数据全部发送成功,则清除临时缓冲区takeList。
- doRollback:数据发送过程中如果出现异常,则将takeList中的内容归还channel内存队列。
-
数据拉取完毕后将数据写入数据输出端。
source数据输入端常见类型:
- spooling directory
- exec
- syslog
- avro
- netcat
sink数据输出端常见类型:
- HDFS
- Kafka
- logger
- avro
- File
- 自定义
Agent
Agent是一个JVM进程,它以事件的形式将数据从源头送至目的
Agent主要有3个部分组成:Source、Channel、Sink。
Source
Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种形式的日志数据
Channel
Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同事处理几个Source的写入操作和几个Sink的读取操作。
Flume自带有两种Channel:Memory Channel和File Channel。
Memory Channel是基于内存缓存,在不需要关心数据丢失的情境下适合使用
File Channel是Flume的持久化Channel。系统宕机不会丢失数据。
Sink
Sink不断地轮询Channel中的事件且批量地移除它们,并将这些时间批量写入到存储或索引系统、或者被发送到另一个Flume Agent。
Event
传输单元,Flume数据传输的基本单元,以时间的形式将数据从源头送至目的地。Event由可选的header和载有数据的一个byte array构成。Header是容纳了key-value字符串对的HashMap。
Flume Agent内部原理
-
数据在进入channel之前,要进入channel处理器。
-
处理器首先将数据传给拦截器对消息进行域处理。然后归还channel处理器。
-
channel处理器将处理完毕的数据交给channel选择器来选择此消息应该进入哪个channel。选择器由两种类型:
- Replicating Channel Selector :群发(默认)
- Multiplexing Channel Selector:可以指定发往那些Channel
-
channel拿到的数据经过sink处理器来决定指定sink从指定channel中拉取数据(一个channel可以对应多个sink)
hannel Selector:可以指定发往那些Channel
4. channel拿到的数据经过sink处理器来决定指定sink从指定channel中拉取数据(一个channel可以对应多个sink)