Flume自定义Source

Flume自定义Source


1.介绍
Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、 jms、spooling directory、netcat、sequencegenerator、syslog、http、legacy。官方提供的source类型已经很多,但是有时候并不能满足实际开发当中的需求,此时我们就需要根据实际需求自定义某些source。

  • 实现相应方法:
    MySource需要继承AbstractSource类并实现Configurable和PollableSource 接口。
    getBackOffSleepIncrement()//暂不用
    getMaxBackOffSleepInterval()//暂不用
    configure(Context context)//初始化context(读取配置文件内容)
    process()//获取数据封装成event并写入channel,这个方法将被循环调用。
    使用场景:读取MySQL数据或者其他文件系统

代码

import org.apache.flume.Context;
import org.apache.flume.EventDeliveryException;
import org.apache.flume.PollableSource;
import org.apache.flume.conf.Configurable;
import org.apache.flume.event.SimpleEvent;
import org.apache.flume.source.AbstractSource;

public class MySource extends AbstractSource implements Configurable, PollableSource {
     
    //定义首位值
    private String prefix;
    private String subfix;

    /**
     * 接收数据
     * 封装为事件
     * 将事件传给channels
     *
     * @return
     * @throws EventDeliveryException
     */
    @Override
    public Status process() throws EventDeliveryException {
     
        Status status = null;
        //接收数据
        try {
     
            for (int i = 0; i < 5; i++) {
     
                //构建事件对象
                SimpleEvent simpleEvent = new SimpleEvent();
                //给事件设置值
                simpleEvent.setBody((prefix + "--" + i + "--" + subfix).getBytes());
                //传给channels
                getChannelProcessor().processEvent(simpleEvent);
                status = Status.READY;
            }
        } catch (Exception e) {
     
            e.printStackTrace();
            status = Status.BACKOFF;
        }
        try {
     
            Thread.sleep(2000);
        } catch (InterruptedException e) {
     
            e.printStackTrace();
        }
        return status;
    }

    @Override
    public long getBackOffSleepIncrement() {
     
        return 0;
    }

    @Override
    public long getMaxBackOffSleepInterval() {
     
        return 0;
    }

    @Override
    public void configure(Context context) {
     
        //读取配置信息,给前后缀赋值
        //前缀是没有默认值的
        prefix = context.getString("");
        subfix = context.getString("", "123123");
    }
}

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

# 自定义的source的路径
a1.sources.r1.type = flume.MySource
a1.sources.r1.prefix = aa
a1.sources.r1.subfix = bb
# 日志
a1.sinks.k1.type = logger

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

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

你可能感兴趣的:(flume,java,flume,大数据)