Flume开发 -- 自定义Interceptor

本文详细介绍了如何使用Flume自定义Interceptor来区分不同类型日志,并将其发送到不同的分析系统。通过创建Maven项目,实现Interceptor接口,根据Header的key值将日志分为数字和字母两类,分别发送到不同Channel。配置Flume的多个conf文件,并通过netcat发送数据进行测试验证,观察日志输出结果。
摘要由CSDN通过智能技术生成

一、需求

使用 Flume 采集服务器本地日志,需要按照日志类型的不同,将不同种类的日志发往不同的分析系统。

二、需求分析

在实际的开发中,一台服务器产生的日志类型可能有很多种,不同类型的日志可能需要发送到不同的分析系统。此时会用到 Flume 拓扑结构中的 Multiplexing 结构,Multiplexing的原理是,根据 event 中 Header 的某个 key 的值,将不同的 event 发送到不同的 Channel 中,所以我们需要自定义一个 Interceptor,为不同类型的 event 的 Header 中的 key 赋予不同的值。

在该案例中,我们以端口数据模拟日志,以数字(单个)和字母(单个)模拟不同类型的日志,我们需要自定义 interceptor 区分数字和字母,将其分别发往不同的分析系统(Channel)。

三、 流程图示

在这里插入图片描述

四、步骤

4.1 编写代码

1、创建 maven 项目,加入以下依赖

<dependency>     
	<groupId>org.apache.flume</groupId>     
	<artifactId>flume-ng-core</artifactId>     
	<version>1.7.0</version> 
</dependency> 

2、实现 CustomInterceptor 类并实现 Interceptor 接口

package interceptorstudy;

import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;

import java.util.ArrayList;
import java.util.List;

/**
 * @description: 自定义 Interceptor,要实现 Interceptor 接口
 * @author: hyr
 * @time: 2020/3/4 8:14
 */
public class CustomInterceptor implements Interceptor {
    @Override
    public void initialize() {

    }


    /*
        用来处理每一个 event 对象,该方法不会被系统自动调用,一般在
        List<Event> intercept(List<Event> events) 方法内部调用。
     */
    @Override
    public Event intercept(Event event) {
        byte[] body = event.getBody();
        if (body[0] <= 'z' && body[0] >= 'a'){
            event.getHeaders().put("type", "letter");
        }else if (body[0] >= '0' && body[0] <= '9'){
            event.getHeaders().put("type", "number");
        }else {
            return null;
        }
        return event;
    }

    /*
        这里编写对于 event 对象集合的处理代码,一般都是遍历 event 的对象集合,
        对于每一个 event 对象,调用 Event intercept(Event event) 方法,
        然后根据返回值是否为null,来将其添加到新的集合中。
     */
    @Override
    public List<Event> intercept(List<Event> events) {
        List<Event> results = new ArrayList<>();
        Event event;
        for (Event e : events) {
            event = intercept(e);
            if (event != null){
                results.add(event);
            }
        }
        return results;
    }

    @Override
    public void close() {

    }

    /*
        通过静态内部类来创建自定义对象供 flume 使用。
     */
    public static class Builder implements Interceptor.Builder{
        @Override
        public Interceptor build() {
            return new CustomInterceptor();
        }

        @Override
        public void configure(Context context) {

        }
    }
}

3、用 maven 打成 jar 包,上传到机器上,将 jar 包放入 lib 目录下

4.2 编辑 flume1.conf

为 hadoop151 上的 Flume1 配置 1 个 netcat source,1 个 sink group(2 个 avro sink),并配置相应的 ChannelSelector 和 interceptor。

编辑 flume1.conf 文件:

# Name the components on this agent 
a1.sources = r1 
a1.sinks = k1 k2 
a1.channels = c1 c2 
 
# Describe/configure the source 
a1.sources.r1.type = netcat 
a1.sources.r1.bind = localhost 
a1.sources.r1.port = 44444 
 

a1.sources.r1.interceptors = i1 
a1.sources.r1.interceptors.i1.type = interceptorstudy.CustomInterceptor$Builder

a1.sources.r1.selector.type = multiplexing 
a1.sources.r1.selector.header = type 
a1.sources.r1.selector.mapping.letter = c1 
a1.sources.r1.selector.mapping.number = c2 
 
# Describe the sink 
a1.sinks.k1.type = avro 
a1.sinks.k1.hostname = hadoop152
a1.sinks.k1.port = 4141 
 
a1.sinks.k2.type=avro 
a1.sinks.k2.hostname = hadoop153 
a1.sinks.k2.port = 4142 
 
# Use a channel which buffers events in memory 
a1.channels.c1.type = memory 
a1.channels.c1.capacity = 1000 
a1.channels.c1.transactionCapacity = 100 
 
# Use a channel which buffers events in memory 
a1.channels.c2.type = memory 
a1.channels.c2.capacity = 1000 
a1.channels.c2.transactionCapacity = 100 
 
 
# Bind the source and sink to the channel 
a1.sources.r1.channels = c1 c2 
a1.sinks.k1.channel = c1 
a1.sinks.k2.channel = c2 

4.3 编辑 flume2.conf

为 hadoop152 上的 Flume2 配置一个 avro source 和 一个 logger sink。

a2.sources = r1 
a2.sinks = k1 
a2.channels = c1 
 
a2.sources.r1.type = avro 
a2.sources.r1.bind = hadoop152
a2.sources.r1.port = 4141 
 
a2.sinks.k1.type = logger 
 
a2.channels.c1.type = memory 
a2.channels.c1.capacity = 1000 
a2.channels.c1.transactionCapacity = 100 
 
a2.sinks.k1.channel = c1 
a2.sources.r1.channels = c1 

4.4 编辑 flume3.conf

为 hadoop153 上的 Flume3 配置一个 avro source 和一个 logger sink。

a3.sources = r1 
a3.sinks = k1 
a3.channels = c1 
 
a3.sources.r1.type = avro 
a3.sources.r1.bind = hadoop153
a3.sources.r1.port = 4142 
 
a3.sinks.k1.type = logger 
 
a3.channels.c1.type = memory 
a3.channels.c1.capacity = 1000 
a3.channels.c1.transactionCapacity = 100 
 
a3.sinks.k1.channel = c1 
a3.sources.r1.channels = c1 

4.5 在各个机器上启动 flume 进程

先启动 hadoop153

[test@hadoop153 flume]$ bin/flume-ng agent --conf conf/ --name a3 --conf-file job/intercepter/flume3.conf -Dflume.root.logger=INFO,console

再启动 hadoop152

[test@hadoop152 flume]$ bin/flume-ng agent --conf conf/ --name a2 --conf-file job/intercepter/flume2.conf -Dflume.root.logger=INFO,console

最后启动 hadoop151

[test@hadoop151 flume]$ bin/flume-ng agent --conf conf/ --name a1 --conf-file job/intercepter/flume1.conf 

4.6 在 hadoop151 上使用 netcat 发送数据在这里插入图片描述

4.7 观察日志

hadoop152 上:

在这里插入图片描述

hadoop153 上:

在这里插入图片描述
可以发现数字与字母分别打印在两个 shell 中,而不满足的字符,则被过滤掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值