Flume
- 前言
- 一、Flume作用
- 二、Flume架构
- 2.1 Agent
- 2.1.1 Source
- 2.1.2 Channel
- 2.1.3 Sink
- 三、官方方法启动Flume
- 四、Flume事务
- 4.1 put事务
- 4.2 take 事务
- 五、单数据源发送到不同目的地
- 六、Flume采集数据会丢失吗?
- 总结
前言
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。本文主要介绍Flume的相关知识
一、Flume作用
实时读取服务器本地磁盘的数据,将数据写入到HDFS或作为下一级Flume的输入;
二、Flume架构
2.1 Agent
事件的形式将数据从源头送至目的,是Flume数据传输的基本单元。Agent主要有3个部分组成,Source、Channel、Sink。
2.1.1 Source
负责接收数据
exectail source: 当服务器宕机后,数据传输便会重新开始;
TailDir source: 支持文件的端点续传;
2.1.2 Channel
位于Source和Sink之间的缓冲区;
Memory Channel:是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。在程序关闭或者机器宕机都会丢失数据 -> 性能高,不可靠;
File Channel: 将所有事件写到磁盘 -> 性能低,可靠
2.1.3 Sink
轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。
注意:source可以绑定多个channel,channel也可以绑定多个sink,但是sink只能绑定一个channel;
Sink组有三种形式:
(1)默认的,只接受一个配置信息,也就没有组了;
(2)负载均衡(随机,轮训,退避规则);
(3)故障转移,优先向某一个sink发送数据,如果这个挂掉了,就向备用的进行发送。
三、官方方法启动Flume
四、Flume事务
4.1 put事务
通过doput将source中的数据取出放入到缓冲区putlist中,docommit检查channel的内存队列是否足够合并,如果不可以合并,数据回滚到putlist中;
4.2 take 事务
通过dotake将channel中的数据取出放入到缓冲区takelist中,docommit检查数据是否发送成功,发送成功则清除缓冲区takelist,否则,数据回滚到channel中;
五、单数据源发送到不同目的地
必须使用多个channel,因为如果使用一个channel,那么后面接着多个sink就相当于是一个sink组,但是sink组的三种方式,默认的,就相当于一个sink,负载均衡是每个人一条,故障转移是优先给某一个发送,其他的没有,都不能实现将同一个数据源的数据发送到多个目的地。
六、Flume采集数据会丢失吗?
丢数据的情况是Channel采用MemoryChannel,agent宕机导致数据丢失或者Channel存储已满,导致Source不再写入,未写入的数据丢失;
此外,Flume可能会造成数据的重复,例如数据已经由Sink成功发出,但是没有收到响应,Sink会在此发送数据,此时可能导致数据的重复。
总结
本文主要介绍Flume的作用、架构、事务以及相关注意事项,如果有不足之处或者有错误的地方希望大家指出,我们共同进步。