大数据中,我们经常会将一些日志文件收集分析,比如网站的日志文件等等,我们需要一个工具收集数据并且上传到HDFS,HIVE,HBASE等大数据仓库中,Apache为我们提供了一个很好的文件实时收集框架供我们使用。

<>一、Flume的介绍

官网的介绍如下:
Apache Flume is a distributed, reliable, and available system for efficiently
collecting, aggregating and moving large amounts of log data from many
different sources to a centralized data store. The use of Apache Flume is not
only restricted to log data aggregation. Since data sources are customizable,
Flume can be used to transport massive quantities of event data including but
not limited to network traffic data, social-media-generated data, email
messages and pretty much any data source possible. Apache Flume is a top level
project at the Apache Software Foundation.
Flume框架是一个分布式,可信以及高可用的用来从一个源端有效的收集,聚集和移动海量日志文件存储到数据仓库的系统。
Flume框架在大数据分析中还是有着重要的地位,它是Apache的一个顶级项目。
Flume的架构图如下:

Flume由三大组件构成:

* Source
* Channel
* Sink

在介绍中之所以说它是一个分布式框架,是因为它本身就是一个客户端,每一个客户端是一个Agent,可以分布在一个集群的各个节点收集日志信息。下面的一幅图表现出其分布式架构:


遗憾的是Flume只能运行在linux服务器上,下面看看安装运行Flume的必需环境:

* linux系统
* JDK环境
* 足够的内存空间和磁盘空间(一般不需要很大)
Flume是怎样工作的呢?
这时就有一个概念:
Event:
什么是event呢?
A Flume event is defined as a unit of data flow having a byte payload and an
optional set of string attributes.
event是一次收集传递数据的最小单位。
Event由一个可选的header头和一个载有数据的byte
array组成,载有的数据对flume是不透明的,header是一个容纳了key-value对的无序集合,key在这个集合中唯一存在,这个类似于Java中的set集合,无序不可重复。

Flume可以从外部的一个源端(例如Web
Server)通过Source组件来收集日志,每一次收集的日志都会被封装在一个Event中,主动(put)存放在Channel中,sink会(poll)从这个Channel中获取数据存储到数据仓库中。这个Channel是一个队列,里面存放着event,channel可以存放在内存中,也可以在文件中等等。

三大组件的介绍
上面说到Flume的三大组件sources,channel,sinks。
在Apache官网中它提供了这三大组件的种类,这里列举了几个常用的来说明。
常用的Sources:

下面的案例中我们会用NetCar TCP Source来演示。

常用的channel:

下面案例中使用Memory Channel,存放在内存中。

常用Sink如下:

下面案例中使用Logger Sink,将收集的数据打印在控制台日志中。

<>二、简单的Flume日志搭建

1.安装Flume
Flume的安装很简单,只需要下载安装解压然后修改配置文件即可。下载地址【
http://archive.cloudera.com/cdh5/】,这里使用的是Flume
<http://archive.cloudera.com/cdh5/%E3%80%91%EF%BC%8C%E8%BF%99%E9%87%8C%E4%BD%BF%E7%94%A8%E7%9A%84%E6%98%AFFlume>
1.5.0-cdh5.3.6这个版本。

在Flume解压后,会有一个bin目录,里面有一个Flume-ng,Flume-ng只有一个角色的节点:agent节点,agent由Source、channel、sink组成。启动时会利用它来启动Flume。

然后进入conf目录下,在flume-env.sh文件添加jdk路径:
export JAVA_HOME=/opt/modules/jdk1.7.0_79
下面我们来列举一个案例看看Flume是如何实时收集日志文件的。
如上面所说,我们使用NetCat Source(linux的一个软件,可以在远程服务器的控制台输入信息并且接收),Memory
Channel,Logger Sink,将接收的日志信息打印在客户端。

在conf目录下创建一个a1.conf文件,编辑内容如下:
# The configuration file needs to define the sources, # the channels and the
sinks. # Sources, channels and sinks are defined per agent, # in this case
called 'agent' a1.sources = r1 a1.channels = c1 a1.sinks = k1 #define sources
a1.sources.r1.type = netcat a1.sources.r1.bind = hadoop-senior.shinelon.com
a1.sources.r1.port = 44444 #define channels a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100
#a1.channels.c1.keep-alive=100 #a1.channels.c1.byteCapacityBufferPercentage=20
#define sink a1.sinks.k1.type = logger a1.sinks.k1.maxBytesToLog = 2014 #bind
sources and sink to channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1
上面的代码都有注释,不加详细解释,就是定义Source,Channel,Sink。编译好之后保存。
注意,使用NetCat Source需要安装telnet软件。
在启动Flume之前讲解一下Flume-ng的几个参数:

* -c或者–conf:跟配置目录
* -f或者–conf-file:跟具体的配置文件
* -n或者–name:指定agent的名称
然后在Flume 的安装目录下输入命令启动: bin/flume-ng agent --conf conf --name al --conf-file
conf/a1.conf -Dflume.root.logger=DEBUG,console
然后打开另一个控制台,用来连接Flume并且发送信息:
[shinelon@hadoop-senior root]$ telnet hadoop-senior.shinelon.com 44444
连接之后,当我们发送信息,控制台就会打印信息。




至此,我们就介绍完Flume,并且用一个简单的案例来演示Flume,通过这个案例我们可以感受到它的工作流程以及它的实时性。

如果你想和我们一起探讨学习,共同进步,欢迎加群:

友情链接
ioDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信