Flume的作用:
之前学习了Hadoop的hdfs(分布式文件储存系统),MapReduce(分布式计算)。今天学习Flume日志系统,它的作用的是可以对日志进行收集,存储,传输。
Flume中记录日志信息的载体Event:
- Event由两部分——headers和body
- Flume会将收集到每一条日志封装成一个Event对象 ,所以一个Event就是一条日志
- Event本质上是json串,即Flume将收集到的每一条日志封装了一个个的json,一个json就是一个Event
class Add implements Runnable {
private int step;
private ChannelProcessor cp;
public Add(int step, ChannelProcessor cp) {
this.step = step;
this.cp = cp;
}
@Override
public void run() {
int i = 0;
while (true) {
// 封装body
byte[] body = (i + "").getBytes();
// 封装headers
Map<String, String> headers =
new HashMap<>();
headers.put("time", System.currentTimeMillis() + "");
// 在Flume中,需要将数据封装成Event才能传递
Event e = EventBuilder.withBody(body, headers);
// 将Event对象放到Channel中
cp.processEvent(e);
i += step;
}
}
Flume基本组成结构Agent:
- Source: 用于从数据源来采集数据
AVRO: 接收被AVRO序列化之后的数据,结合AVRO Sink可以实现多级、扇入、扇出流动
Exec: 将一个命令的执行结果作为日志进行收集
SpoolingDirectory:监听指定的目录,如果目录下产生了新的文件,那么会自动的收集新文件中的内容
Netcat:用于监听TCP请求,将TCP请求的内容作为日志进行收集 Sequence
Generator:序列产生器,会不断的产生自增的数字。在实际生产过程中一般是用于测试
HTTP:监听HTTP请求,但是只能监听GET和POST两种请求,然而对GET请求的监听不稳定,所以实际开发中一般只用这个Source来监听POST请求
- Channel: 用于临时存储数据
Memory:内存通道。这个Channel是将数据临时存储到内存中,特点是读写快但是不可靠。如果考虑吞吐量,那么使用MemoryChannel
File:文件通道。这个Channel是将数据临时存储在磁盘中,特点是可靠但是读写速度相对较慢。如果考虑可靠性,那么使用File Channel
JDBC:将数据临时存储在数据库中。理论上而言,读写速度要高于File Channel但是低于Memory Channel。这个Channel目前只支持Derby,基于Derby的特性,所以这个Channel实际生产过程中不使用 Memory
Spillable:内存溢出通道。将数据临时写到内存中,如果内存中的数据量达到指定的条目数,那么不会阻塞而是会把数据记录到磁盘中。但是这个通道到目前一直处于测试状态,到目前为止一直没有投入生产使用,稳定性未知
- Sink: 用于将数据发往目的地
Logger:将数据以日志形式打印到控制台上。为了防止屏幕上被日志占满,所以如果数据超过16个字节,超过的部分不打印
File_roll:将数据写到文件上。如果不指定,默认每隔30s生成一个文件存储数据,会产生大量的小文件
HDFS:将数据收集到HDFS上。在收集的时候,数据在HDFS上的存储有3种方式:文本格式、序列格式、压缩格式。同样,如果不指定,也是每隔30s生成1个小文件,导致HDFS产生大量小文件
AVRO:将数据经过AVRO序列化之后写出,结合AVRO Source可以实现多级、扇入、扇出流动
流动模型:
1.单级流动:
2.多级流动
3.扇入流动
4.扇出流动