(1)Apache Fulme 是一个分布式的,可靠、高可用的系统。它用来从许多不同的源收集、聚合、传输大量的日志数据到一个集中的数据仓库。
(2)ApacheFlume 的使用不仅仅局限在日志数据的收集。
(3)Flume 是Apache基金会的一个顶级项目。
(4)两个版本 0.9.x简称og 和1.x 简称ng
从og到ng经过了重构,并且ng不能兼容og
(5)Flume支持过滤器。使用正则表达式。
(6)Flume可以支持多级flume的agent,支持扇入(fan-in)、扇出(fan-out)
Flume介绍
Flume是Cloudera提供的日志收集系统。Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
Flume是一个分布式、可靠、高可用的海量日志采集、聚合和传输的系统。
Flume的架构主要有一下几个核心概念:
- Event:一个数据单元,带有一个可选的消息头
- Flow:Event从源点到达目的点的迁移的抽象
- Client:操作位于源点处的Event,将其发送到Flume Agent
- Agent:一个独立的Flume进程,包含组件Source、Channel、Sink
- Source:用来消费传递到该组件的Event
- Channel:中转Event的一个临时存储,保存有Source组件传递过来的Event
-
- MemoryChannel 可以实现高速的吞吐,但是无法保证数据的完整性。
- MemoryRecoverChannel 在官方文档的建议上已经建义使用FileChannel来替换。
- FileChannel保证数据的完整性与一致性。在具体配置FileChannel时,建议FileChannel设置的目录和程序日志文件保存的目录设成不同的磁盘,以便提高效率。
- File Channel 是一个持久化的隧道(channel),它持久化所有的事件,并将其存储到磁盘中。因此,即使 Java 虚拟机当掉,或者操作系统崩溃或重启,再或者事件没有在管道中成功地传递到下一个代理(agent),这一切都不会造成数据丢失。Memory Channel 是一个不稳定的隧道,其原因是由于它在内存中存储所有事件。如果 java 进程死掉,任何存储在内存的事件将会丢失。另外,内存的空间收到 RAM大小的限制,而 File Channel 这方面是它的优势,只要磁盘空间足够,它就可以将所有事件数据存储到磁盘上。美团在两者性能缺陷上设计出一个dualchannel 来进行两者使用时的转换。
- Sink:从Channel中读取并移除Event,将Event传递到Flow Pipeline中的下一个Agent(如果有的话)
- 将日志采集系统系统分为三层:Agent 层,Collector 层和 Store 层,其中 Agent 层每个机器部署一个进程,负责对单机的日志收集工作;Collector 层部署在中心服务器上,负责接收Agent层发送的日志,并且将日志根据路由规则写到相应的 Store 层中;Store 层负责提供永久或者临时的日志存储服务,或者将日志流导向其它服务器。
Flume特点
- Reliability:数据可靠性,包括End-to-end,Store on failure和Best effort
- Scalability:Flume的3大组件collector、master和storage tier都是可伸缩的
- Manageability:利用ZooKeeper和gossip,保证配置数据的一致性、高可用,同时多Master
- Extensibility:基于Java,用户可以为Flume添加各种新的功能。
Flume架构
其中最重要的抽象是data flow,描述了数据从产生、传输、处理并最终写入目标的一条路径。
上图实线是data flow。
Agent用于采集数据,agent是flume中产生数据流的地方,同时,agent会将产生的数据流传输到collector。对应的,collector用于对数据进行聚合,往往产生一个更大的流。
其中,收集数据有2种主要工作模式:
- Push Sources:外部系统会主动地将数据推送到Flume中,如RPC、syslog
- Polling Sources:Flume到外部系统中获取数据,一般使用轮询的方式,如text和exec
注意,在Flume中,agent和collector对应,而source和sink对应。
Source和sink强调发送、接受方的特性(如数据格式、编码等),而agent和collector关注功能。
===================================================================
在软件设计中,扇入和扇出的概念是指应用程序模块之间的层次调用情况。
按照结构化设计方法,一个应用程序是由多个功能相对独立的模块所组成。
扇入:是指直接调用该模块的上级模块的个数。扇入大表示模块的复用程序高。
扇出:是指该模块直接调用的下级模块的个数。扇出大表示模块的复杂度高,需要控制和协调过多的下级模块;但扇出过小(例如总是1)也不好。扇出过
大一般是因为缺乏中间层次,应该适当增加中间层次的模块。扇出太小时可以把下级模块进一步分解成若干个子功能模块,或者合并到它的上级模块中去。
设计良好的软件结构,通常顶层扇出比较大,中间扇出小,底层模块则有大扇入