Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
当前Flume有两个版本Flume 0.9X版本的统称Flume-og,Flume1.X版本的统称Flume-ng。由于Flume-ng经过重大重构,与Flume-og有很大不同,使用时请注意区分。
flume的特点
flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力 。
flume的数据流由事件(Event)贯穿始终。事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source生成,当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。你可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。
flume的可靠性
当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to-end(收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。),Store on failure(这也是scribe采用的策略,当数据接收方crash时,将数据写到本地,待恢复后,继续发送),Besteffort(数据发送到接收方后,不会进行确认)。
flume的可恢复性
还是靠Channel。推荐使用FileChannel,事件持久化在本地文件系统里(性能较差)。
flume的一些核心概念:
Agent 使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。
Client 生产数据,运行在一个独立的线程。
Source 从Client收集数据,传递给Channel。
Sink 从Channel收集数据,运行在一个独立线程。
Channel 连接 sources 和 sinks ,这个有点像一个队列。
Events 可以是日志记录、 avro 对象等。
本文是征服flume系列文章的第一篇,编译flume-NG。
一、下载flume-ng源码
git clone git://git.apache.org/flume.git
或者到 官网通过http方式下载zip包
二、编译过程中可能遇到的问题
1、Missing artifact jdk.tools:jdk.tools:
flume-hdfs-sink等包中可能会报该异常,只需要在pom.xml中添加一下依赖即可
jdk.tools jdk.tools 1.7 system ${JAVA_HOME}/lib/tools.jar
2、ua-parser-1.3.0.jar
这个jar包我尝试了几个不同的地址,均未能正常下载,遂自己下载了一份源码打了jar包
https://github.com/tobie/ua-parser/
当然,大家也可以尝试一下一下地址
maven.tempo-db.com http://maven.tempo-db.com/artiferactory/list/twitter/
3、其他jar包
之后的编译过程中,还遇到了其他jar包无法正常加载的情况,主要有org.restlet.ext.servlet-2.1.1.jar、pentaho-aggdesigner-algorithm-5.1.3-jhyde.jar等,这些jar包都可以从一下地址找到!
http://conjars.org/repo/
http://repository.pentaho.org/artifactory/repo/
4、缺少class文件的问题
如果你使用eclipse或者其他ide打开flume项目,你会发现有几个类找不到,例如:
org.apache.flume.source.avro.AvroFlumeEvent
com.cloudera.flume.handlers.avro.FlumeOGEventAvroServer
com.cloudera.flume.handlers.avro.AvroFlumeOGEvent
等等,这些class其实是通过src路径下的avdl文件生成的。(具体生成过程我还没研究)
三、执行编译命令
mvn clean install -DskipTests
由于受环境和配置参数影响,需要跳过测试,不然部分测试代码执行不成功。
四、执行结果
执行完成后,将在flume-ng-dist文件夹的target目录下生成apache-flume-1.7.0-SNAPSHOT-bin等文件夹,apache-flume-1.7.0-SNAPSHOT-bin文件夹下的文件即可直接拿来使用