Hadoop生态Flume(一)介绍

一、概述

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

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

Apache Flume是Apache Software Foundation的顶级项目。

(1)起源

Flume是Cloudera提供的一个高可用的、高可靠的、分布式的海量日志收集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写道各种数据接收方(可定制)的能力。

Flume初始的发行版本目前被统称为“Flume OG(original generation)”,属于 Cloudera。但随着FLume功能的扩展,“Flume OG”代码工程臃肿、核心组件设计不合理、核心配置不标准等缺点暴露出来,尤其是在“Flume OG”的最后一个发行版本0.94.0中,日志传输不稳定的现象尤为严重,为了解决这些问题,2011年10月22号,Cloudera完成了“Flume-728”,对Flume进行了里程碑式的改动:重构核心组件、核心配置以及代码架构,重构后的版本统称为“Flume NG(next generation)”;改动的另一原因是将 Flume 纳入Apache旗下,“Cloudera Flume”改名为“Apache Flume”。
(2)重要版本
Flume 0.9X版本的统称Flume-og,
Flume 1.X版本的统称Flume-ng。
由于Flume-ng经过重大重构,与Flume-og有很大不同。

二、架构

Flume事件定义为具有字节有效负载和可选字符串属性集的数据流单位。Flume代理是一个(JVM)进程,承载了组件,事件通过这些组件从外部源流到下一个目标(hop)。

Flume源使用由外部源(如Web服务器)传递给它的事件。外部源以目标Flume源可以识别的格式将事件发送到Flume。例如,Avro Flume源可用于从流中从Avro接收器发送事件的流中的Avro客户端或其他Flume代理接收Avro事件。可以使用Thrift Flume源定义类似的流程,以接收来自Thrift Sink或Flume Thrift Rpc客户端或以Flume Thrift协议生成的任何语言编写的Thrift客户端的事件.Flume源接收到事件后,会将其存储到一个或多个渠道。该通道是一个被动存储,用于保留事件,直到被Flume接收器消耗为止。文件通道就是一个示例–由本地文件系统支持。接收器从通道中删除事件,并将其放入HDFS之类的外部存储库(通过Flume HDFS接收器),或将其转发到流中下一个Flume代理(下一跳)的Flume源。给定代理中的源和接收器与通道中上演的事件异步运行。

(1)数据流模型

扫描二维码关注公众号,回复: 8790311 查看本文章

(2)复合流模型

Flume允许用户建立多跳流程,其中事件在到达最终目的地之前会通过多个代理传播。它还允许扇入和扇出流,上下文路由和备份路由(故障转移)。

事件在每个代理上的一个通道中上演。然后将事件传递到流中的下一个代理或终端存储库(如HDFS)。仅将事件存储在下一个代理程序的通道或终端存储库中之后,才将其从通道中删除。这就是Flume中的单跳消息传递语义如何提供流的端到端可靠性的方式。

Flume使用事务性方法来确保事件的可靠传递。源和接收器分别在事务中封装在通道提供的事务中放置或提供的事件的存储/检索。这确保了事件集在流中从点到点可靠地传递。在多跳流的情况下,来自上一跳的接收器和来自下一跳的源都运行其事务,以确保将数据安全地存储在下一跳的通道中。

事件在通道中上演,该通道管理从故障中恢复。Flume支持持久的文件通道,该通道由本地文件系统支持。还有一个内存通道可以将事件简单地存储在内存队列中,这样速度更快,但是当代理进程死亡时,仍保留在内存通道中的任何事件都无法恢复。

三、核心组件

Flume Agent配置存储在本地配置文件中。这是遵循Java属性文件格式的文本文件。可以在同一配置文件中指定一个或多个Agent的配置。配置文件包括代理中每个Source,Sink和Channel的属性,以及它们如何连接在一起以形成数据流。

流中的每个组件(Source,Sink或Channel)都有一个名称,类型和特定于该类型和实例化的属性集。例如,一个Avro源需要一个主机名(或IP地址)和一个端口号来接收数据。内存Channel可以具有最大队列大小(“容量”),并且HDFS接收器需要知道文件系统URI,创建文件的路径,文件旋转的频率(“ hdfs.rollInterval”)等。组件的所有此类属性需要在托管Flume Agent的属性文件中进行设置。

Agent需要知道要加载哪些单个组件以及如何连接它们才能构成流程。通过列出代理中每个Source,Sink和Channel的名称,然后为每个Sink和Source指定连接Channel来完成此操作。例如,Agent通过称为FileChannel的文件通道将事件从名为avroWeb的Avro Source流到HDFS Sink hdfs-cluster1。配置文件将包含这些组件的名称和文件通道,作为avroWeb源和hdfs-cluster1 Sink的共享通道。

  • Agent:使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。
    Client:生产数据,运行在一个独立的线程。
  • Source:从Client专门用来收集数据,传递给Channel,可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定义。
  • Sink:从Channel收集数据,运行在一个独立线程,sink组件是用于把数据发送到目的地的组件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、Hbase、solr、自定义。
  • Channel:连接 sources 和 sinks ,这个有点像一个队列,source组件把数据收集来以后,临时存放在channel中,即channel组件在agent中是专门用来存放临时数据的——对采集到的数据进行简单的缓存,可以存放在memory、jdbc、file等等。
  • Events:可以是日志记录、 avro 对象等。


 

发布了354 篇原创文章 · 获赞 522 · 访问量 128万+

猜你喜欢

转载自blog.csdn.net/moakun/article/details/103097049