什么是flume

flume是apache的一个数据收集框架。定义了一个数据流的模型。下面这张图hadoop业务开发流程图可以说明Flume的重要性:

离线日志收集利器:Flume

Flume是一个分布式、可靠、和高可用的海量日志聚合的系统,支持在系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务,或者数集中机制。其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。其结构如下图所示:

1530714862781610dbb1358.jpeg

Flume架构

Flume以agent为最小的独立运行单位。一个agent就是一个JVM。单agent由Source、Sink和Channel三大组件构成,agent里面包含3个核心的组件:source—->channel—–>sink,类似生产者、仓库、消费者的架构。

15307148774561244eafcbb.jpeg

Flume的一些核心概念:

  • Agent:使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。
  • Client:生产数据,运行在一个独立的线程。
  • Source:从Client收集数据,传递给Channel。
  • Sink 从Channel收集数据,运行在一个独立线程。
  • Channel:连接 sources 和 sinks ,这个有点像一个队列。
  • Events:可以是日志记录、 avro 对象等。

Flume运行流程:

Flume的数据流由事件(Event)贯穿始终。

事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source,比如上图中的Web Server生成。当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。

你可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。flume之所以这么神奇,是源于它自身的一个设计,这个设计就是agent,agent本身是一个Java进程,运行在日志收集节点。

Flume核心组件介绍

Source:

从数据发生器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道channal,Flume提供多种数据接收的方式,比如Avro,Thrift,twitter1%等

Channel:

channal是一种短暂的存储容器,它将从source处接收到的event格式的数据缓存起来,直到它们被sinks消费掉,它在source和sink间起着一共桥梁的作用,channal是一个完整的事务,这一点保证了数据在收发的时候的一致性. 并且它可以和任意数量的source和sink链接. 支持的类型有: JDBC channel , File System channel , Memort channel等.

Sink:

sink将数据存储到集中存储器比如Hbase和HDFS,它从channals消费数据(events)并将其传递给目标地. 目标地可能是另一个sink,也可能HDFS,HBase.

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。

Flume NG (1.x.x)的主要变化:

sources和sinks 使用channels 进行链接

两个主要channel:

  • 1, in-memory channel 非持久性支持,速度快。
  • 2 , JDBC-based channel 持久性支持。

不再区分逻辑和物理node,所有物理节点统称为 “agents”,每个agents 都能运行0个或多个sources 和sinks

不再需要master节点和对zookeeper的依赖,配置文件简单化。

插件化,一部分面对用户,工具或系统开发人员。

使用Thrift、Avro Flume sources进行RPC通信

注:本文所使用的 apache-flume-1.6.0-bin.tar.gz,不需要额外的安装过程,解压缩即可用

高可靠性

从单agent来看,Flume使用基于事务的数据传递方式来保证事件传递的可靠性。Source和Sink被封装进一个事务。事件被存放在Channel中直到该事件被处理,Channel中的事件才会被移除。这是Flume提供的点到点的可靠机制。

从多级流来看,前一个agent的sink和后一个agent的source同样有它们的事务来保障数据的可靠性。

扫码关注李苦李公众号

李苦李公众号

标签: 日志, 大数据, Flume

添加新评论