Flume介绍
1、概述
- Flume最早是Cloudera提供的日志收集系统,后贡献给Apache
- Flume是一个高可用的,高可靠的 、健壮性,分布式的海量日志采集、聚合和传输的系统
- Flume支持在日志系统中定制各类数据发送方,用于收集数据(source)
- Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力(sink)。
2、版本
- Flume0.9X:又称Flume-og,老版本的flume,需要引入zookeeper集群管理,性能也较低(单线程工作)
- Flume1.X:又称Flume-ng。新版本需要引入zookeeper,和flume-og不兼容
3、Flume的特性
- 可靠性:事务型的数据传递,保证数据的可靠性。一个日志交给flume来处理,不会出现此日志丢失或未被处理的情况
- 可恢复性:通道可以以内存或文件的方式实现,内存更快,但不可恢复。文件较慢但提供了可恢复性
4、event事件
一、Flume总体架构图
二、event 事件
- event的相关概念:Flume的核心是把数据从数据源(source)收集过来,在将收集到的数据送到指定的目的地(sink)。为了保证输送的过程一定成功,在送到目的地(sink)之前,会先缓存数据(channel),待数据真正到达目的地(sink)后,flume在删除自己缓存的数据。
- 在整个数据的传输的过程中,流动的是event,即事务保证是在event级别进行的。event将传输的数据进行封装,是flume传输数据的基本单位,如果是文本文件,通常是一行记录,event也是事务的基本单位。event从source,流向channel,再到sink,本身为一个字节数组,并可携带headers(头信息)信息。event代表着一个数据的最小完整单元,从外部数据源来,向外部的目的地去。简而言之,在Flume中,每一条日志就会封装成一个event对象
- 一个完整的event包括:event headers、event body、event信息(即文本文件中的单行记录),如下所以:
其中event信息就是flume收集到的日记记录。
三、Flume的运行机制
- flume运行的核心就是agent,agent本身是一个Java进程
- agent里面包含3个核心的组件:source—>channel—>sink,类似生产者、仓库、消费者的架构
- source:source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定义等
- channel:source组件把数据收集来以后,临时存放在channel中,即channel组件在agent中是专门用来存放临时数据的——对采集到的数据进行简单的缓存,可以存放在memory、jdbc、file等等
- sink:sink组件是用于把数据发送到目的地的组件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定义。
- 一个完整的工作流程:source不断的接收数据,将数据封装成一个一个的event,然后将event发送给channel,chanel作为一个缓冲区会临时存放这些event数据,随后sink会将channel中的event数据发送到指定的地方—-例如HDFS等
- 注:只有在sink将channel中的数据成功发送出去之后,channel才会将临时event数据进行删除,这种机制保证了数据传输的可靠性与安全性。
四、Flume的复杂流动
多个agent的数据流(多级流动)
数据流合并(扇入流)
在做日志收集的时候一个常见的场景就是,大量的生产日志的客户端发送数据到少量的附属于存储子系统的消费者agent。例如,从数百个web服务器中收集日志,它们发送数据到十几个负责将数据写入HDFS集群的agent。
这个可在Flume中可以实现,需要配置大量第一层的agent,每一个agent都有一个avro sink,让它们都指向同一个agent的avro source(强调一下,在这样一个场景下你也可以使用thrift source/sink/client)。在第二层agent上的source将收到的event合并到一个channel中,event被一个sink消费到它的最终的目的地。
数据流复用(扇出流)
Flume支持多路输出event流到一个或多个目的地。这是靠定义一个多路数据流实现的,它可以实现复制和选择性路由一个event到一个或者多个channel。
上面的例子展示了agent foo中source扇出数据流到三个不同的channel,这个扇出可以是复制或者多路输出。在复制数据流的情况下,每一个event被发送所有的三个channel;在多路输出的情况下,一个event被发送到一部分可用的channel中,它们是根据event的属性和预先配置的值选择channel的。 这些映射关系应该被填写在agent的配置文件中。
一、安装步骤
此处还是用之前搭建的虚拟机进行安装
1. 安装JDK1.6以上,建议JDK1.7或者JDK1.8
2. 下载/上传flume的安装包
3. 解压安装
tar -xvf apache-flume-1.6.0-bin.tar.gz
4. 在conf目录下,创建一个配置文件,比如:template.conf(名字可以不固定,后缀也可以不固定),添加如下配置:
复制粘贴即可,先测试一下,一会详解配置属性含义
#配置Agent a1 的组件
a1.sources=r1
a1.channels=c1
a1.sinks=s1
#描述/配置a1的r1
a1.sources.r1.type=netcat
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=44444
#描述a1的s1
a1.sinks.s1.type=logger
#描述a1的c1
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#为channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
5. 进入flume的bin目录执行: ./flume-ng agent -n a1 -c …/conf -f …/conf/template.conf -Dflume.root.logger=INFO,console
6. 新打开一个窗口通过nc来访问:
输入nc如果是这样的话
这是没有安装nc,需要安装一下
yum install -y nc
下面开始测试一下flume
nc localhost 44444
hello
nihao
123456789
通过nc请求flume已经返回OK
看一下之前启动flume的窗口,已经收到了
或者通过外部http请求访问对应的ip和端口,比如:http://192.168.199.11:44444/123123
在虚拟机这边,会出现如下提示:
二、启动命令
参数 描述
agent 运行一个Flume Agent
–conf,-c 指定配置文件放在什么目录
–conf-file,-f 指定配置文件,这个配置文件必须在全局选项的–conf参数定义的目录下
–name,-n Agent的名称,注意:要和配置文件里的名字一致。
-Dproperty=value 设置一个JAVA系统属性值。常见的:-Dflume.root.logger=INFO,console
参数 | 描述 |
---|---|
agent | 运行一个Flume Agent |
–conf,-c | 指定配置文件放在什么目录 |
–conf-file,-f | 指定配置文件,这个配置文件必须在全局选项的–conf参数定义的目录下 |
–name,-n | Agent的名称,注意:要和配置文件里的名字一致。 |
-Dproperty=value | 设置一个JAVA系统属性值。常见的:-Dflume.root.logger=INFO,console |
示例:./flume-ng agent -n a1 -c …/conf -f …/conf/template.conf -Dflume.root.logger=INFO,console
通过以上的介绍我们知道有三个重要组件分别为source、channel、sink以下先详解每一个组件,在结合组件做实例
一、source 详解总共6个
1、Avro Source详解(使用率极高)
一、概述
- 监听Avro 端口来接收外部avro客户端的事件流
- avro-source接收到的是经过avro序列化后的数据,然后反序列化数据继续传输。
- 源数据必须是经过avro序列化后的数据
- 利用Avro source可以实现多级流动、扇出流、扇入流等效果
- 可以接收通过flume提供的avro客户端发送的日志信息
二、可配选项说明
配置项 | 说明 |
---|---|
channels | 绑定通道 |
type | avro |
bind | 需要监听的主机名或IP |
port | 要监听的端口 |
threads | 工作线程最大线程数 |
selector.* | 选择器配置 |
interceptors.* | 拦截器配置 |
三、简单示例
- 在conf文件夹下新建配置文件:avrosource.conf
- 添加如下内容:
#配置Agent a1 的组件
a1.sources=r1
a1.channels=c1
a1.sinks=s1
#描述/配置a1的source1
a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=44444
#描述sink
a1.sinks.s1.type=logger
#描述内存channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#为channel 绑定 source和sink
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
- 执行启动指令,如果出现如下提示,证明启动成功
./flume-ng agent -n a1 -c ../conf -f ../conf/avrosource.conf -Dflume.root.logger=INFO,console
4. 在flume根目录创建mydata文件夹,在mydata内创建1.txt,写一个Hello然后保存退出
6. 在bin目录执行agent-avro客户端指令:./flume-ng avro-client -H 0.0.0.0 -p 44444 -F …/mydata/1.txt -c …/conf/
可以看到文件内的hello反序列化到Flume中
2、Exec Source详解(使用率中)
一、概述
- 可以将命令产生的输出作为源来进行传递,例如捕获ping命令
二、可配置选项说明
配置项 | 说明 |
---|---|
channels | 绑定的通道 |
type | exec |
command | 要执行的命令 |
selector.* | 选择器配置 |
interceptors.* | 拦截器列表配置 |
三、示例:
- 在conf文件夹下新建配置文件:execsource.conf
- 添加如下内容:
#配置Agent a1 的组件
a1.sources=r1
a1.channels=c1
a1.sinks=s1
#描述/配置a1的source1
a1.sources.r1.type=exec
a1.sources.r1.command=ping www.baidu.com
#描述sink
a1.sinks.s1.type&#