(一)Flume概述
Flume是由Cloudera提供的一个分布式、高可靠、高可用的服务,用于分布式的海量日志的高效收集、聚合、移动系统
官网定义:(官网:http://flume.apache.org/)
Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data.
It has a simple and flexible architecture based on streaming data flows. It is robust and fault tolerant with tunable reliability mechanisms and many failover and recovery mechanisms. It uses a simple extensible data model that allows for online analytic application.
关键词:
分布式、可靠、可用的服务。
收集、聚合和移动大量日志数据。
它具有健壮性和容错性。
它使用一个简单的可扩展数据模型,支持在线分析应用程序。
(二)Flume发展史:
Cloudera 开发的分布式日志收集系统 Flume,
Flume 初始的发行版本目前被统称为 Flume OG
og是单线程 主从结构,原本由zookeeper管理
2011 年 10 月 22 号,cloudera 完成了 Flume-728,对 Flume 进行了里程碑式的改动:重构核心组件、核心配置以及代码架构,重构后的版本统称为 Flume NG(next generation),并纳入 apache 旗下,cloudera Flume 改名为 Apache Flume。
ng是双线程 已经取消master管理机制和zookeeper管理机制,变成了纯粹的传输工具
2012.7 1.0
2015.5 1.6
2019.1 1.9
(三)Flume架构及核心组件
此图来自官网:
从图里可以看出,这是一个agent的Flume架构的核心组件
1)Source 收集:从什么地方采集数据
Flume常用source有:
Avro Source可以以流的方式传递数据
Exec Source
Kafka Source
Netcat Source
2)Channel 聚集:通道,相当于数据的缓存池,提供数据临时存放的地方
Flume常用channel有:
Memory Channel
JDBC Channel
Kafka Channel
File Channel
3) Sink 输出:把channel里的数据读取出来,通过sink推送到目的地
Flume常用sink有:
HDFS Sink
Avro Sink
Logger Sink
多个agent的Flume架构
整合多个agent
Multiplexing the flow
其实这些从一个agent演变出来的Flume架构,最终都是围绕着三个核心组件进行的
从Source读进来,放在Channel里,然后通过Sink再读出去,读到HDFS或者其他地方,就是把这些东西怎么串起来合适,串联还是并联。
【官网小栗子】
从指定网络端口采集数据输出到控制台
使用Flume关键就是写agent配置文件
步骤:
1、总定义
a1:agent 名称 ,启动的时候用到它
r1:数据源source的名称-----a1指定的数据源就一个r1
k1:sink的名称
c1:channel名称
2、配置Source
source的类型根据自己的需求在官网上查需要的source,配置好。
栗子里,source采用的类型是netcat:监听一个端口,会把里面每一行数据转换成event(flume里面的数据传输的单元)
绑定了你的服务器和端口
需要的属性
3、配置Sink
栗子里选用的是logger。INFO级别输出
4、配置Channel
栗子里选用的是memory,事件存储在内存队列中,具有可配置的最大大小。
5、组装
【注意】channel的单复数
一个source可以输出到多个channels
一个sink可以输出到一个channel
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = hadoop001
a1.sources.r1.port = 44444
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
#a1.channels.c1.capacity = 1000
#a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
配置文件写好了,检查之后,我们就把它放在
自己定义的文件里
vi example.conf
【启动agent】
bin>flume-ng agent \
--name a1 \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/example.conf \
-Dflume.root.logger=INFO,console
服务器上另开一个窗口
【使用telnet进行测试】
telnet hadoop001 4444
输入6个: hello
flume窗口就会显示:
说明:
发送一条数据就是一个event
Event是flume数据传输的基本单元
一个Event = 可选的header +byte array
根据官网的小栗子,你就可以根据自己需要来监控文件 实时采集新增的数据输出到控制台,你也可以根据上面的架构图,采用多个服务器,将A服务器日志实时收集到B服务器到HDFS中,也可以对接kafka完成实时数据的采集,根据自己的项目需求来吧。
❤(四)面试题
来源: 作者:qq_43193797(https://me.csdn.net/qq_43193797)
https://blog.csdn.net/qq_43193797/article/details/86572149
1、 你是如何实现Flume数据传输的监控的
使用第三方框架Ganglia实时监控Flume。
2 Flume的Source,Sink,Channel的作用?你们Source是什么类型?
1、作用 (1)Source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy (2)Channel组件对采集到的数据进行缓存,可以存放在Memory或File中。 (3)Sink组件是用于把数据发送到目的地的组件,目的地包括Hdfs、Logger、avro、thrift、ipc、file、Hbase、solr、自定义。
2、我公司采用的Source类型为: (1)监控后台日志:exec (2)监控后台产生日志的端口:netcat
3 、Flume 的 Channel Selectors
补充:官网还有个类型:Custom Channel Selector定义
4、Flume 参数调优
(1)Source 增加Source个数(使用Tair Dir Source时可增加FileGroups个数)可以增大Source的读取数据的能力。 例如:当某一个目录产生的文件过多时需要将这个文件目录拆分成多个文件目录,同时配置好多个 Source 以保证 Source 有足够的能力获取到新产生的数据。 batchSize 参数决定 Source 一次批量运输到 Channel 的event条数,适当调大这个参数可以提高 Source 搬运 Event 到 Channel 时的性能。
(2)Channel type 选择 memory 时 Channel 的性能最好,但是如果 Flume 进程意外挂掉可能会丢失数据。type 选择 file 时 Channel 的容错性更好,但是性能上会比 memory channel 差。 使用file Channel时 dataDirs 配置多个不同盘下的目录可以提高性能。 Capacity 参数决定 Channel 可容纳最大的 event 条数。transactionCapacity 参数决定每次 Source 往 channel 里面写的最大event 条数和每次 Sink 从channel 里面读的最大 event 条数。transactionCapacity 需要大于 Source 和Sink的batchSize 参数。
(3)Sink 增加 Sink 的个数可以增加 Sink 消费 event 的能力。Sink 也不是越多越好够用就行,过多的 Sink 会占用系统资源,造成系统资源不必要的浪费。 batchSize 参数决定 Sink 一次批量从 Channel 读取的 event 条数,适当调大这个参数可以提高 Sink 从 Channel 搬出 event 的性能。
5 、Flume 的事务机制
Flume的事务机制(类似数据库的事务机制):
Flume 使用两个独立的事务分别负责从 Soucrce 到 Channel(put),以及从 Channel 到Sink 的事件传递(take)。
比如 spooling directory source 为文件的每一行创建一个事件,一旦事务中所有的事件全部传递到 Channel 且提交成功,那么 Soucrce 就将该文件标记为完成。
同理,事务以类似的方式处理从 Channel 到 Sink 的传递过程,如果因为某种原因使得事件无法记录,那么事务将会回滚。且所有的事件都会保持到 Channel 中,等待重新传递。
6 Flume 采集数据会丢失吗?
不会,Channel 存储可以存储在 File 中,数据传输自身有事务。