Flume的作用:

之前学习了Hadoop的hdfs(分布式文件储存系统),MapReduce(分布式计算)。今天学习Flume日志系统,它的作用的是可以对日志进行收集,存储,传输。

Flume中记录日志信息的载体Event:

  1. Event由两部分——headers和body
  2. Flume会将收集到每一条日志封装成一个Event对象 ,所以一个Event就是一条日志
  3. 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.单级流动:

flume 读取文件夹下全部文件_数据


2.多级流动

flume 读取文件夹下全部文件_flume_02


3.扇入流动

flume 读取文件夹下全部文件_数据_03


4.扇出流动

flume 读取文件夹下全部文件_flume_04