Flume自定义拦截器的使用

第1章 简介

在生产环境中,系统应用的日志千奇百怪,千万不能将这些乱七八糟的数据上传到HDFS上之后,再来做数据的清洗整理。通常的做法是,我们再上传HDFS之前,在Flume采集传输的时候,就将日志进行一层过滤和整理,经过这一层整理之后,我们再将数据上传到HDFS,以减少在HDFS上清洗数据的频次。

这里,我们就需要用到Flume拦截器。Flume有很多预置好的拦截器,直接配置Agent即可使用,详见官方手册:https://flume.apache.org/FlumeUserGuide.html#flume-interceptors

本章主要介绍自定义拦截器的基本使用方法。

第2章 创建Maven项目

新建一个Maven项目,在pom.xml添加flume依赖

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

建立class继承Interceptor接口,在intercept方法内对event进行获取并处理,最终返回event即可(注:在Flume中,event是数据传输的对象,是Flume的基本单位),代码如下:

package com.lotemall.interceptor;

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

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class LogFormatInterceptor implements Interceptor {
    public void initialize() {

    }

    public Event intercept(Event event) {
        /**
         * 实现自己对event的逻辑处理,最终返回event(本方法内容仅供参考)。
         */
        if (event == null) return null;

        Map<String, String> headers = event.getHeaders();
        String body = new String(event.getBody());

        if (body.indexOf("content:{") <= 0) return null;

        String date = body.substring(0, 10);
        String country = body.substring(body.indexOf("country") + 10, body.indexOf("area") - 3);
        String area = body.substring(body.indexOf("area") + 7, body.length() - 2);

        event.setBody(String.format("%s,%s,%s", date, country, area).getBytes());
        return event;
    }

    public List<Event> intercept(List<Event> list) {
        List<Event> lst = new ArrayList<Event>();
        Iterator<Event> it = list.iterator();
        while (it.hasNext()) {
            Event event = it.next();
            Event eventSingle = intercept(event);
            if (eventSingle != null) {
                lst.add(eventSingle);
            }
        }
        return lst;
    }

    public void close() {

    }

    public static class Builder implements Interceptor.Builder{
        public Interceptor build() {
            return new LogFormatInterceptor();
        }

        public void configure(Context context) {

        }
    }
}

第3章 打包与使用

将编写好的Maven项目打包成jar包,放置Flume的lib目录下,并修改Agent配置文件,添加自定义拦截器内容:

#Interceptor
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = com.lotemall.interceptor.LogFormatInterceptor$Builder

添加完成后,启动Agent即可生效。

猜你喜欢

转载自blog.csdn.net/dzh284616172/article/details/108090269