一、概述
- Flume是Apache提供的开源的、分布式的、可靠的日志收集系统
- 能够有效的收集、聚合、传输大量的日志数据
- Flume有2个版本:Flume-og(Flume0.9x)和Flume-ng(Flume1.X)。Flume-og和Flume-ng不兼容
二.Flume的特性
- 可靠性:事务型的数据传递,保证数据的可靠性。一个日志交给flume来处理,不会出现此日志丢失或未被处理的情况
- 可恢复性:通道可以以内存或文件的方式实现,内存更快,但不可恢复。文件较慢但提供了可恢复性
三、基本概念
- Event:将收集到的每一条日志封装成一个Event对象 - 在Flume中流动的是Event。Event的格式采用了json格式来定义的,这个json串中包含了2个部分:headers和body
- Flume中的组件是以Agent形式来出现的。Agent包含三个部分:Source、Channel和Sink
- Source:从源头采集数据
- Channel:临时存储数据
- Sink:将数据发往目的地
四、自定义 --- 扩展
如果Flume中提供的Source不符合当前场景,需要自定义Source。如果在Flume中自定义Source,那么需要确定Source的数据获取方式:PollableSource(主动拉取数据)和EventDrivenSource(事件驱动方式)
1.创建元数据
2.代码
public class AuthSource extends AbstractSource
implements Configurable, Source, EventDrivenSource {
private String path;
private ExecutorService es;
// 获取配置文件中的属性
@Override
public void configure(Context context) {
path = context.getString("file");
}
// 启动Source
@Override
public synchronized void start() {
// 获取Channel
ChannelProcessor cp = this.getChannelProcessor();
es = Executors.newFixedThreadPool(10);
es.submit(new FileThread(path, cp));
}
@Override
public synchronized void stop() {
es.shutdown();
}
}
class FileThread implements Runnable {
private BufferedReader br;
private ChannelProcessor cp;
public FileThread(String path, ChannelProcessor cp) {
this.cp = cp;
File file = new File(path);
if (file.isFile())
try {
br = new BufferedReader(new FileReader(path));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
// 读取数据
String name = br.readLine();
if (name == null)
break;
String age = br.readLine();
String description = br.readLine();
// 定义头部信息
Map<String, String> headers = new HashMap<>();
headers.put("name", name);
headers.put("age", age);
// 创建一个Event对象
Event e = EventBuilder.withBody(description.getBytes(), headers);
// 将event放到通道中
cp.processEvent(e);
} catch (IOException e) {
e.printStackTrace();
}
}
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.打成jar包上传到flume的lib目录下
auth.jar