文章目录

  • 前言
  • 一、spooldir简介
  • 二、五步法编写Agent配置
  • 三、导入驱动,准备数据
  • 1.导入驱动(重复提醒)
  • 2.创建几个数据文件
  • 四、启动Agent测试
  • 总结


前言

提示:本篇为Flume系列的实战应用,在阅读此文前请务必安装好Flume环境,可以参考文件收集工具Flume的简介与安装,基本使用可以参考Flume基本使用,监控文件变化可以参考Flume应用篇之实时监控日志并存储至HDFS,重复内容不再赘述。本机环境为: CentOS 6.5 CDH 5.3.6 JDK 1.7 本文还实现了source的文件传输筛选和sink写入时自动创建分区目录两个配置。

一、spooldir简介

我们在上篇博客Flume应用篇之实时监控日志并存储至HDFS使用exec类source实现了实时监控日志文件的新增写入并导入HDFS的功能,那么Spooling Directory Source和exec有什么区别呢? 事实上,在使用exec来监听数据源虽然实时性较高,但是可靠性较差,当source程序运行异常或者Linux命令中断都会造成数据丢失,在恢复正常运行之前数据的完整性无法得到保障。Spooling Directory Paths通过监听某个目录下的新增文件,并将文件的内容读取出来,实现日志信息的收集。实际生产中会结合log4j来使用。被传输结束的文件会修改后缀名,添加.COMPLETED后缀(可修改)。

二、五步法编写Agent配置

由于前两篇博客已经创建了两个Agent名为a1和a2,我们这里直接复制它的框架并改名cp a2.conf a3.conf并修改组件设置:

#a3: agent名称 
#r3: source的名称
#k3: sink的名称
#c3: channel的名称
 
# 第一步:为组件写一个名字
a2.sources = r2
a2.sinks = k2
a2.channels = c2
 
# 第二步:设置source的配置
a3.sources.r3.type = spooldir
a3.sources.r3.spoolDir = /opt/cdh5.3.6/flume-1.5.0-cdh5.3.6/spoollogs
a3.sources.r3.ignorePattern = ^(.)*\\.log$
a3.sources.r3.fileSuffix = .delete
 
# 第三步:设置sink的配置
a3.sinks.k3.type = hdfs
a3.sinks.k3.hdfs.path = hdfs://hadoop:9000/user/root/flume/splogs/%Y%m%d
a3.sinks.k3.hdfs.fileType = DataStream
a3.sinks.k3.hdfs.writeFormat = Text
a3.sinks.k3.hdfs.batchSize = 10
a3.sinks.k3.hdfs.useLocalTimeStamp = true
 
# 第四步:设置channel的配置
a3.channels.c3.type = file
a3.channels.c3.checkpointDir = /opt/cdh5.3.6/flume-1.5.0-cdh5.3.6/filechannel/checkpoint
a3.channels.c3.dataDirs = /opt/cdh5.3.6/flume-1.5.0-cdh5.3.6/filechannel/data

# 第五步:把source和sink绑定到channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2

这里配置有几个需要说明的地方,各个组件的设置有很多,不进行配置的情况下它的默认设置往往不符合我们的需求,还是建议大家还是尽量看官方文档进行设置。 这里对于source我们需要设置source种类为spooldir并配置和需要监控的目录,我们新建了一个spoollogs文件夹,下面的ignorePattern是通过正则表达式来设置有选择的筛选传输文件,这里就自动过滤掉了.log类文件(我们一会会测试到),然后我们将传输完成的文件后缀名更改为了.delete。 对于sink的配置大家记得将path改为自己hdfs下的目录并提前创建好。 对于channel我们选择把它放在文件中而不是内存来提高可靠性,大家可以自行设置目录。 其他的copy我写的就好。

三、导入驱动,准备数据

1.导入驱动(重复提醒)

上篇已经提醒过了,这里以防大家没看到再说一遍,在启动之前还有一点要注意,我们flume操作HDFS时是需要有一些驱动jar包的,否则会报错缺少jar包。理论上来讲我们需要将Hadoop安装目录lib下的几个jar包拷贝到flume的lib下,但为了方便大家,免去挨个找的麻烦,我贴了我的版本的几个jar包下载地址,直接copy进llib目录即可。 链接:https://pan.baidu.com/s/1btIyL07kKVrcA0WlhH8CgA 提取码:el08

2.创建几个数据文件

为了当我们启动Agent后它能有东西写,我们先随便创建好几个文件,因为我们设置了过滤.log文件,所以我们特意创建了一个.log来测试过滤:

inotifywait监控多个目录 flume监控目录_hadoop

四、启动Agent测试

接下来启动好HDFS后,最好先提前创建好上面配置的hdfs路径bin/hdfs dfs -mkdir -p /user/root/flume/splogs/再启动Agent。

bin/flume-ng agent \
-c conf \
-n a3 \
-f conf/a3.conf \
-Dflume.root.logger=DEBUG,console

如果此步骤报错的话,大概率是上面agent配置出错,请仔细检查,有问题在留言区留言交流。启动正常的话我们进入hdfs前端可以看到这个20201218的目录是它自己生成的:

inotifywait监控多个目录 flume监控目录_java_02

里面写入了我们的文件:

inotifywait监控多个目录 flume监控目录_flume_03

此时再看我们提前写入的数据可以发现

inotifywait监控多个目录 flume监控目录_hadoop_04

确实只处理了前两个文件,并没有处理我们需要过滤的.log文件。我们为了测试它的实时性,再重新修改下文件名:

inotifywait监控多个目录 flume监控目录_inotifywait监控多个目录_05

可以看到它实时地监控到了文件增加并写入了HDFS:

inotifywait监控多个目录 flume监控目录_大数据_06


总结

以上就是关于常用的spooldir的使用