一.Flume使用的前提:
Flume使用 java编写,其需要运行在
Java1.6或更高版本之上。
二.Flume的定义:
Flume是一个分布式、可靠、高效可用的海量日志采集、聚合和传输系统,支持在系统中定制各类数据发送方,用于搜集数据;同时,flume提供对数据进行加单处理,并写到各种数据接受方(可定制)的能力。
核心一句话:将数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓冲数据,待数据真正到的目的地后,删除自己缓冲的数据。
三.组件及作用:
1.source:从client端收集数据,传递个channel。直接读取:文件source的有两种方式:
ExecuteSource:以运行linux命令的方式,持续的输出最新的数据,如tail
–f 文件名指令,在这种方式下取的文件名必须是指定的。
SpoolSource:检测配置的目录下新增的文件,并将文件中的数据读取出来。
2.channel:缓冲数据,连接sources和sinks,有点像队列。类型有MemoryChannel,JDBC
Channel,FileChannel等。
3. sink:从channel收集数据,运行一个独立线程。可以向文件系统、数据库、hadoop存储数据。
在日志数据较少时,可以将数据存储在文件系统中,并且设定一定的时间间隔保存数据。
在日志数据较多时,可以将相应的日志存储到hadoop中,便于日后进行相应的数据分析。
组件名称功能介绍
Agent代理 |
使用JVM运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。 |
Client客户端 |
生产数据,运行在一个独立的线程。 |
Source源 |
从Client收集数据,传递给Channel。 |
Sink接收器 |
从Channel收集数据,进行相关操作,运行在一个独立线程。 |
Channel通道 |
连接 sources和 sinks ,这个有点像一个队列。 |
Events事件 |
传输的基本数据负载。 |
四.Flume的整体构成图
源将事件写到一个多或者多个通道中。
接收器只从一个通道接收事件。
代理可能会有多个源、通道与接收器
Event是flume数据传输的基本单元,flume以事件的形式将数据从源头传送到目的地。
一个 Event 由 Map<String,String>Headers 和 byte[]
body 组成,其中 Headers 保存了 Event 的属性,body 保存了 Event 的内容。
。
Source:负责接收events或通过特殊机制产生events,并将events批量的放到一个或多个channels。
Channel位于sources和sinks之间,用于缓存进来的events,当sink成功的将events发送到下一跳的channel或最终目的,events从channel移除。
Sink:负责将events传输到吓一跳或最终目的,成功完成后将events从channel移除。
五.常见错误:
Could not configure sink sink1 due to:No channel configured for sink: sink1
org.apache.flume.conf.ConfigurationException: No channel configured for sink:sink1
则仔细查看配置文件,一个source可以对应多个channel,所以是channels,agent.sources.source1.channels
= channel1,
但是一个sink对应一个channel,所以是channel,agent.sinks.sink1.channel
=channel1,请注意。
六.常见各组件支持的类型:
Flume Source
支持的类型:
Source类型 |
说明 |
Avro Source |
支持Avro协议(实际上是Avro RPC),内置支持 |
Thrift Source |
支持Thrift协议,内置支持 |
Exec Source |
|
JMS Source |
从JMS系统(消息、主题)中读取数据,ActiveMQ已经测试过 |
Spooling Directory Source |
监控指定目录内数据变更 |
Twitter 1% firehose Source |
通过API持续下载Twitter数据,试验性质 |
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版本) |
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实现 |
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实现 |
七各种组件的特性:
(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
scriptcommand两种形式对数据流进行管理。
(4)功能可扩展性
用户可以根据需要添加自己的agent,collector或者storage。此外,Flume自带了很多组件,包括各种agent(file,
syslog等),collector和storage(file,HDFS等)。