Java 代码实现自定义flume Interceptor

custom.txt文件如下,存放在虚拟机/opt/datas文件夹中

1,张三,,40
2,李三,,4
3,张四,,14
4,李三三,,44

任务需求:需要把性别一列“男”转换为“1”,“女”转换为“2”,其他值转换为“0”。

创建maven项目,在pom.xml文件中导入flume依赖包

<!-- https://mvnrepository.com/artifact/org.apache.flume/flume-ng-core -->
<dependency>
  <groupId>org.apache.flume</groupId>
  <artifactId>flume-ng-core</artifactId>
  <version>1.6.0</version>
</dependency>

创建拦截器类CustomInterceptor 实现Interceptor接口 (org.apache.flume.interceptor包中),实现intercept方法,自定义处理操作;在类中创建内部类Builder 实现接口Interceptor.Builder,在builder方法中创建返回CustomInterceptor 对象。

package com.flume.interceptor;
import org.apache.flume.interceptor.Interceptor
public class CustomInterceptor implements Interceptor {
    @Override
    public void initialize() {

    }
    //单个事件拦截
    @Override
    public Event intercept(Event event) {
        byte[] body = event.getBody();//事件body
        String line = new String(body);//1,张三,男,40
        String[] sps = line.split(",");
        switch (sps[2]){
            case "男":sps[2]="1";
                break;
            case "女":sps[2]="2";
                break;
            default:sps[2]="0";
                break;
        }
        //完整事件信息组合
        String newStr=sps[0]+","+sps[1]+","+sps[2]+","+sps[3];
        //事件body
        event.setBody(newStr.getBytes());
        return event;
    }

    //批量事件拦截
    @Override
    public List<Event> intercept(List<Event> list) {
        for (Event event:list){
            intercept(event);
        }
        return list;
    }

    @Override
    public void close() {

    }
    //静态内部类
    public static class Builder implements Interceptor.Builder{

        @Override
        public Interceptor build() {
            return new CustomInterceptor();
        }

        @Override
        public void configure(Context context) {

        }
    }

修改pom.xml文件中为如下所示,打胖包。“clean”->“package”,在target中找到myintc.jar复制到linux的flume安装目录的lib中。

  <build>
    <finalName>myintc</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>2.3.2</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <configuration>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
              <manifest>
                <mainClass>com.flume.interceptor.App</mainClass><!--这里改成自己的主类位置-->
              </manifest>
            </archive>
          </configuration>
          <executions>
            <execution>
              <id>make-assembly</id>
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

创建配置文件/opt/flumeconf/flume_interceptor.properties

a4.channels=c4
a4.sources=s4
a4.sinks=k4

a4.sources.s4.type=spooldir
a4.sources.s4.spoolDir=/opt/datas
a4.sources.s4.interceptors=myintec		//过滤器名
a4.sources.s4.interceptors.myintec.type=com.flume.interceptor.CustomInterceptor$Builder		//拦截器对象创建 类路径$内部类名

a4.channels.c4.type=memory

a4.sinks.k4.type=logger

a4.sinks.k4.channel=c4
a4.sources.s4.channels=c4

测试拦截器,信息以日志格式输出控制台

flume-ng agent -n a4 -c conf -f /opt/flumeconf/conf_0806_interceptor.properties -Dflume.root.logger=INFO,console
=====================================================================
20/08/06 14:24:45 INFO sink.LoggerSink: Event: { headers:{} body: 31 2C E5 BC A0 E4 B8 89 2C 31 2C 34 30 0D       1,......,1,40. }
20/08/06 14:24:45 INFO sink.LoggerSink: Event: { headers:{} body: 32 2C E6 9D 8E E4 B8 89 2C 32 2C 34 0D          2,......,2,4. }
20/08/06 14:24:45 INFO sink.LoggerSink: Event: { headers:{} body: 33 2C E5 BC A0 E5 9B 9B 2C 31 2C 31 34 0D       3,......,1,14. }
20/08/06 14:24:45 INFO sink.LoggerSink: Event: { headers:{} body: 34 2C E6 9D 8E E4 B8 89 E4 B8 89 2C 32 2C 34 34 4,.........,2,44 }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中使用Flume自定义Handler,你需要按照以下步骤进行操作: 1. 首先,在你的Java项目中引入Flume的依赖。在你的pom.xml文件中添加以下代码: ```xml <dependency> <groupId>org.apache.flume</groupId> <artifactId>flume-ng-core</artifactId> <version>1.7.0</version> </dependency> <dependency> <groupId>org.apache.flume</groupId> <artifactId>flume-ng-configuration</artifactId> <version>1.7.0</version> </dependency> ``` 2. 创建一个自定义的Handler类,并实现HTTPSourceHandler接口。这个接口要求你的处理程序接收一个HttpServletRequest对象,并返回一个flume事件列表。以下是一个示例代码: ```java import org.apache.flume.Context; import org.apache.flume.Event; import org.apache.flume.event.SimpleEvent; import org.apache.flume.source.http.HTTPSourceHandler; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; public class CustomHandler implements HTTPSourceHandler { @Override public List<Event> getEvents(HttpServletRequest request) throws Exception { // 从HttpServletRequest中获取数据,并将其转换为flume事件 String data = request.getParameter("data"); Event event = new SimpleEvent(); event.setBody(data.getBytes()); List<Event> events = new ArrayList<>(); events.add(event); return events; } @Override public void configure(Context context) { // 配置处理程序,如果需要的话 } } ``` 3. 在Flume的配置文件中指定你的自定义Handler。在你的flume配置文件中,找到HTTPSource的配置部分,并将handler属性设置为你的自定义Handler类的全限定名。以下是一个示例配置: ```properties agent.sources = http-source agent.sources.http-source.type = org.apache.flume.source.http.HTTPSource agent.sources.http-source.handler = com.example.CustomHandler ``` 4. 启动Flume agent并测试你的自定义Handler。启动Flume agent后,你可以使用HTTP POST请求将数据发送到Flume的HTTPSource,并验证你的自定义Handler是否按预期工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值