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
结果