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架构

flume写hdfs小文件太多_机器学习

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

flume写hdfs小文件太多_flume写hdfs小文件太多_02


Sink组有三种形式

(1)默认的,只接受一个配置信息,也就没有组了;
(2)负载均衡(随机,轮训,退避规则);
(3)故障转移,优先向某一个sink发送数据,如果这个挂掉了,就向备用的进行发送。

三、官方方法启动Flume

flume写hdfs小文件太多_flume写hdfs小文件太多_03

四、Flume事务

flume写hdfs小文件太多_flume_04

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的作用、架构、事务以及相关注意事项,如果有不足之处或者有错误的地方希望大家指出,我们共同进步。