在使用flume收集数据时,有时候需要我们自定义source,而官方给的案例,有时也不能满足我们的需要,下面的案例是仿照源码的架构编写的。
下面的案例是:自定义source,用kafka代替channel,因为我们的目标就是,通过flume将数据采集到kafka,这样省去了从channel到sink的过程,提升了效率,而自定义source是为了防止重复传递数据。
代码如下,在代码中有备注解释:
package DataCollect;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
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.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.Charset;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/*
*自定义source,用来保证不重复消费
* 原始日志文件
* 偏移量文件
* 编码格式
* 睡眠时间
* */
/*
* flume1.6及以前版本
* 如果想监控目录中的多个文件
* 文件的目录
* Filelisten类
* 拿出改名字的文件名
* 变化的文件
* 删除的文件
* 新增的文件
* */
//要继承抽象的AbstractSource类,然后要实现EventDrivenSource、Configurable接口
public class MySource extends AbstractSource implements EventDrivenSource, Configurable {
//定义成员属性
//定义原始文件路径
private String filepath;
//定义偏移量文件路径
private String offsetpath;
//定义编码集
private String charset;
//定义间隔时间
private Long interval;
//定义线程池
private ExecutorService executor;
//filerunner对象
private fileRunner fileRunner;
//加载采集方案(配置文件)
//利用context取出配置文件中的各种定义信息
public void configure(Context context) {
//加载原始日志文件
filepath = context.getString("filepath");
//加载偏移量文件
offsetpath = context.getString("offsetpath")