• Flume 自定义拦截器


    Apache Flume是一个分布式的、可靠和易用的日志收集系统,用于将大量日志数据从许多不同的源进行收集、聚合,最终移动到一个集中的数据中心进行存储。

    Flume的使用不仅仅限于日志数据聚合,由于数据源是可定制的,Flume可以用于传输大量数据,包括但不限于网络流量数据、社交媒体生成的数据、电子邮件消息和几乎所有可能的数据源。

    拦 截 器

    Flume在拦截器的帮助下,可以修改或删除正在传送中的event。拦截器是一些实现org.apache.flume.interceptor.Interceptor接口的类,功能类似于Java Servlet中的FilterServlet。

    Flume拦截器可以在配置文件的Source组件中进行设置,支持给一个Source组件设置多个拦截器,多个拦截器使用空格连接在一起,根据配置顺序依次执行。如果某个拦截器需要删除event,当event经过该拦截器时,该event会被过滤掉,不会返回给下一个拦截器。

    自定义拦截器

    对于一些特殊的业务,例如对日志数据进行清洗后存入数据库,或者需要重写event body的内容(Kafka只能收到Flume消息的body部分,不能收到header部分),Flume内置的拦截器往往不能满足我们的需求,这时就需要我们自定义拦截器。

    依赖:

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

    编写拦截器类:

    自定义拦截器类需要实现Interceptor接口并重写intercept()方法。

    package com.xc.xcspringboot.test;
    
    import org.apache.commons.codec.Charsets;
    import org.apache.flume.Context;
    import org.apache.flume.Event;
    import org.apache.flume.interceptor.Interceptor;
    
    import java.util.List;
    
    /**
     * 自定义拦截器类,修改event body体,将本机IP添加到event body体的前面
     */
    public class MyFlumeInterceptor implements Interceptor {
    
        private String hostIP = null;// 自定义属性 hostIP
    
        // 私有构造函数,仅在内部类MyBuilder中可以对其实例化
        private MyFlumeInterceptor(String hostIP) {
            this.hostIP = hostIP;
        }
    
        // 修改event的body体
        public Event intercept(Event event) {
            StringBuilder builder = new StringBuilder();
            // 获得body体字节数组
            byte[] byteBody = event.getBody();
            // 将body体转为字符串
            String body = new String(byteBody, Charsets.UTF_8);
            // 拼接IP与body体,形成新body
            builder.append("ip:" + hostIP);
            builder.append(";body:" + body);
            byte[] newBody = builder.toString().trim().getBytes();
            // 重新设置body体
            event.setBody(newBody);
            System.out.println("拼接后的body信息:" + builder.toString().trim());
            return event;
        }
    
        public List<Event> intercept(List<Event> events) {
            for (Event event : events) {
                intercept(event);
            }
            return events;
        }
    
        /**
         * 定义内部类MyBuilder,用于构建自定义拦截器类MyFlumeInterceptor的实例,
         * 并获取Flume配置文件中自定义的拦截器属性值,将值传给自定义类MyFlumeInterceptor
         */
        public static class MyBuilder implements Builder {
    
            private String hostIP = null;
    
            public void configure(Context context) {
                // 获取Flume配置文件中设置的自定义属性值,字符串“hostIP”需与配置文件中设置的属性hostIP一致
                String hostIP = context.getString("hostIP");
                this.hostIP = hostIP;
            }
    
            public Interceptor build() {
                // 实例化自定义拦截器类并传入自定义属性
                return new MyFlumeInterceptor(hostIP);
            }
        }
    
        public void close() {
        }
    
        public void initialize() {
        }
    
    }
    

    书籍:Hadoop大数据技术开发实战 12.6 拦 截 器

    https://gitee.com/caoyeoo0/xc-springboot/blob/hadoopApi/src/main/java/com/xc/xcspringboot/test/MyFlumeInterceptor.java

  • 相关阅读:
    Linux内核分析— —操作系统是如何工作的(20135213林涵锦)
    【BARTS计划】【Share_Week1】社交产品思考
    【BARTS计划】【Tips_Week1】20190331更新
    【BARTS计划】【Review_Week1】Google Docs 成为青少年们喜爱的聊天 app
    【学习博客】Python学习初体验
    《构建之法》读书笔记5
    《构建之法》8&16
    《构建之法》读书笔记4
    《构建之法》读书笔记3
    《构建之法》读书笔记2
  • 原文地址:https://www.cnblogs.com/ooo0/p/16893001.html
Copyright © 2020-2023  润新知