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