flume自定义拦截器和自定义source

本文介绍了如何在Flume中实现自定义拦截器和source。拦截器部分讲解了静态拦截器和时间戳拦截器,重点在于创建实现Interceptor接口的类并配置flume.conf。自定义source部分说明了需要继承AbstractSource并实现Configurable和EventDrivenSource或PollableSource接口,同时提到了所需的Flume相关jar包和配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拦截器

拦截器是处理从source到channel的的数据处理

  1. 静态拦截器:
    #指定拦截器的名字

       a1.sources.r1.interceptors = i1
        a1.sources.r1.interceptors.i1.type = static
        #指定键的名称
        a1.sources.r1.interceptors.i1.key = type
        #指定值得名称
        a1.sources.r1.interceptors.i1.value = access
    

    可以通过%{type}获取对应的值

  2. 时间戳拦截器:

     ```
     a1.sinks.k1.hdfs.useLocalTimeStamp = true
     ```
    
  3. 自定义拦截器:
    流程:

    • 新建一个类,实现Interceptor接口,重写intercept(Event event)方法

    • 新建一个类,实现Interceptor.Builder接口,重写configure(Context context)和build()方法

    • 打成jar包放到flume的lib目录下

    • 编写相应的flume.conf文件,将type值使用类的全限定名指定我们的拦截器。如果有自定义属性,需要配置该自定义属性。

      #加入的依赖
      <dependencies>
          <dependency>
              <groupId>org.apache.flume</groupId>
              <artifactId>flume-ng-sdk</artifactId>
              <version>1.8.0</version>
          </dependency>
          <dependency>
              <groupId>org.apache.flume</groupId>
              <artifactId>flume-ng-core</artifactId>
              <version>1.8.0</version>
          </dependency>
      </dependencies>
      
      /**
       * 自定义拦截器,实现Interceptor接口,并且实现其抽象方法
       */
      public class CustomInterceptor implements Interceptor {
       
          //自定义拦截器参数,用来接收自定义拦截器flume配置参数
          private static String param = "";
       
       
          /**
           * 拦截器构造方法,在自定义拦截器静态内部类的build方法中调用,用来创建自定义拦截器对象。
           */
          public CustomInterceptor() {
       
          }
       
       
          /**
           * 该方法用来初始化拦截器,在拦截器的构造方法执行之后执行,也就是创建完拦截器对象之后执行
           */
          @Override
          public void initialize() {
      
          }
       
          /**
           * 用来处理每一个event对象,该方法不会被系统自动调用,一般在 List<Event> intercept(List<Event> events) 方法内部调用。
           *
           * @param event
           * @return
           */
          @Override
          public Event intercept(Event event) {
              
              /*
              这里编写event的处理代码
               */
              return event;
          }
       
          /**
           * 用来处理一批event对象集合,集合大小与flume启动配置有关,和transactionCapacity大小保持一致。一般直接调用 Event intercept(Event event) 处理每一个event数据。
           *
           * @param events
           * @return
           */
          @Override
          public List<Event> intercept(List<Event> events) {
       
              /*
              这里编写对于event对象集合的处理代码,一般都是遍历event的对象集合,对于每一个event对象,调用 Event intercept(Event event) 方法,然后根据返回值是否为null,
              来将其添加到新的集合中。
               */
              List<Event> results = new ArrayList<>();
              Event event;
              for (Event e : events) {
                  event = intercept(e);
                  if (event != null) {
                      results.add(event);
                  }
              }
              return results;
          }
       
          /**
           * 该方法主要用来销毁拦截器对象值执行,一般是一些释放资源的处理
           */
          @Override
          public void close() {
             
          }
       
          /**
           * 通过该静态内部类来创建自定义对象供flume使用,实现Interceptor.Builder接口,并实现其抽象方法
           */
          public static class Builder implements Interceptor.Builder {
       
              /**
               * 该方法主要用来返回创建的自定义类拦截器对象
               *
               * @return
               */
              @Override
              public Interceptor build() {
                
                  return new CustomInterceptor();
              }
       
              /**
               * 用来接收flume配置自定义拦截器参数
               *
               * @param context 通过该对象可以获取flume配置自定义拦截器的参数
               */
              @Override
              public void configure(Context context) {         
                  /*
                  通过调用context对象的getString方法来获取flume配置自定义拦截器的参数,方法参数要和自定义拦截器配置中的参数保持一致+
                   */
                  param = context.getString("param");
              }
          }
      }
      

配置flume

	```
	a1.sources.r1.interceptors =i1
	a1.sources.r1.interceptors.i1.type =cn.itcast.CustomInterceptor
	a1.sources.r1.interceptors.i1.param=ss实现自定义的source
	```

实现自定义的source

  • 创建一个类,继承自 AbstractSource 并实现 Configurable 和( EventDrivenSource 或者PollableSource )

  • PollableSource是类似于jms类的消息进行推送,要外部驱动来确定source中是否有消息可以使用,EventDrivenSource 不需要外部驱动,得自己实现事件驱动机制

  • 实现相关方法,以下是简单的一个生成序列的source

  • 需要的jar包flume-ng-configuration-1.7.0.jar, flume-ng-core-1.7.0.jar ,flume-ng-sdk-1.7.0.jar

      public class MySource extends AbstractSource implements Configurable,PollableSource {
    
      /**
      *假设没有获取到数据,线程休眠时间,会有一个累计次数与累计次数相乘和最大休眠时间比较
      */
      @Override
      public long getBackOffSleepIncrement() {
          return 0;
      }
      /**
      *假设没有获取到数据,线程休眠的最大时间
      */
      @Override
      public long getMaxBackOffSleepInterval() {
          return 0;
      }
      /**
      *具体执行的逻辑,返回值status只有PollableSource 才需要,记录了每次拉取的状态,出现异常记为BACKOFF,成功记为READY
      */
      @Override
      public Status process() throws EventDeliveryException {
         
      }
      /**
      *configure方法主要是放置一些配置信息,在这里把需要的变量定位全局变量
      */
      @Override
      public void configure(Context arg0) {
    
      }
      }
    

将包打包放到lib下
flume的配置:

# 指定Flume source类的路径(要监听的路径)

a1.sources.r1.type = com.harderxin.flume.test.MySource
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值