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