1、Flume概述
1、Flume介绍:
是一个用于收集海量日志数据的分布式框架,但不局限于日志数据。
和
它既可以处理离线数据,也可以处理实时数据。
问题:shell命令也可以将数据导入集群中,为什么不用呢?
shell命令方式存在存储格式、压缩、容错等不便性
常用场景
flume->HDFS->batch
flume->kafka->streaming
版本
flume-OG(老版本,不用花时间)
flume-NG
Flume三大核心组件
a.Source:
负责从源端采集数据。
常用的Source有exec/Spooling Directory/Taildir Source/NetCat
b.Channel:
负责缓存从Source端来的数据。
常用的Channel有Memory/File
c.Sink:
负责将从Channel而来的数据写到目标端。
常用的Sink有HDFS/Logger/Avro/Kafka
注意:
Source+Channel+Sink=Agent,数据以event的形式从Source传送到Sink端。
多路路由 && 多路复制
多路路由:
一个source中的数据中每一小部分走一个channel
多路复制:
一个source中的数据走多个channel,每个channel都有source的完整数据
2、数据来源Source
第一类source:exec
exec:
可以运行指定的Unix命令,然后该命令会一直执行,监控文件,作为flume数据的来源;
需要配置相应的channel,type,以及运行的命令;
本方式不保证数据一定能够输送到channel,如果出现问题,则数据可能丢失;
在这种条件下,建议使用Spooling Directory等其他手段,保证数据传输;
示例:
a1.sources = r1
a1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /var/log/secure
a1.sources.r1.channels = c1
第二类source: Spooling Directory
Spooling Directory:
离线数据中常用,可靠性较强。
flume重启,也不会丢失数据,为了保证可靠性,监控目录下的文件不能重名。
通过log4j来定义日志名称,这样基本不会重名。
监控磁盘目录,出现新的文件,解析新文件的内容,传输到定义的sink中。
传输过程中的解析逻辑可以自行指定,如果文件读取完毕之后,文件会重命名,或者可选择删除;
示例:
a1.channels = c
a1.sources = s
a1.sources.s.type = spooldir
a1.sources.s.channels = c
a1.source