Flume自定义拦截器Interceptors

本文介绍如何使用Java实现自定义的Flume拦截器,用于处理数据流中的性别字段,将“男”替换为“1”,“女”替换为“0”,其他默认为“2”。文章详细展示了CustomInterceptor类的编写,包括初始化、事件拦截、列表拦截及关闭方法。并通过实例演示了如何在Flume配置中应用此自定义拦截器。

用java实现一个自定义拦截器

在这里插入图片描述
将上述图片的性别男设置为1,女设置为0,其他默认为2

java自定义拦截器

pom:添加flume-ng-core依赖
在这里插入图片描述
CustomInterceptor类:

import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.util.List;

public class CustomInterceptor implements Interceptor {
    @Override
    public void initialize() {

    }

    @Override
    public Event intercept(Event event) {
        byte[] body = event.getBody();
        String line = new String(body);    // 1,张三,男,40
        String[] sps = line.split(",");
        switch (sps[2]) {
            case "男":
                sps[2] = "1";
                break;
            case "女":
                sps[2] = "0";
                break;
            default:
                sps[2] = "2";
        }
        String newStr = sps[0]+","+sps[1]+","+sps[2]+","+sps[3];
        event.setBody(newStr.getBytes());
        return event;
    }

    @Override
    public List<Event> intercept(List<Event> list) {
        for (Event event:list) {
            intercept(event);
        }
        return list;
    }

    @Override
    public void close() {

    }

    public static class Builder implements Interceptor.Builder {
        @Override
        public Interceptor build() {
            return new CustomInterceptor();
        }

        @Override
        public void configure(Context context) {

        }
    }
}

打包

打jar包,放入flume的lib里面 /opt/soft/flume160/lib

运行

编辑conf配置

a4.channels=c4
a4.sources=s4
a4.sinks=k4

a4.sources.s4.type=spooldir
a4.sources.s4.spoolDir=/opt/datas
a4.sources.s4.interceptors=myinterc
a4.sources.s4.interceptors.myinterc.type=com.njbdqn.myinterceptors.CustomInterceptor$Builder

a4.channels.c4.type=memory

a4.sinks.k4.type=logger

a4.sinks.k4.channel=c4
a4.sources.s4.channels=c4

kkk.txt放入datas目录下

结果

flume-ng agent -n a4 -c conf -f /opt/flumeconf/conf_0806_custconf.properties -Dflume.root.logger=INFO,console

在这里插入图片描述

Flume 自定义拦截器失效可能是由多种原因引起的。下面是一些常见的排查方向以及解决方法: ### 可能的原因及解决方案 #### 1. **配置文件错误** - Flume拦截器需要在 `agent.conf` 文件中正确定义并加载。 - 检查是否正确添加了自定义拦截器的完整路径(包括包名)。例如: ```properties agent.sources.r1.interceptors = i1 agent.sources.r1.interceptors.i1.type = com.example.CustomInterceptor$Builder ``` - 确保 `type` 属性指向正确的构建器类 (`CustomInterceptor$Builder`)。 #### 2. **构造函数未按规范编写** - 如果自定义拦截器不符合 Flume 的设计模式,则可能导致无法正常加载。 - 确保你的自定义拦截器有一个静态内部类 `Builder` 并实现了必要的接口方法,如 `build()` 和设置参数的方法等。 #### 示例代码: ```java public class CustomInterceptor implements Interceptor { @Override public Event intercept(Event event) { ... } @Override public List<Event> intercept(List<Event> events) { ... } @Override public void close() { ... } // 静态 Builder 类 public static class Builder implements Interceptor.Builder { private String param; @Override public Interceptor build() { return new CustomInterceptor(); } @Override public void configure(Context context) { this.param = context.getString("param"); } } } ``` #### 3. **依赖冲突或类找不到** - 如果你将自定义拦截器打包成 JAR 文件并在运行时引入到 Flume 中,请确认该 JAR 已成功加入 Classpath。 - 使用命令检查 Flume 是否加载了所有所需库: ```bash java -cp /path/to/flume/lib/* org.apache.flume.node.Application --conf /path/to/conf/ ``` #### 4. **日志级别不足** - 默认情况下,Flume 日志可能不会详细显示某些失败信息。 - 将 Flume 的日志级别调整为 DEBUG 或 TRACE 来捕获更多细节,并查看是否有异常抛出: ```properties log4j.rootLogger=DEBUG, consoleAppender ``` --- ### 总结 如果以上步骤仍然未能解决问题,请逐一验证每个环节是否存在疏漏,并结合实际需求优化实现逻辑。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值