Flume架构介绍
Flume架构介绍
-
Flume概念
分布式的日志收集系统,将服务器中的数据收集起来送到指定的地方去,比如说hdfs
-
Event概念
flume的核心是把数据从数据源(source)收集过来,再将收集到的数据送到指定的目的地(sink)。为了保证输送的过程一定成功,在送到目的地(sink)之前,会先缓存数据(channel),待数据真正到达目的地(sink)后,flume再删除自己缓存的数据。
在整个数据的传输的过程中,流动的是event,即事务保证是在event级别进行的。那么什么是event呢?—–event将传输的数据进行封装,是flume传输数据的基本单位,如果是文本文件,通常是一行记录。event也是事务的基本单位。event从source,流向channel,再到sink,本身为一个字节数组,并可携带headers(头信息)信息。event代表着一个数据的最小完整单元,从外部数据源来,向外部的目的地去。
一个event=event header +event body+event信息
-
Flume架构介绍
Flume的逻辑架构:
分层架构:agent,collector和storage
flume使用两个组件:Master和Node,Node根据在Mastershell或web中动态配置,决定是作为Agent或Collector
1) Agent:
运行在日志收集节点的java进程
agent三个核心组件:source-channel-sink 生产者-仓库-消费者
source:用来收集数据,各种格式avro、thrift、exec、jms、spooling、directory、netcat、sequence generator、syslog、http、legacy,自定义等。
http://www.cnblogs.com/zhangmiaochp/archive/2011/05/18/2050465.html
channel:source组件把数据收集来以后,临时存放在channel中,即channel组件在agent中是专门用来存放临时数据的——对采集到的数据进行简单的缓存,可以存放在memory、jdbc、file等等。
Sink: sink组件是用于把数据发送到目的地的组件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、Hbase、solr、自定义。
http://www.cnblogs.com/zhangmiaochp/archive/2011/05/18/2050472.html
2)Collector
collector的作用是将多个agent的数据汇总后,加载到storage它的source和sink与agent类似
3)storage
storage是存储系统,可以是一个普通file,也可以是HDFS,HIVE,HBase
4)Master
Master是管理协调agent和collector的配置信息,是flume集群的控制器
注:Flume框架对hadoop和zookeeper的依赖只是在jar包上,并不要求flume启动时必须将hadoop和zookeeper服务也启动。
-
Flume的广义用法
flume之所以这么神奇—-其原因也在于flume可以支持多级flume的agent,即flume可以前后相继,例如sink可以将数据写到下一个agent的source中,这样的话就可以连成串了,可以整体处理了。flume还支持扇入(fan-in)、扇出(fan-out)。所谓扇入就是source可以接受多个输入,所谓扇出就是sink可以将数据输出多个目的地destination中。
-
Flume应用-日志采集
flume提供了大量内置的Source、Channel和Sink类型。而且不同类型的Source、Channel和Sink可以*组合—–组合方式基于用户设置的配置文件,非常灵活。比如:Channel可以把事件暂存在内存里,也可以持久化到本地硬盘上。Sink可以把日志写入HDFS, HBase,甚至是另外一个Source等等。
flume使用方法:书写一个配置文件,在配置文件当中描述source、channel与sink的具体实现,而后运行一个agent实例,在运行agent实例的过程中会读取配置文件的内容,这样flume就会采集到数据
配置文件编写原则:
-
整体上描述代理agent中sources、sinks、channels所涉及到的组件
a1.sources = r1
a1.sinks = k1
a1.channels = c1
-
详细描述agent中每一个source、sink与channel的具体实现
describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
#describe the sinl
a1.sinks.k1.type = logger
#use a channel with buffers events inmemory
a1.resources.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
-
通过channel将source和sink连接起来
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
-
启动agent的shell操作
flume-ng agent –n a1 –c ../conf –f../conf/example.file-Dflume.root.logger=DEBUG,console
-n :指定agent的名称
-c:指定flume中配置文件的目录
-f:指定配置文件
-Dflume.root.logger=DEBUG,console
设置日志登记
-
-
设计目标
(1) 可靠性:当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to-end(收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。),Store on failure(这也是scribe采用的策略,当数据接收方crash时,将数据写到本地,待恢复后,继续发送),Best effort(数据发送到接收方后,不会进行确认)
(2) 可扩展性
Flume采用了三层架构,分别为agent,collector和storage,每一层均可以水平扩展。其中,所有agent和collector由master统一管理,这使得系统容易监控和维护,且master允许有多个(使用ZooKeeper进行管理和负载均衡),这就避免了单点故障问题。
(3) 可管理性
所有agent和colletor由master统一管理,这使得系统便于维护。多master情况,Flume利用ZooKeeper和gossip,保证动态配置数据的一致性。用户可以在master上查看各个数据源或者数据流执行情况,且可以对各个数据源配置和动态加载。Flume提供了web 和shell script command两种形式对数据流进行管理。