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

一、架构分层

        日志收集通常分为三层,分别是采集层、汇总层和存储层;其中采集层只负责数据的采集,采集效率要高,避免堆积数据;汇总层统一对采集层推过来的数据进行处理,维护数据的路由逻辑(就是要送到哪个存储层,是hdfs还是Hbase或者mysql、kafka等等);存储层就是存储数据了,存储层可以是各种不同的媒介如hdfs、kafka、hbase等等。

二、flume组件

1、Source:完成对日志数据的收集,分成transtion 和 event 打入到channel之中。2、Channel:主要提供一个队列的功能,对source提供中的数据进行简单的缓存。3、Sink:取出Channel中的数据,进行相应的存储文件系统,数据库,或者提交到远程服务器。

三、核心概念

1、Event:一个数据单元,带有一个可选的消息头2、Flow:Event从源点到达目的点的迁移的抽象3、Client:操作位于源点处的Event,将其发送到Flume Agent4、Agent:一个独立的Flume进程,包含组件Source、Channel、Sink5、Source:用来消费传递到该组件的Event6、Channel:中转Event的一个临时存储,保存有Source组件传递过来的Event7、Sink:从Channel中读取并移除Event,将Event传递到Flow Pipeline中的下一个Agent(如果有的话)

四、flume安装

         首先还是使用FTP工具把apache-flume-1.8.0-bin.tar.gz的安装包上传到虚拟机中,然后进行解压、安装、配置,文末我会附上安装包,大家可自行下载。

sudo tar -zxvf apache-flume-1.8.0-bin.tar.gz -C /usr/local # 将apache-flume-1.8.0-bin.tar.gz解压到/usr/local目录下,这里一定要加上-C否则会出现归档找不到的错误 sudo mv ./apache-flume-1.8.0-bin.tar.gz ./flume   #将解压的文件修改名字为flume,简化操作 sudo chown -R hadoop:hadoop ./flume  #把/usr/local/flume目录的权限赋予当前登录Linux系统的用户,这里假设是hadoop用户
sudo vim ~/.bashrc # 编辑环境变量export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_191;export FLUME_HOME=/usr/local/flume                   export FLUME_CONF_DIR=$FLUME_HOME/confexport PATH=$PATH:$FLUME_HOME/bin# 以上根据自身安装位置进行配置,jdk路径以前应该已经配置过了,就不用重复配置了source ~/.bashrc # 使环境变量生效
# 打开修改flume的配置文件cd /usr/local/flume/conf sudo cp ./flume-env.sh.template ./flume-env.shsudo vim ./flume-env.sh# 加入jdk的位置export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_191; # 修改完flume的配置文件后,保存退出配置文件。
# 查看fluem的版本信息,已验证是否安装成功 cd /usr/local/flume ./bin/flume-ng version

出现下图所示即为安装成功。

observer log日志分析大数据分析 大数据日志采集的工具_flume数据采集

如果系统里安装了hbase,可能会出现如下错误: 找不到或无法加载主类 org.apache.flume.tools.GetJavaProperty,解决方案可参考

# 修改hbase配置文件 cd  /usr/local/hbase/conf sudo vim hbase-env.sh # 导入如下jar包 export JAVA_CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

五 、flume示例测试

1.案例1:Avro source    Avro可以发送一个给定的文件给Flume,Avro 源使用AVRO RPC机制。a) 创建agent配置文件

cd /usr/local/flumesudo vim ./conf/avro.conf #在conf目录下编辑一个avro.conf空文件

然后写入以下内容:

a1.sources = r1a1.sinks = k1a1.channels = c1 # Describe/configure the sourcea1.sources.r1.type = avroa1.sources.r1.channels = c1a1.sources.r1.bind = 0.0.0.0a1.sources.r1.port = 4141 #注意这个端口名,在后面的教程中会用得到 # Describe the sink a1.sinks.k1.type = logger # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1

上面Avro Source参数说明如下:Avro Source的别名是avro,也可以使用完整类别名称org.apache.flume.source.AvroSource,因此,上面有一行设置是a1.sources.r1.type = avro,表示数据源的类型是avro。bind绑定的ip地址或主机名,使用0.0.0.0表示绑定机器所有的接口。a1.sources.r1.bind = 0.0.0.0,就表示绑定机器所有的接口。port表示绑定的端口。a1.sources.r1.port = 4141,表示绑定的端口是4141。a1.sinks.k1.type = logger,表示sinks的类型是logger。

b) 启动flume agent a1

/usr/local/flume/bin/flume-ng agent -c . -f /usr/local/flume/conf/avro.conf -n a1 -Dflume.root.logger=INFO,console #启动日志控制台

如下图所示

observer log日志分析大数据分析 大数据日志采集的工具_apache_02

c) 创建指定文件先保留刚才那个窗口,再打开另外一个终端,在/usr/local/flume下写入一个文件log.00,内容为hello,world:

cd /usr/local/flumesudo sh -c 'echo "hello world" > /usr/local/flume/log.00'
cd /usr/local/flume ./bin/flume-ng avro-client --conf conf -H localhost -p 4141 -F /usr/local/flume/log.00

此时我们可以看到第一个终端(agent窗口)下的显示,也就是在日志控制台,就会把log.00文件的内容打印出来:

observer log日志分析大数据分析 大数据日志采集的工具_apache_03

至此,第一个小例子就演示结束了。

2.案例2:netcatsourcea) 创建agent配置文件

cd /usr/local/flume sudo vim ./conf/example.conf #在conf目录创建example.conf

在新建的文件中写入以下内容,

# Name the components on this agent      a1.sources = r1      a1.sinks = k1      a1.channels = c1       # Describe/configure the source      a1.sources.r1.type = netcat      a1.sources.r1.bind = localhost      a1.sources.r1.port = 44444         #同上,记住该端口名     # Describe the sink      a1.sinks.k1.type = logger       # Use a channel which buffers events in memory      a1.channels.c1.type = memory      a1.channels.c1.capacity = 1000      a1.channels.c1.transactionCapacity = 100       # Bind the source and sink to the channel      a1.sources.r1.channels = c1      a1.sinks.k1.channel = c1

b)启动flume agent (即打开日志控制台):

/usr/local/flume/bin/flume-ng agent --conf ./conf --conf-file ./conf/example.conf --name a1 -Dflume.root.logger=INFO,console

如下图所示

observer log日志分析大数据分析 大数据日志采集的工具_配置文件_04

保留上边那个窗口,再打开一个终端,输入命令:telnet localhost 44444

telnet localhost 44444

如下图所示:

observer log日志分析大数据分析 大数据日志采集的工具_数据_05

然后我们就可以在这个窗口下输入任何字符,然后在另一个窗口就会进行相应的输出,完成两边的交互,如下图所示:

observer log日志分析大数据分析 大数据日志采集的工具_flume数据采集_06

至此第二个小例子演示成功。