Flume入门 | 基本概念及架构说明

2019-03-12 17:23:37 浏览数 (1)

每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。

放弃不难,但坚持很酷~

Flume版本:1.5.2 前言

今天,给大家分享一下Flume的基础知识。本篇文章主要是对Flume的基本概念及架构进行一些说明。

一、简介

Apache Flume是一个分布式,可靠且可用的系统,可以有效地从许多不同的源收集,聚合和移动大量日志数据到集中式数据存储。

Apache Flume的使用不仅限于日志数据聚合。由于数据源是可定制的,因此Flume可用于传输大量事件数据,包括但不限于网络流量数据,社交媒体生成的数据,电子邮件消息以及几乎任何可能的数据源。

二、优势

  • Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS,Hive,HBase。
  • 当收集数据的速度超过将写入数据的时候,也就是当收集信息遇到峰值时,这时候收集的信息非常大,甚至超过了系统的写入数据能力,这时候,Flume会在数据生产者和数据收容器间做出调整,保证其能够在两者之间提供一共平稳的数据。
  • Flume的Channel是基于事务,保证了数据在传送和接收时的一致性
  • Flume是可靠的,容错性高的,可升级的,易管理的,并且可定制的。
  • 支持各种接入资源数据的类型以及接出数据类型。
  • 支持多路径流量,多管道接入流量,多管道接出流量,上下文路由等。
  • 可以被水平扩展。

三、组成架构

Flume组成架构如下图所示:

Flume组成架构

Web Server为例,当作数据源,Source接收数据源,流向Channel作为临时缓冲,Sink不断地抽取Channel里面的数据,并将数据发送到存储(比如:HDFS文件系统)、索引系统,或者被发送到另一个Flume Agent。

Flume组成架构详解如下图所示:

架构详解--来源于自尚学堂教育

该图分为三个部分:数据输入端(例如Web Server)、Flume流式处理(Agent)、数据输出端(例如HDFS、Kafka、File等)。

接下来说一说Flume相关的基本概念。

Agent

Agent是一个JVM进程,它以事件的形式将数据从源头送至目的地。Agent主要有三个部分组成:Source、Channel、Sink。

Event

Flume数据传输的基本单元,带有一个可选的消息头。如果是文本文件,通常是一行记录。Event从Source,流向Channel,再到Sink,Sink将数据写入目的地。

Source

Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据,包括Avro Source、Exce Source、Spooling Directory Source、NetCat Source、Syslog Sources、Thrift Source、Sequence Generator Source、HTTP Source、Kafka Source等。

Channel

Channel主要提供一个队列的功能,是位于Source和Sink之间的缓冲区。Source到Channel是完全事务性的,一旦事务中的所有事件全部传递到Channel且提交成功,那么Source就将其标记为完成。如果因为某种原因事件传递失败,那么事务将会回滚。

Flume对于Channel,则提供了Memory Channel、File Channel、JDBC Channel、Kafka Channel以及自定义Channel等。

  • Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情境下适用。如果需要关心数据丢失,那么就不应该使用Memory Channel。因为程序死亡或机器宕机都会导致数据丢失。
  • File Channel将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。

Sink

Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。

Channel到Sink是完全事务性的。在从Channel批量删除数据之前,每个Sink用Channel启动一个事务,批量事件一旦成功写出到存储系统或下一个Flume Agent,Sink就利用Channel提交事务。事务一旦被提交,该Channel从自己的内部缓冲区删除事件。

Flume Sink包括HDFS Sink、Logger Sink、Avro Sink、Thrift Sink、File Roll Sink、Null Sink、Hive Sink、HBase Sink、Elasticsearch Sink、Kafka Sink以及自定义Sink。

Flume支持事务,分为Put事务与Take事务

Put事务:

从Source到Channel的事件传输过程叫Put事务。通过doPut将批数据先写入临时缓冲区putList;再通过doCommit将批数据提交给Channel,会检查channel内存队列是否足够合并,如果Channel内存队列空间不足,则回滚数据。

Take事务:

从Channel拉取事件数据到Sink的过程叫Take事务。通过doTake先将数据取到临时缓冲区takeList;再通过doCommit将事件数据发送到Sink。如果数据全部发送数据成功,则清除临时缓冲区takeList。如果数据发送过程中出现异常,rollback将临时缓冲区takeList中的数据归还给channel内存序列。

四、拓扑结构

本章节简要介绍一下Flume的拓扑结构,其中有多种Flume Agent的组合方式。

1. 多Agent连接

为了连接多个agent,前一个Agent的Sink和当前Agent的Source需要是avro类型,Sink指向Source的主机名(或IP地址)和端口。如下图所示:

多Agent连接

2. 单Source,多Channel、Sink

单Source,多Channel、Sink

单个Source,可以并行配置多个Channel,Sink与Channel一一对应,通过不同的Sink将数据发送到不同的地方,比如HDFS或JMS,甚至也可以发送到下一个Agent。

Source接收到的数据可以复制为三份,分别发送到Channel1、2、3,只不过后面的Sink不同。这种场景比如:读取一个日志文件,一份要交给Hadoop离线处理,一份相同的交给Spark实时处理。

也可以选择性地控制Source端数据,这样叫做拦截器。比如日志数据,类型有启动日志、报错日志、点击流日志。拦截器可通过判断数据的header,来分析数据的类型,然后分类型的发往不同的地方(Channel1、2、3)。

3. 负载均衡模式

负载均衡模式

上图使用多个Sink进行负载均衡。一个Agent有三个Sink,三个Sink分别指向不同的Agent。这种结构在大数据领域中经常使用,适用于大容量的数据。将很大的数据拆成多个Agent来处理。当然这两种Agent的配置不太一样。第一层Agent需要的内存(比如10G)要远大于第二层Agent的内存(比如2G)。

将大规模数据进行负载均衡,传输到HDFS进行存储。

4. 聚合模式

聚合模式

这种模式的设计针对的是集群。比如,正常的大数据服务不可能是单个服务器,几乎都是集群。那么每个集群都会产生日志文件,为了将每个日志文件进行收集,就采用这种聚合模式。

这可以通过使用avro sink配置多个第一层agents在Flume中实现,所有这些agnet都指向单个agent的avro source(同样,您可以在这种情况下使用thrift sources/sinks/clients)。第二层agent上的resource将接收的事件合并到单个channel中,该channel由sink消费到其最终目的地。

五、总结

本文主要对Flume的组成架构进行描述,以及罗列了Flume常用的拓扑结构。更多资料请参考官方文档: http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html


0 人点赞