大数据技术之Flume

概述

Flume定义

​ Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构(采集日志的单位是一行),灵活简单
大数据技术之Flume

Flume最主要的作用就是:实时读取服务器本地磁盘的数据,将数据写入HDFS

Flume的优点

  1. 可以与任意存储进程集成

  2. 输入的数据速率大于写入目的的存储速率,flume会进行缓冲,减小hdfs的压力

  3. flume中的事务基于channel,使用了两个事务模型(sender+receiver),确保消息被可靠发送。

    Flume使用两个独立的事务分别负责从soucrce到channel,以及从channel到sink的事件传递。一旦事务中所有的数据全部成功提交到channel,那么source才认为该数据读取完成。同理,只有成功被sink写出去的数据,才会从channel中移除

Flume的组成架构

大数据技术之Flume
大数据技术之Flume

  1. 数据输入端将数据发送给source。

  2. source拿到数据后将数据推送channel。

    推送时,会经过Put事务Transaction。

    • doPut:将批数据线写入临时缓冲区putList。
    • doCommit:检查channe内存队列是否足够合并。
    • doRollback:channel内存队列空间不足,回滚数据。
  3. sink向channel拉取数据。

    拉取时,会经过Take事务Transaction。

    • doTake:先将数据取到临时缓冲区takeList。
    • doCommit:如果数据全部发送成功,则清除临时缓冲区takeList。
    • doRollback:数据发送过程中如果出现异常,则将takeList中的内容归还channel内存队列。
  4. 数据拉取完毕后将数据写入数据输出端。

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内部原理

  1. 数据在进入channel之前,要进入channel处理器。

  2. 处理器首先将数据传给拦截器对消息进行域处理。然后归还channel处理器。

  3. channel处理器将处理完毕的数据交给channel选择器来选择此消息应该进入哪个channel。选择器由两种类型:

    • Replicating Channel Selector :群发(默认)
    • Multiplexing Channel Selector:可以指定发往那些Channel
  4. channel拿到的数据经过sink处理器来决定指定sink从指定channel中拉取数据(一个channel可以对应多个sink)

hannel Selector:可以指定发往那些Channel
4. channel拿到的数据经过sink处理器来决定指定sink从指定channel中拉取数据(一个channel可以对应多个sink)

相关文章: