Flume Custom Interceptor不工作

时间:2017-03-14 14:24:37

标签: flume

我想通过掩码IP更改数据中的IP地址。这是在"备份"我的Flume代理商的一部分(见下文)。

在此配置中有2个通道:第一个通道将数据转储到HBase,而第二个通道用于备份:

a1.sources = r1 r2
a1.channels = channel1 Backup_channel
a1.sinks = FSink

a1.sources.r1.handler = com.flume.handler.JSONHandler
a1.sources.r1.type = avro
a1.sources.r1.bind = x.x.x.x
a1.sources.r1.port = 10008

a1.sources.r2.handler = com.flume.handler.JSONHandler
a1.sources.r2.type = avro
a1.sources.r2.bind = x.x.x.x
a1.sources.r2.port = 10009
a1.sources.r2.interceptors = i1
a1.sources.r2.interceptors.i1.type = com.flume.interceptor.DcInterceptor

a1.channels.channel1.type = file
a1.channels.channel1.checkpointDir = /root/flume/channels/Livechannel/checkpoint
a1.channels.channel1.dataDirs = /root/flume/channels/Livechannel/data

a1.sinks.FSink.type = hbase
a1.sinks.FSink.table = Temp_Test
a1.sinks.FSink.batchSize = 300
a1.sinks.FSink.columnFamily = T
a1.sinks.FSink.serializer = com.flume.sink.TestTP

a1.sources.r1.channels = channel1 
a1.sources.r2.channels = Backup_channel

a1.channels.Backup_channel.type = file
a1.channels.Backup_channel.checkpointDir = /data/disk/flume/backup/checkpoint
a1.channels.Backup_channel.dataDirs = /data/disk/flume/backup/data

a1.sinks.FSink.channel = channel1

以下是我的自定义Java拦截器代码。它实现了拦截方法,该方法从正文中获取IP地址,计算其IP掩码,然后将其添加到正文中。但不知怎的,它不起作用:

public class DcInterceptor implements Interceptor {
    private byte[] jsonTestBeans;

    private final Type listType = new TypeToken < List < TestBeans >> () {}.getType();

    @Override
    public void close() {
        // TODO Auto-generated method stub

    }

    @Override
    public void initialize() {
        // TODO Auto-generated method stub
        new Logger();
    }

    @Override
    public Event intercept(Event event) {
        // TODO Auto-generated method stub
        List < Row > actions = new ArrayList < Row > ();
        this.jsonTestBeans = event.getBody();
        Logger.logger.debug("In Interceptor");
        System.out.println("In Interceptor");
        Gson _Gson = new Gson();
        String jsonstr = "";
        try {
            jsonstr = new String(jsonTestBeans, "UTF-8");
        } catch (Exception e) {
            // TODO: handle exception
            Logger.logger.error(e.getMessage() + "In Interceptor");
            jsonstr = new String(jsonTestBeans);
        }
        List < TestBeans > TestBeanss = _Gson.fromJson(jsonstr, listType);
        System.out.println("Json String :" + jsonstr);
        List < String > gTouch = new ArrayList < String > ();
        for (TestBeans TestBeans: TestBeanss) {
            String str = TestBeans.getIp();
            Logger.logger.debug("IP  : " + str);
            String st = (str.substring(0, str.lastIndexOf(".") + 1) + "x");
            Logger.logger.debug("Mask IP  : " + st);
            TestBeans.setRemoteIp(st);
        }
        event.setBody(_Gson.toJson(TestBeanss).getBytes());
        Logger.logger.debug("Interceptor Ends");
        return event;
    }

    @Override
    public List < Event > intercept(List < Event > events) {
        // TODO Auto-generated method stub
        System.out.println("In List Interceptor");
        Logger.logger.debug("In List Interceptor");
        for (Event event: events) {
            intercept(event);
        }
        return events;
    }

    public static class CounterInterceptorBuilder implements Interceptor.Builder {

        private Context ctx;

        @Override
        public Interceptor build() {
            Logger.logger.debug("In Interceptor Build");
            System.out.println("In Build Interceptor");
            return new DcInterceptor();
        }

        @Override
        public void configure(Context context) {
            this.ctx = context;
        }

    }

1 个答案:

答案 0 :(得分:0)

至少,我可以看到:

  • 关于拦截器的配置行是指名为ECircleTp_Test的代理,而配置的其余部分引用a1
  • 您已配置com.flume.interceptor.DcInterceptor2,但您开发的拦截器类名为DcInterceptor(没有最终2)。
  • 您已将com.flume.interceptor.DcInterceptor2配置为自定义拦截器的完全限定类名。尽管如此,拦截器的代码并未声明DcInterceptor(2)类的任何包。