Flume简介
flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力 。
flume的数据流由事件(Event)贯穿始终。事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source生成,当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。你可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。
Flume安装
1. 解压 flume安装包到 /itcast/ 目录下
tar -zxvf /*flume安装包*/ /itcast/
2. 修改 flume配置文件:
2.1 flume-env.sh
修改文件名称:
mv flume-env.sh.template flume-env.sh
添加java_home
,保证flume
所使用的jdk和hdfs是一样的(可以使用 echo JAVA_HOME
查看当前机器所使用的javaHome所在路径)
2.2 编写agent配置文件a4.conf
定义agent名, source、channel、sink的名称
a4.sources = r1
a4.channels = c1
a4.sinks = k1
具体定义source
a4.sources.r1.type = spooldir #具体实现类是通过反射加载的
a4.sources.r1.spoolDir = /root/logs #监听这个目录
具体定义channel
a4.channels.c1.type = memory #
a4.channels.c1.capacity = 10000 #多少条数据进行一次发送
a4.channels.c1.transactionCapacity = 100 #事物的容量
定义拦截器,为消息添加时间戳
a4.sources.r1.interceptors = i1
a4.sources.r1.interceptors.i1.type= org.apache.flume.interceptor.TimestampInterceptor$Builder
具体定义sink
a4.sinks.k1.type = hdfs
a4.sinks.k1.hdfs.path = hdfs://ns1/flume/%Y%m%d #根据时间动态生成
a4.sinks.k1.hdfs.filePrefix = events- #产生日志的前缀
a4.sinks.k1.hdfs.fileType = DataStream #纯文本方式接收
不按照条数生成文件
a4.sinks.k1.hdfs.rollCount = 0 #多少条flush成1个文件
HDFS上的文件达到128M时生成一个文件
a4.sinks.k1.hdfs.rollSize = 134217728 #文件达到多大时flush成一个文件
HDFS上的文件达到60秒生成一个文件
a4.sinks.k1.hdfs.rollInterval = 60 #flush成一个文件的时间间隔
组装source、channel、sink
a4.sources.r1.channels = c1
a4.sinks.k1.channel = c1
3. 启动flume
先切换到 /itcast/apache-flume-1.5.0-bin/
目录下:
输入命令:
bin/flume-ng agent -n a4 -c conf -f conf a4.conf -Dflume.root.logger=INFO,console
命令解释:
启动后有可能遇到如下的错误,这里一一列举出来,出错的童鞋对号入座:
错误1:
解决:说明缺少jar包,拷贝 /itcast/hadoop-2.6.0/share/hadoop/common/hadoop-common-2.6.0.jar
到 /itcast/apache-flume-1.5.0-bin/lib/
文件夹下
使用scp命令:
错误2:
解决:说明缺少jar包,拷贝/itcast/hadoop-2.6.0/share/hadoop/common/lib/commons-configuration-.jar
到/itcast/apache-flume-1.5.0-bin/lib/
文件夹下
错误3:
解决:将/itcast/hadoop-2.6.0/share/hadoop/common/lib/ hadoop-auth-2.6.0.jar拷贝到flume/lib目录下
错误4:
解决:在 /root目录下创建logs目录 :mkdir /root/logs
错误5:
解决:告知flume ns1的配置信息
1)拷贝core-site.xml和 hdfs-site.xml到flume的conf目录下
scp /itcast/hadoop-2.6.0/etc/hadoop/{core-site.xml, hdfs-site.xml}
192.168.1.204:/itcast/apache-flume-1.5.0-bin/conf
2)修改/etc/hosts 文件,让该主机知道itcast01 和itcast02的IP地址
添加itcast01 和itcast02 ip和主机名的映射
3)拷贝hadoop-hdfs-2.6.0.jar
如果出现如下的内容并且显示在不断滚动,说明没问题了,flume启动成功!
启动成功之后的样子应该是这样的:
3.1 写入测试
现在如果向 /root/logs 目录下丢进文件,flume则会将这个文件下的内容写入hdfs中
先执行命令:
bin/flume-ng agent -n a4 -c conf -f conf/a4.conf
-Dflume.root.logger=INFO,console
启动flume之后,将日志文件 access_2013_05_30.log 放到 logs 文件夹下:
通过网页查看hdfs,发现多了一个目录 /flume ,在这个目录下的文件有 20160618 ,说明文件是以时间命名的
在 /flume/20160618 这个文件夹下
问题:为什么生成的是3个文件,我写入的不是1个吗?而且这3个文件大小加起来刚好等于日志文件access_2013_05_30.log的大小
原因:这里sink设置了每60秒滚动写入一次或者当缓冲区文件大小达到134217728字节(128M)时进行滚动写入。
通过计算时间,写入总共花费几分钟,那势必第二个滚动选项是无法满足的,所以文件每60s的时候刚刚读入了一部分,接着就被写入hdfs中了。
4.flume的另外一种配置
source—exec
channel—memory
sink—logger
启动方式和之前的一样,只是读入的配置文件不同:
bin/flume-ng agent -n a2 -f /home/hadoop/a2.conf -c conf -Dflume.root.logger=INFO,console
a2.conf配置文件:
定义agent名, source、channel、sink的名称
a2.sources = r1
a2.channels = c1
a2.sinks = k1
具体定义source
a2.sources.r1.type = exec
a2.sources.r1.command = tail -F /home/hadoop/a.log
具体定义channel
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100
具体定义sink
a2.sinks.k1.type = logger
组装source、channel、sink
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1
监控当有数据写入这个log文件中时,flume将这些数据采集并打印在控制台上
a) 就像tail –F file 命令一样
# echo 111111 >> log
# echo 222222 >> log
# echo 333333 >> log
以阻塞形式打印,向log文件中追加记录
b) 以a2.conf配置文件运行flume
将a2.conf文件拷贝到flume/conf 目录下
在/root目录下创建文件log
运行命令:
bin/flume-ng agent -n a2 -f /itcast/apache-flume-1.5.0-bin/conf/a2.conf
-c conf -Dflume.root.logger=INFO,console