flume的历史
flume最早是由cloudera开发的一个分布式的、高可用、高可靠的日志收集系统。后将项目转移到apache进行管理,目前属于apache的顶级项目。
flume版本
在项目进入apache后,对flume进行了大规模的整体重构,由原始的一个分布式系统,逐渐的变为一个tool或者service。不再包含zookeeper等逐渐,也不存在master等管理节点。
flume-0.x | flume-1.x | |
项目托管 | cloudera | apache |
支持hadoop版本信息 | hadoop-1.x hadoop-0.20.x hadoop-0.21.x hadoop-0.22.x | hadoop-2.x hadoop-0.23.x |
特点 | 一个分布式系统,有主节点; 利用zookeeper解决高可用性; | 更加像是一个工具(类似于scribe),解耦掉zookeeper; 抽象为source channel sink,可靠性由channel来保证( 类似于scribe的store概念)。 |
flume架构简述
flume的数据流向示意图如下
source
数据的源端,负责产生数据;也可以接收其他程序或者agent发来的数据。目前的已经支持的常用的source包括:
source名 | source.type | 简介 |
avro source | avro | 提供一个基于avro协议的server,bind到某个端口上,等待 avro协议客户端发过来的消息;一般在agent之间传输数据时,可以配置为avro |
thrift source | thrift | 同上,不过传输协议为thrift |
exec source | exec | 执行一个unix command,以其std out作为数据源; 命令可以通过<agent>.<source>.command配置,如: tail -f /var/log/mesg。支持对命令或者脚本的自动重启 |
netcat source | netcat | 监控指定端口,每一行作为一个event传输;认为输入的数据为text的,每一行 的数据最大长度可配置(max-line-length)默认为512 |
http source | http | 支持http的post和get(get仅仅用于测试) |
scribe source | org.apache.flume.source.scribe.ScribeSource | 对scribe的兼容 |
syslog source | syslogtcp syslogudp | 监听syslog,支持tcp或者udp; |
sequence source | seq | 用于测试,自动产生编号自增的数据 |
spooling directory source | 监控某个目录下的所有文件,将其新加入的文件作为数据源传输走; 每传输玩一个文件后,会被rename成其他名字(表示已经传输过)或者删掉; 默认监控目录下的文件具有:immutable、uniquely-named属性,否则会出错; | |
jms source | jms | 从消息队列获取数据。active mq |
用户也可以自己实现source,继承与类AbstractSource即可。配置时,type配置为类的全称。
channel
type | 简介 | |
memory channel | memory | 消息放在内存中,提供高吞吐,但不提供可靠性; 可能丢失数据; |
file channel | file | 对数据持久化;但是配置较为麻烦,需要配置数据目录和checkpoint目录; 不同的file channel均需要配置一个checkpoint 目录; By default the File Channel uses paths for checkpoint and data directories that are within the user home as specified above. As a result if you have more than one File Channel instances active within the agent, only one will be able to lock the directories and cause the other channel initialization to fail. |
jdbc channel | jdbc | 内置的derb数据库,对event进行了持久化,提供高可靠性; 看来是取代同样具有持久特性的file channel |
sinks
sinks,负责处理source来的数据,常用的如下:
type | 简介 | |
hdfs sink | hdfs | 将数据写到hdfs上; 可以配置目录(支持转义%Y-%m-%d); |
logger sink | logger | 采用logger,logger可以配置(可以直接输出到控制台,也可输出到文件); 注意:logger对event的body长度有限制,超过限制会截断; |
avro sink | avro | 发送给另外一个avro的source(当然也可以不是flume的source,可以是自己 开发的基于avro的server) |
thift sink | thrift | 发送给另外一个thrift的source |
IRC sink | irc | Internet Relay Chat |
file roll sink | file_roll | 本地file,支持rotate(可配置大小、时间、event count来进行rotate); |
null sink | null | 丢弃,等同于scribe的null store |
hbase sink | hbase asynchbase | 写到hbase中;需要配置hbase的table,columnFamily等信息; 比较扯淡的是,到底写入到哪一个hbase,取决于flume的classpath中碰到的第一个 hbase-site.xml; The Hbase configuration is picked up from the first hbase-site.xml encountered in the classpath. asynchbase支持可配置的hbase(配置zookeper,znode path) |
morphline solr sink | org.apache.flume.sink.solr.morphline.MorphlineSolrSink | Solr是一个基于Lucene java库的企业级搜索服务器。 transforms it, and loads it in near-real-time into Apache Solr servers, which in turn serve queries to end users or search applications. |
elastic search sink | org.apache.flume.sink.elasticsearch.ElasticSearchSink | 类似的同上,换成了elasticsearch cluster |
custom sink | $FQCN | full qualified class name |
flume测试
agent1:
source:netcat
channel:memory
sink:avro
agent2:
source: arvo
channel:memory
sink:hdfs
agent1将数据传输给agent2,agent2将数据写到hdfs上。
通过telnet可以向agent1发送测试数据。
使用hdfs的过程中,碰到的问题及解决方法如下:
1、出现找不到hadoop的方法
默认的flume中,不包含hadoop相关的jar包,因此需要将hadoop下的jar包拷贝到flume的lib下,或者将hadoop的jar包通过flume的--classpath增加到java的classpath中;
需要拷贝的jar包包括:
hadoop-annotations-*.jar
hadoop-auth-*.jar
hadoop-common-*.jar
hadoop-hdfs-*.jar
2、出现protocol.proto的rpc的 overrides finalmethod getUnknownFields错误
是因为flume和hadoop使用了不同版本的protocol版本,具体见FLUME-2172;
解决方法,将hadoop中的高版本(11)protocol拷贝到flume/lib下,删掉flume的低版本(10)
3、出现java.lang.NoSuchMethodError: com.google.common.cache.CacheBuilder.build()错误
google的jar不一致引起的,将hadoop下的guava-11.0.2.jar包拷贝到flume中,删掉flume中的低版本(10.0.1)
4、出现hadoo url解析不了
flume相当于一个hadoop hdfs的客户端,到目前为止只拷贝了jar包,并没有拷贝hadoop的配置,因此
需要让客户端能够“找到”正确的配置,并加载。由于配置较多,不便于拷贝,因此可以通过设置flume的classpath来解决,
启动flume-ng时,指定--classpath=$HADOOP_HOME/etc/即可。
5、当关闭(kill)flume-ng(hdfs sink)时,出现了如下错误:
java.lang.InterruptedException: Timed out before HDFS call was made. Your hdfs.callTimeout might be set too low or HDFS calls are taking too long
at org.apache.flume.sink.hdfs.BucketWwriter.checkAndThrowInterruptedException(BucketWriter.java:517)
....
错误
默认情况下: hdfs.callTimeout为10000(milliseconds),即10秒,根据集群状况进行配置。
flume其他功能
1、flume通过配置sink group,可以支持load balance功能;
2、还支持对source的interceptor机制(拦截),可以改写数据;
3、flume还支持filter功能,可以定制确定哪些数据需要sink;
参考文献: