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
出现下图所示即为安装成功。
如果系统里安装了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 #启动日志控制台
如下图所示
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文件的内容打印出来:
至此,第一个小例子就演示结束了。
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
如下图所示
保留上边那个窗口,再打开一个终端,输入命令:telnet localhost 44444
telnet localhost 44444
如下图所示:
然后我们就可以在这个窗口下输入任何字符,然后在另一个窗口就会进行相应的输出,完成两边的交互,如下图所示:
至此第二个小例子演示成功。