目录
一、什么是Flume?
二、安装
三、Flume目录结构
四、Flume Agent组件
(1)Source
(2)channel
(3)sink
五、Flume有哪些优缺点
(1)优点
(2)缺点
六、应用场景
(1)电子商务网站
(2)内容推送
(3)ETL工具
七、其他类似Flume框架
八、Flume插件
九、启动参数详解
总结
一、什么是Flume?
Flume是由Cloudera软件公司提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,后与2009年被捐赠了apache软件基金会,为hadoop相关组件之一。尤其近几年随着flume的不断被完善以及升级版本的逐一推出,特别是flume-ng;同时flume内部的各种组件不断丰富,用户在开发的过程中使用的便利性得到很大的改善,现已成为apache top项目之一。
apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务。flume具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。
二、安装
Flume的安装很简单,目前最新版本是1.9.0,安装1.9.0要满足以下几个条件:
- java运行环境,要安装jdk1.7以上版本
- 系统内存要足够用运行agent组件source,channel和sink。
- 磁盘空间要足够
- 目录权限,agent要有足够读写权限
Flume下载最新版本后,进行解压即可,但是要确保安装了java运行环境。
PS:默认flume是不支持windows系统的,没有bat的启动命令。不过有一个flume-ng.cmd,其实它也不是启动文件,只是启动了一个powershell而已,如果你本地有这个软件,就可以在windows下运行了。
三、Flume目录结构
文件夹 | 说明 |
bin | 存放了启动脚本 |
lib | 启动所需的所有组件jar包 |
conf | 提供了几个测试配置文件 |
docs | 文档 |
四、Flume Agent组件
Flume内部有一个或者多个Agent,然而对于每一个Agent来说,它就是一共独立的守护进程(JVM),它从客户端哪儿接收收集,或者从其他的 Agent哪儿接收,然后迅速的将获取的数据传给下一个目的节点sink,或者agent。
(1)Source
source 负责数据的产生或搜集,一般是对接一些RPC的程序或者是其他的flume节点的sink,从数据发生器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道Channel,Flume提供多种数据接收的方式,比如包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定义。
类型 | 描述 |
Avro | 监听Avro端口并接收Avro Client的流数据 |
Thrift | 监听Thrift端口并接收Thrift Client的流数据 |
Exec | 基于Unix的command在标准输出上生产数据 |
JMS | 从JMS(Java消息服务)采集数据 |
Spooling Directory | 监听指定目录 |
Twitter 1% | 通过API持续下载Twitter数据(实验阶段) |
Kafka | 采集Kafka topic中的message |
NetCat | 监听端口(要求所提供的数据是换行符分隔的文本) |
Sequence Generator | 序列产生器,连续不断产生event,用于测试 |
Syslog | 采集syslog日志消息,支持单端口TCP、多端口TCP和UDP日志采集 |
HTTP | 接收HTTP POST和GET数据 |
Stress | 用于source压力测试 |
Legacy | 向下兼容,接收低版本Flume的数据 |
Custom | 自定义source的接口 |
Scribe | 从facebook Scribe采集数据 |
(2)channel
Channel 是一种短暂的存储容器,负责数据的存储持久化,可以持久化到jdbc,file,memory,将从source处接收到的event格式的数据缓存起来,直到它们被sinks消费掉,可以把channel看成是一个队列,队列的优点是先进先出,放好后尾部一个个event出来,Flume比较看重数据的传输,因此几乎没有数据的解析预处理。仅仅是数据的产生,封装成event然后传输。数据只有存储在下一个存储位置(可能是最终的存储位置,如HDFS;也可能是下一个Flume节点的channel),数据才会从当前的channel中删除。这个过程是通过事务来控制的,这样就保证了数据的可靠性。
不过flume的持久化也是有容量限制的,比如内存如果超过一定的量,不够分配,也一样会爆掉。
类型 | 描述 |
Memory | Event数据存储在内存中 |
JDBC | Event数据存储在持久化存储中,当前Flume Channel内置支持Derby |
Kafka | Event存储在kafka集群 |
File Channel | Event数据存储在磁盘文件中 |
Spillable Memory Channel | Event数据存储在内存中和磁盘上,当内存队列满了,会持久化到磁盘文件(当前试验性的,不建议生产环境使用) |
Pseudo Transaction Channel | 测试用途 |
Custom Channel | 自定义Channel实现 |
(3)sink
sink 负责数据的转发,将数据存储到集中存储器比如Hbase和HDFS,它从channel消费数据(events)并将其传递给目标地。目标地可能是另一个sink,也可能是hdfs、logger、avro、thrift、ipc、file、null、Hbase、solr、自定义等。
类型 | 描述 |
HDFS | 数据写入HDFS |
HIVE | 数据导入到HIVE中 |
Logger | 数据写入日志文件 |
Avro | 数据被转换成Avro Event,然后发送到配置的RPC端口上 |
Thrift | 数据被转换成Thrift Event,然后发送到配置的RPC端口上 |
IRC | 数据在IRC上进行回放 |
File Roll | 存储数据到本地文件系统 |
Null | 丢弃到所有数据 |
Hive | 数据写入Hive |
HBase | 数据写入HBase数据库 |
Morphline Solr | 数据发送到Solr搜索服务器(集群) |
ElasticSearch | 数据发送到Elastic Search搜索服务器(集群) |
Kite Dataset | 写数据到Kite Dataset,试验性质的 |
Kafka | 数据写到Kafka Topic |
Custom | 自定义Sink实现 |
五、Flume有哪些优缺点
(1)优点
- Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS,HBase。
- 当收集数据的速度超过将写入数据的时候,也就是当收集信息遇到峰值时,这时候收集的信息非常大,甚至超过了系统的写入数据能力,这时候,Flume会在数据生产者和数据收容器间做出调整,保证其能够在两者之间提供一共平稳的数据。
- 提供上下文路由特征。
- Flume的管道是基于事务,保证了数据在传送和接收时的一致性。
- Flume是可靠的,容错性高的,可升级的,易管理的,并且可定制的。
- 实时性,Flume有一个好处可以实时的将分析数据并将数据保存在数据库或者其他系统中。
(2)缺点
Flume的配置很繁琐,source,channel,sink的关系在配置文件里面交织在一起,不便于管理。
六、应用场景
(1)电子商务网站
比如我们在做一个电子商务网站,然后我们想从消费用户中访问点特定的节点区域来分析消费者的行为或者购买意图. 这样我们就可以更加快速的将他想要的推送到界面上,实现这一点,我们需要将获取到的她访问的页面以及点击的产品数据等日志数据信息收集并移交给Hadoop平台上去分析,而Flume正是帮我们做到这一点。
(2)内容推送
现在流行的内容推送,比如广告定点投放以及新闻私人定制也是基于此。
(3)ETL工具
可以利用插件把关系型数据实时增量的导入到Hdfs外部数据源。
七、其他类似Flume框架
Facebook的Scribe,还有Apache新出的另一个明星项目chukwa,还有淘宝Time Tunnel
八、Flume插件
(1)Interceptors拦截器
用于source和channel之间,用来更改或者检查Flume的events数据
(2)管道选择器 channels Selectors
在多管道是被用来选择使用那一条管道来传递数据(events). 管道选择器又分为如下两种:
- 默认管道选择器: 每一个管道传递的都是相同的events
- 多路复用通道选择器: 依据每一个event的头部header的地址选择管道.
(3)sink线程
用于激活被选择的sinks群中特定的sink,用于负载均衡.
九、启动参数详解
你可以输入flume-ng help获得帮助提示:
参数 | 描述 |
commands | 这个是很重要的参数,因为flume可以使用不同的角色启动,比如agent以及client等等。暂时搞不清楚avro-client有什么特殊的,先了解一下吧!平时启动就使用agent就可以了 |
--conf 或者 -c | 指定去conf目录下加载配置文件 |
--classpath 或者 -C | 指定类加载的路径 |
--conf-file 或者 -f | 指定配置文件 |