什么是Flume

Flume 是一个高可用,高可靠,分布式的海量日志采集、聚合和传输的系统
image.png
Flume中最简单的部署单元是Flume Agent,Agent是一个Java应用程序
Flume Agent中包含了三个重要的组件,Source,Channel,Sink。
数据在组件传输的单位是Event。

Flume的特性

1、它有一个简单、灵活的基于流的数据流结构。
2、具有故障转移机制和负载均衡机制。
3、使用了一个简单的可扩展的数据模型(source、channel、sink)。

Flume高级应用场景

多路复用流

Flume支持多路复用数据流到一个或多个目的地。这是通过使用一个流的[多路复用器](multiplexer)来实现的,它可以 复制 或者 选择(多路复用) 数据流到一个或多个channel上。
image.png

合并

日志收集场景中比较常见的是数百个日志生产者发送数据到几个日志消费者Agent上,然后消费者Agent负责把数据发送到存储系统。
例如从数百个web服务器收集的日志发送到十几个Agent上,然后由十几个Agent写入到HDFS集群。
image.png

flume三大核心组件

Source(数据源)

通过source组件可以指定让Flume读取哪里的数据,然后将数据传递给后面的 channel
Flume内置支持读取很多种数据源,基于文件、基于目录、基于TCP\UDP端口、基于HTTP、Kafka的 等等、当然了,如果这里面没有你喜欢的,他也是支持自定义的。

Exec Source 实现文件监控,可以实时监控文件中的新增内容,类似于linux中的tail -f 效果。 在这需要注意 tail -F 和 tail -f 的区别
NetCat TCP/UDP Source 采集指定端口(tcp、udp)的数据,可以读取流经端口的每一行数据
Spooling Directory Source 采集文件夹里新增的文件
Kafka Source 从Kafka消息队列中采集数据

tail -F 等同于–follow=name —retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果 再次创建相同的文件名,会继续追踪 tail -f 等同于–follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止,在实际工作中我们的日志数据一般都会通过log4j记录,log4j产生的日志文件名称是固定的,每天定时给文件重命名。假设默认log4j会向access.log文件中写日志,每当凌晨0点的时候,log4j都会对文件进行重命名,在 access后面添加昨天的日期,然后再创建新的access.log记录当天的新增日志数据。 这个时候如果想要一直监控access.log文件中的新增日志数据的话,就需要使用tail -F

Channel(临时存储数据的管道)

Channel: 接受Source发出的数据,可以把channel理解为一个临时存储数据的管道
Channel的类型有很多:内存、文件,内存+文件、JDBC等

Memory Channel 使用内存作为数据的存储 优点是效率高,因为就不涉及磁盘IO
缺点有两个
1:可能会丢数据,如果Flume的agent挂了,那么channel中的数据就丢失了。
2:内存是有限的,会存在内存不够用的情况
File Channel 使用文件来作为数据的存储 优点是数据不会丢失 缺点是效率相对内存来说会有点慢,但是这个慢并没有我们想象中的那么慢。
Spillable Memory Channel 使用内存和文件作为数据存储,即先把数据存到内存中,如果内存中数据达到阈值再flush到文件中 优点:解决了内存不够用的问题。
缺点:还是存在数据丢失的风险

Sink(目的地)

Sink:从Channel中读取数据并存储到指定目的地
Sink的表现形式有很多:打印到控制台、HDFS、Kafka等,

注意:Channel中的数据直到进入目的地才会被删除,当Sink写入目的地失败后,可以自动重写, 不会造成数据丢失,这块是有一个事务保证的。

常用的sink组件有:

Logger Sink 将数据作为日志处理 可以选择打印到控制台或者写到文件中,这个主要在测试的时候使用
HDFS Sink 将数据传输到HDFS中 主要针对离线计算的场景
Kafka Sink 将数据发送到kafka消息队列中 主要针对实时计算场景,数据不落盘,实时传输,最后使用实时计算框架直接处理。

Event

Event是Flume数据传输的基本单元,以Event 的形式将数据从源头送至目的地
Event 由Header 和Body 两部分组成
image.png

header

Header 用来存放该 event 的一些属性,类型为

body

Body 用来存放该条数据,形式为字节数组。
可以再source中增加header的,在channel和sink中使用header的值

安装Flume

下载地址:https://flume.apache.org/download.html
image.png

  1. cd /data/soft/
  2. tar -zxvf apache-flume-1.9.0-bin.tar.gz
  3. cd apache-flume-1.9.0-bin
  4. cd conf/
  5. #修改flume-env.sh.template的名字,去掉后缀template
  6. mv flume-env.sh.template flume-env.sh