flume自定义拦截器处理event

收集的数据为json格式,需要解析成以|分隔的字符串

参考:http://blog.csdn.net/zfszhangyuan/article/details/52449060

pom:

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

代码:

package flume;

import com.google.common.base.Charsets;
import com.google.common.collect.Lists;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;

import java.text.SimpleDateFormat;
import java.util.List;


public class LogAnalysis implements Interceptor {

    private LogAnalysis() {
    }

    @Override
    public void initialize() {
        // NO-OP...  
    }

    @Override
    public void close() {
        // NO-OP...  
    }

    @Override
    public Event intercept(Event event) {
        /**event:
         * [{"body":'{"f_time":1515058629,"f_server_lan_address":"","f_server_wan_address":"101.37.75.140","f_params":{"f_dept":"2","f_character_grade":"20","f_server_address_id":"77","f_character_ip":"123.55.182.138","f_character_name":"横扫八荒","f_opt_type":"3","f_yuanbao_after":"205","f_channel":"9","f_sid":"77","f_yunying_id":"989c9961d30c5b76c79d2f9ba6410512","f_character_id":"77002097","f_yuanbao":"10"},"f_game_id":1,"f_log_name":"log_jinbi"}'}]
         */
        String body = new String(event.getBody(), Charsets.UTF_8);
        SimpleDateFormat timeFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str = body.replaceAll("\\{|\\}", "");
        StringBuffer bodymid = new StringBuffer();
        String[] list1 = str.split(",");
        /**
         * f_time是PHP时间戳(9位),加三个0可以转换为时间
         */
        String f_time = list1[0].split(":")[1];
        long l = Long.parseLong(f_time + "000");
        String time = timeFormater.format(l);
        for (String str1 : list1) {
            String[] list = str1.split(":");
            bodymid.append("|" + list[1].replace("\"", ""));
        }
        String bodyoutput = bodymid.toString().replace(f_time, time).substring(1);
        event.setBody(bodyoutput.getBytes());
        return event;
    }

    @Override
    public List<Event> intercept(List<Event> events) {
        List<Event> intercepted = Lists.newArrayListWithCapacity(events.size());
        for (Event event : events) {
            Event interceptedEvent = intercept(event);
            if (interceptedEvent != null) {
                intercepted.add(interceptedEvent);
            }
        }
        return intercepted;
    }

    public static class Builder implements Interceptor.Builder {
        //使用Builder初始化Interceptor  
        @Override
        public Interceptor build() {
            return new LogAnalysis();
        }

        @Override
        public void configure(Context context) {

        }
    }
}  

conf:

#flume flile
agent.sources=httpSrc
agent.channels=c1
agent.sinks=k1




agent.sources.httpSrc.type=http
agent.sources.httpSrc.bind=172.16.90.62
agent.sources.httpSrc.port=55555
agent.sources.httpSrc.channels=c1



agent.sources.httpSrc.interceptors = i2
agent.sources.httpSrc.interceptors.i2.type = flume.LogAnalysis$Builder
agent.sources.httpSrc.interceptors.i2.regex = ([^+]*)log_
agent.sources.httpSrc.interceptors.i2.serializers = s1 s2 
agent.sources.httpSrc.interceptors.i2.serializers.s1.name = data
agent.sources.httpSrc.interceptors.i2.serializers.s2.name = type

agent.channels.c1.type=memory
agent.channels.c1.capacity=100000
agent.channels.c1.transactionCapacity=100000


agent.sinks.k1.type = flume.MySinks
agent.sinks.k1.sink.directory=/data/flume_data/
agent.sinks.k1.channel=c1
agent.sinks.k1.sink.rollInterval=300


2017-05-18 03:40:05||120.27.248.131|f_dept|66|-245486|37|182.134.22.141|冷冷 雪儿|1|17|0|37|2bb3fd5f623eaa2f|37000270|1|log_jinbi
因为是json的格式可以使用阿里fastjson处理,但是我们要求各个字段的顺序不能打乱,只能以普通字符串处理,如果不要求顺序可以使用fastjson处理

public Event intercept(Event event):此方法是针对单个event处理,其它业务处理也可以写在此方法体内

public List<Event> intercept(List<Event> events) :此方法是针对批event处理,其它业务处理也可以写在此方法体内


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 ``` --- ### 总结 如果以上步骤仍然未能解决问题,请逐一验证每个环节是否存在疏漏,并结合实际需求优化实现逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一天两晒网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值