开发者学堂课程【Flume 基础应用实战-企业全场景解决方案:Apache Flume- 静态拦截器-案例业务需求描述】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/715/detail/12773
Apache Flume- 静态拦截器-案例业务需求描述
目录
一、日志的采集和汇总
一、日志的采集和汇总
1、需求描述:
在企业当中,有两台服务器,分别叫 A 和 B,这两台服务器会产生不同的文件,access.log、nginx.log、web. Log,现在要求把 A、B 机器中的 access.log、nginx.log、web.log 采集汇总到 C 机器上,然后统一收集到 hdfs 中,但是在 hdfs 中要分门别类的存放,对应文件要对应目录:
/source/logs/access/20160101/**
/source/logs/nginx/20160101/**
/source/logs/web/20160101/**
注意难点在数据文件叫什么名字就把它放在对应的文件下。
需求图:
需求图描述:假设有一台叫 server 的服务器,在这台服务器中,某个路径会产生三种不同类型的日志:access.log、nginx.log、web. Log,要求通过 flume 把这三个文件最终上传到 hdfs 中,但放的时候不能乱放,要求按照它们的来源分门别类的存放到 /data/access/ , /web/ , /nginx/ 中。其中有三个文件不断变化,所以需要三个 source 来对接三个不同的数据,这三个 source 都应该能够用来追踪一个文件,不断变化的 source,exec 可以去执行一个 tail-f 的命令,channel 用内存和文件都可以,问题在于怎么样经过 sink 上传到 hdfs 中,还要分门别类的存放。可能有人会想,文件名字都告诉了,就往这三个不同路径上放就可以了。问题在于flume 收集到数据,并不是把文件拿过来,而是把数据里面的内容变成什么一个event,也就说在 flume 当中,数据都是一个个的 event,而 event 当中并不会表示来自于哪个文件。
2、当中只有文件的 body 信息。
3、解决方法——静态拦截器:
顾名思义,它能够去拦截 flume 收集到的数据,做某些处理之后再释放出数据。如果画图,相当于它可以在收集数据的时候做一个拦截,这个拦截器就是 flume 当中自带的一个拦截器,叫做静态拦截器。
静态连接器指的是它的一个功能点,是它内置的,它可以往采集到 event 当中加入自己添加的一些标识。
打开配置文件看一下,静态拦截器不需要我们自己开发,是它内置的。
在去描述 source 的时候,给它做一个指定,上面这些都跟之前一样,类型叫做exec, command 等于执行的命令,揭示这个文件。重点在下面,它添加一个拦截器名字叫做 i1,它的类型叫做 static 静态拦截器,它可以往采集到的数据 header中插入自己定义的 key-value 对,比如这里定义的 k 叫做 type,v 叫做 access,简单说它可以拦截到 event 往里面添加标识,后面就可以标识来进行梳理。
举例说明:
如果没有使用静态拦截器:
Event: { headers:{} body: 36 Sun Jun 218:26}
使用静态拦截器之后,自己添加 kv 标识对:
Event: { headers:{type=access} body: 36 Sun Jun 218:26)
Event:{ headers:{type=nginx} body: 36 Sun Jun 218:26 }
Event: { headers:{type=webl} body:I 36 Sun Jun 2 18:26 }
有了标识之后,再根据拦截插入的标识进行区分即可。
比如:给 access 文件添加 access 标识,给三个文件分别添加对应的标识,这样三个文件都有了各自的 kv 对。
静态拦截器的使用方法:
可以发现第三级路径是一个 %{type},这个 type 值就是上面添加的表示当中的 k 的值,它就会根据 k 对应的 v 来确定数据存放内容。
后续在存放数据的时候可以使用 flume 的规则语法获取到拦截器的 kv 内容。