Flume(十二)自定义source

source 是负责接收数据到 Flume Agent 的组件。

Source 组件可以处理各种类型、各种格式的日志数据,包括 avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。

官方提供的 source 类型已经很多,但是有时候并不能满足实际开发当中的需求,此时我们就需要根据实际需求自定义某些 source。

官方也提供了自定义 source 的接口:Flume 1.11.0 Developer Guide — Apache Flume

根据官方说明自定义 Source 需要继承 AbstractSource 类并实现 Configurable 和 PollableSource 接口。

PollableSource (轮训拉取)或者EventDrivenSource (事件驱动)

两者的区别

PollableSource是通过线程不断去调用process方法,主动拉取消息

EventDrivenSource是需要触发一个调用机制,即被动等待。

我们还需要实现Configurable接口,获取指定的属性如配置文件的端口号等

案例,实现自定义sequencesource ,步长step,和最大值自定义

步骤1,引入pom文件

 <dependencies>
        <dependency>
            <groupId>org.apache.flume</groupId>
            <artifactId>flume-ng-core</artifactId>
            <version>1.11.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flume</groupId>
            <artifactId>flume-ng-sdk</artifactId>
            <version>1.11.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flume</groupId>
            <artifactId>flume-ng-configuration</artifactId>
            <version>1.11.0</version>
        </dependency>
    </dependencies>

步骤2 JAVA代码

package com.st;

import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.EventDrivenSource;
import org.apache.flume.channel.ChannelProcessor;
import org.apache.flume.conf.Configurable;
import org.apache.flume.event.EventBuilder;
import org.apache.flume.source.AbstractSource;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 模拟seqencesource ,既能制定步长,又能制定范围
 */
public class MyEventSource extends AbstractSource implements EventDrivenSource,
        Configurable {
    private long end ;
    private long step;
    private ExecutorService es;
   private ChannelProcessor cp;

    @Override
    public void configure(Context context) {
        //读取配置文件中配置的值
         end =    context.getLong("end",Long.MAX_VALUE);
         step =    context.getLong("step",1l);

    }

    @Override
    public synchronized void start() {

      es= Executors.newFixedThreadPool(5);
        cp =  this.getChannelProcessor();
        es.submit(new Add(end,step,cp));

    }

    @Override
    public synchronized void stop() {
        if(es!=null) es.shutdown();
    }
}
class Add implements Runnable{
    private long end ;
private ChannelProcessor cp;
    public Add(long end, long step,ChannelProcessor cp) {
        this.end = end;
        this.step = step;
        this.cp = cp;
    }

    private long step;
    @Override
    public void run() {
        for (long i = 0; i <end ; i+=step) {
            byte[] body = (i+"").getBytes(StandardCharsets.UTF_8);
            Map<String,String> headers = new HashMap<String,String>();
            headers.put("time",System.currentTimeMillis()+"");
            Event event = EventBuilder.withBody(body,headers);
            cp.processEvent(event);
        }

    }
}

步骤3,打成jar包,上传到服务器的lib目录下

步骤4,编写配置文件

a1.sources=r1
a1.channels=c1
a1.sinks=k1

a1.sources.r1.type=com.st.MyEventSource
a1.sources.r1.end=100

a1.channels.c1.type=memory
a1.sinks.k1.type=logger


a1.sources.r1.channels=c1

a1.sinks.k1.channel=c1   

步骤5.启动FLUME

flume-ng agent -c $FLUME_HOME/conf -n a1  -f $FLUME_HOME/selfsource.conf  -Dflume.root.logger=INFO,console

结果

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Allen019

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

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

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

打赏作者

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

抵扣说明:

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

余额充值