开发者学堂课程【Flume 基础应用实战-企业全场景解决方案:Apache Flume-案例-监控采集文件夹变化 (exec source)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/715/detail/12770
Apache Flume-案例-监控采集文件夹变化 (exec source)
内容介绍:
一、需求描述
二、演示
三、小结
一、需求描述
在业务系统当中有一个文件,文件内容会源源不断地变化、追加,比如服务器日志,它就是一个随着时间不断动态追加的过程。需求是要把这个文件不断追加、动态变化的内容实时地采集到,收集到 hdfs 中去,相当于这个文件当中追加一行内容,收集一条内容,追加两条,收集两条。
这个需求很明确,这时候要去确定 flume 当中三个组件的类型。最终要把数据采集到 hdfs 当中去,因此 sink 可以确定采用 hdfs sink ,可以跟 hdfs 组件进行对接,重点就在于有一个什么样的数据源,可以去对接一个动态变化的文件内容。如果现在不考虑 flume,用 linux 命令是否能满足这个需求,可以马上想到 tail-f 这个命令,它可以去实时的追加一个文件的变化,只要内容有变化,它就会把变化内容显示出来。
问题在于 tail-f 是 linux 命令,flume 怎么去执行 linux 命令?需去 flume 的官网查找,通过调研可以发现,在 flume 当中正好有一个 source 可以满足于去执行 linux 的命令叫做 exec source。打开官网来看一下,回到source当中来寻找一下exec source。
在这里可以发现这个 source 可以去运行一个给定 linux 的命令,然后把运行的结果作为数据收集到,比如 cat 命令,它读一个文件内容,把读取的内容作为数据源收集,tail-f 命令,因为 tail-f 也可以实时的变化,只要这些命令能够产生数据,追踪数据,它就可以把这些命令的结果作为数据收集到,正好满足于业务的需求。
(1)采集源,即 source-- 监控文件内容更新:exec ‘tail -File’ ;
(2)下沉目标,即 sink--HDFS 文件系统:hdfs sink;
(3)Source 和 sink 之间的传递通道--channel,可用 file channel 也可以用内存channel。
基于这三个就可以来配置采集方案。
首先,第一大块需要对三个组件起个名字。
描述 source,名字叫 r1,类型叫做 exec,这些是根据 flume 官网来做一个参考.它上面有介绍之后下面会有例子,
可以根据它的例子来做相关的编写。执行 tail-f 的命令,这个文件的路径就是需求当中需要去动态采集文件的路径,下面牵绑定的 channel 叫 c1。
sink 描述:类型叫做 hdfs,路径在 /flume/tailout 下,后面的三级,四级目录是动态获取的。后面的 round 表示十分钟会滚动生成一个文件夹,下面开启文件的滚动,一个3秒钟为间隔或20 byte 或者5 count,做一个调整,比如说以10秒为单位或者20秒为单位,看一下怎么更改。
指定 memory 来进行数据的缓存,大小是1000个 event,事物容量是100个,然后做一个绑定.
这些描述完之后,构成的文件就可以把该需求描述清楚。
二、演示
打开服务器来配置一下相关的方案,cd 到 conf 路径下。
通过名字,可以猜想到 tail-hdfs.conf 比较符合需求,打开,里面就是来动态采集数据文件变化内容,首先把名字复制一下。打开服务器,vim 做一个编辑,然后开始复制三个组件的名字,以及它最终的数据,复制过来之后,来做一个简单的修改看一下效果。
其他保持不变,做一个保存。接下来启动它,看能不能完成监听文件,来验证一下。
启动一下 flume 进程,启动命令可以根据之前的做一个修改编写,这些不需要记住,但是要知道,当需要的时候,可以从哪里去找到它即可。
输入 cd../
Bin/flume-ng agent -c conf -f conf/tail-hdfs.conf -n Dflume.root.logger=INFO,console
Component type: SINK,name:k1started
这里 sink k1 已经启动了,但是现在并没有文件的变化,所以它并不会去收集数据,从 hdfs 网站上也可以看到,现在并没有一个叫做 tailout 的数据出来,说明并没有数据收集,会产生一个问题, 怎么去模拟一下有一个文件能够实时的产生变化内容,可以写一个 shell 脚本来简单编写一个循环来满足。
While true;do data>>/root/logs/test.log;done
接下来执行,这时候可以简单地验证一下,
输入:mkdir logs
Tail -f log/test.log
可以发现数据在实时的变化,接下来就在第一台机器上来模拟数据的变化。
可以发现在这个路径下有两个目录,十秒钟一个文件,当然也可以开启其他的滚动方式,那么这样就完成了业务需求。
三、小结
(1)exec source 可以执行指定的 linux command 把命令的结果作为数据进行收集
(2)while true; do date>> /root/logs/test.log;done
使用该脚本模拟数据实时变化的过程