flume原理
1、Flume OG
- Flume逻辑上分三层架构:Agent,Collector,Storage。
- Flume OG采用了多Master的方式。为了保证配置数据的一致性,Flume引入了ZooKeeper,用于保存配置数据,ZooKeeper本身可保证配置数据的一致性和高可用,另外,在配置数据发生变化时,ZooKeeper可以通知Flume Master节点。Flume Master间使用gossip协议同步数据。
- FLUM OG 的特点是:
- Flum OG 有三种角色的节点:代理节点(agent)、收集节点(collector)、主节点(master)。
- agent 从各个数据源收集日志数据,将收集到的数据集中到 Collector,然后由收集节点汇总存入 HDFS。master 负责管理 agent,collector 的活动。
- agent、collector 都称为 node,node 的角色根据配置的不同分为 logical node(逻辑节点)、physical node(物理节点)。
- agent、collector 由 source、sink 组成,代表在当前节点数据是从 source 传送到 sink。
2、Flume NG
- Flume NG最明显的改动就是取消了集中管理配置的 Master 和 Zookeeper,变为一个纯粹的传输工具。Flume NG另一个主要的不同点是读入数据和写出数据现在由不同的工作线程处理(称为Runner)。在 Flume NG 中,读入线程同样做写出工作(除了故障重试)。如果写出慢的话(不是完全失败),它将阻塞 Flume 接收数据的能力。这种异步的设计使读入线程可以顺畅的工作而无需关注下游的任何问题。
- FLUME NG 的特点是:
- NG 只有一种角色的节点:代理节点(agent)。
- 没有 collector、master 节点,这是核心组件最核心的变化。
- 去除了 physical nodes、logical nodes 的概念和相关内容。
- agent 节点的组成也发生了变化。Flume NG的 agent 由 source、sink、Channel 组成。
3、组件
- agent
- Flume以Agent为最小的独立运行单位。Agent是Flume中产生数据流的地方,一个Agent就是一个JVM。单Agent由Source、Sink和Channel三大组件构成,如下图:
- Source:完成对日志数据的收集,分成 transtion 和 event 打入到Channel之中。
- 常见的source类型
Source类型 | 说明 |
Avro Source | 支持Avro协议(实际上是Avro RPC),提供一个Avro的接口,需要往设置的地址和端口发送Avro消息,Source就能接收到,如:Log4j Appender通过Avro Source将消息发送到Agent |
Thrift Source | 支持Thrift协议,提供一个Thrift接口,类似Avro |
Exec Source | Source启动的时候会运行一个设置的UNIX命令(比如 cat file),该命令会不断地往标准输出(stdout)输出数据,这些数据就会被打包成Event,进行处理 |
JMS Source | 从JMS系统(消息、主题)中读取数据,类似ActiveMQ |
Spooling Directory Source | 监听某个目录,该目录有新文件出现时,把文件的内容打包成Event,进行处理 |
Netcat Source | 监控某个端口,将流经端口的每一个文本行数据作为Event输入 |
Sequence Generator Source | 序列生成器数据源,生产序列数据 |
Syslog Sources | 读取syslog数据,产生Event,支持UDP和TCP两种协议 |
HTTP Source | 基于HTTP POST或GET方式的数据源,支持JSON、BLOB表示形式 |
Legacy Sources | 兼容老的Flume OG中Source(0.9.x版本) |
自定义Source | 使用者通过实现Flume提供的接口来定制满足需求的Source。 |
- Channel:主要提供一个队列的功能,对source提供中的数据进行简单的缓存。
Flume Channel 支持的类型:
Channel类型 | 说明 |
Memory Channel | Event数据存储在内存中 |
JDBC Channel | Event数据存储在持久化存储中,当前Flume Channel内置支持Derby |
File Channel | Event数据存储在磁盘文件中 |
Spillable Memory Channel | Event数据存储在内存中和磁盘上,当内存队列满了,会持久化到磁盘文件(当前试验性的,不建议生产环境使用) |
Pseudo Transaction Channel | 测试用途 |
Custom Channel | 自定义Channel实现 |
- Sink:取出Channel中的数据,进行相应的存储文件系统,数据库,或者提交到远程服务器。
Flume Sink支持的类型
Sink类型 | 说明 |
HDFS Sink | 数据写入HDFS |
Logger Sink | 数据写入日志文件 |
Avro Sink | 数据被转换成Avro Event,然后发送到配置的RPC端口上 |
Thrift Sink | 数据被转换成Thrift Event,然后发送到配置的RPC端口上 |
IRC Sink | 数据在IRC上进行回放 |
File Roll Sink | 存储数据到本地文件系统 |
Null Sink | 丢弃到所有数据 |
HBase Sink | 数据写入HBase数据库 |
Morphline Solr Sink | 数据发送到Solr搜索服务器(集群) |
ElasticSearch Sink | 数据发送到Elastic Search搜索服务器(集群) |
Kite Dataset Sink | 写数据到Kite Dataset,试验性质的 |
Custom Sink | 自定义Sink实现 |
- collector
- Flume NG中已经没有Collector的概念了,Collector的作用是将多个Agent的数据汇总后,加载到Storage中。
- storage
- Storage是存储系统,可以是一个普通File,也可以是HDFS,HIVE,HBase等。
- master
- 针对于OG版本,Master是管理协调Agent和Collector的配置等信息,是Flume集群的控制器。在Flume中,最重要的抽象是data flow(数据流),data flow描述了数据从产生,传输、处理并最终写入目标的一条路径。对于Agent数据流配置就是从哪得到数据,把数据发送到哪个Collector。对于Collector是接收Agent发过来的数据,把数据发送到指定的目标机器上。
4、特性
- 可靠性
当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:
- end-to-end(收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。)
- Store on failure(这也是scribe采用的策略,当数据接收方crash时,将数据写到本地,待恢复后,继续发送)
- Best effort(数据发送到接收方后,不会进行确认)。
- 可扩展性
Flume采用了三层架构,分别为agent,collector和storage,每一层均可以水平扩展。其中,所有agent和collector由master统一管理,这使得系统容易监控和维护,且master允许有多个(使用ZooKeeper进行管理和负载均衡),这就避免了单点故障问题。.0000pt;" > - 可管理性
所有agent和colletor由master统一管理,这使得系统便于维护。多master情况,Flume利用ZooKeeper和gossip,保证动态配置数据的一致性。用户可以在master上查看各个数据源或者数据流执行情况,且可以对各个数据源配置和动态加载。Flume提供了web 和shell script command两种形式对数据流进行管理。 - 功能可扩展性
用户可以根据需要添加自己的agent,collector或者storage。此外,Flume自带了很多组件,包括各种agent(file, syslog等),collector和storage(file,HDFS等)。n