海量日志收集系统Flume

一、Flume定义

1.什么是Flume?

官方网址:http://flume.apache.org/

Flume是分布式的、可靠的和易用的日志收集系统,用于将大量日志从许多不同的源进行收集、聚合,最终移动到一个集中的数据中心进行存储。

特点:可靠性(保证数据不丢失)、可拓展性(各组件数目可拓展)、高性能(高吞吐量、能满足海量数据收集需求)、可管理性(可动态增加、删除组件)

2.发展历史

Flume作为Cloudera开发的实时日志收集系统,在企业中得到广泛的应用。 Flume初始的发行版本目前被统称为Flume OG(original generation),属于Cloudera。 但随着Flume功能的扩展,Flume OG代码工程臃肿、核心组件设计不合理、核心配置不标准等缺点暴露出来, 对Flume 进行里程碑式的改动:重构核心组件、核心配置以及代码架构,重构后的版本统称为Flume NG(next generation),并纳入Apache旗下 。

二、Kafka架构原理

1.Flume以Agent为最小的独立运行单位

一个Agent就是一个JVM进程

一个Agent由Source、Sink和Channel三大组件和其它组件构成
在这里插入图片描述

2.Flume Agent三大组件

Source(源)

收集数据,并传递给Channel

Channel(通道)

将Source传输的数据暂时存放

Sink(接收地)

从Channel接收数据,并写入到指定地址

3.Event(事件)

Event是Flume数据传输的基本单元。Event由headers(头)和body(体)构成 ,Headers包含一些key-value键值对,存放在Map集合中 body是一个字节数组,存储实际要传递的数据 。Event从Source流向Channel,再流向Sink,最终输出到目的地 。

4.主要组件-Source

用于消费外部数据源中的数据(event) ——Source可以分为event驱动和轮询两种类型 。

Source将数据(events)传递给一个或多个Channel ——Source必须至少与一个Channel关联 。

Source根据数据源的不同,分为不同的类型 。

5.主要组件-Channel

用于存储Source传入的数据,当数据被Sink消费后则会自动删除。

6.主要组件-Sink

用于消费Channel中的数据,并将其持久化输出 。

7.Flume可以在一个配置文件中指定一个或多个Agent

每个Agent都需要指定Source、Channel和Sink三个组件以及它们之间的绑定关系,从而形成一个完整的数据流 。具体使用哪种类型的组件,需要根据业务需要在Flume配置文件中进行指定 。

8.Flume提供了多节点共同采集数据的功能

多个Agent位于不同的服务器上, 每个Agent Avro Sink将数据输出到另一台服务器上的Avro Source进行汇总,最终将数据输出到HDFS文件中 。
在这里插入图片描述

9.Flume还支持将数据流多路复用到一个或多个目的地

在这里插入图片描述

注意:一个Source可以对应多个Channel,一个Channel也可以对应多个Source; 一个Channel可以对应多个Sink,但一个Sink只能对应一个Channel 。

三、Flume安装与使用

1.安装JDK

Flume依赖Java环境

2.配置环境变量

修改/etc/profile文件,添加:

export Flume_Home=(安装目录)
export PATH= p a t h : path: FLUME_HOME/bin

输入.bin/flume-ng version命令,显示版本号及表示配置成功
在这里插入图片描述

3.配置Flume

Flume配置文件是Java属性文件,里面存放key/value对 。

新建配置文件:flume-conf.properties(放置在conf文件夹下)
在这里插入图片描述

配置属性说明:

a1.sources.type: 指定Source的类型
a1.sinks.k1.type:指定Sink的类型
a1.channels.c1.type:指定Channel的类型
a1.channels.c1.capacity:存储在Channel中的最大event数量
a1.channels.c1.transactionCapacity:在每次事务中,Channel从Source接收或发送给Sink的最大event

数量
  Flume配置文件特点:

使用纯文本的键值对来进行配置
在配置文件中,Flume使用分层结构
配置文件中,可以包含若干Agent的配置,但实际只加载flume-ng命令中指定agent的配置
Agent的组件可以有若干实例,需要对组件命名
必须使用指定格式列出组件,该列表称为活跃列表, 不在活跃列表中的组件,不会被创建、配置或启动

4.启动Flume

$ flume-ng agent
–conf conf
–conf-file conf/flume-conf.properties
–name a1
-Dflume.root.logger=INFO,console

启动参数说明:

–conf-file:指定配置文件位置

–name:指定要运行的agent的名称

-Dflume.root.logger:指定日志输出级别和输出位置

5.测试

新打开一个终端窗口,连接本地44444端口

telnet localhost 44444

若提示找不到telnet,可以使用yum install –y telnet安装

在这里插入图片描述
输入任意内容后按Enter键发送
在这里插入图片描述

四、拦截器

作用:修改或删除正在传送中event 。

拦截器是一些实现Interceptor接口的类 。

在Source组件中设置,支持设置多个拦截器,多个拦截器使用空格连接在一起,根据配置顺序依次执行 ,如果某个拦截器需要删除event,当event经过该拦截器后,该event会被过滤掉,不会返回给下一个拦截器 。

常用内置拦截器:

时间戳拦截器(Timestamp Interceptor) 、主机名拦截器(Host Interceptor)、 静态拦截器(Static Interceptor)、 UUID拦截器(UUID Interceptor) 、搜索替换拦截器(Search and Replace Interceptor) 、正则表达式拦截器(Regex Filtering Interceptor) 。

自定义拦截器 :

自定义拦截器需要实现Interceptor接口并重写intercept()方法

主要步骤 :编写拦截器类 、导出jar包 、编写配置文件,加入自定义的拦截器、 启动agent测试 。

五、选择器

Source可以将event写入多个Channel,而Channel选择器可以决定将event写入哪些Channel 。

Flume内置两种选择器 :复制选择器 、多路选择器 。