flume初探

flume的历史

flume最早是由cloudera开发的一个分布式的、高可用、高可靠的日志收集系统。后将项目转移到apache进行管理,目前属于apache的顶级项目。

flume版本

在项目进入apache后,对flume进行了大规模的整体重构,由原始的一个分布式系统,逐渐的变为一个tool或者service。不再包含zookeeper等逐渐,也不存在master等管理节点。

flume版本对比

flume-0.xflume-1.x
项目托管clouderaapache
支持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包括:
flume支持的source介绍
source名source.type简介
avro sourceavro提供一个基于avro协议的server,bind到某个端口上,等待
avro协议客户端发过来的消息;一般在agent之间传输数据时,可以配置为avro
thrift sourcethrift同上,不过传输协议为thrift
exec sourceexec执行一个unix command,以其std out作为数据源;
命令可以通过<agent>.<source>.command配置,如:
tail -f /var/log/mesg。支持对命令或者脚本的自动重启
netcat sourcenetcat监控指定端口,每一行作为一个event传输;认为输入的数据为text的,每一行
的数据最大长度可配置(max-line-length)默认为512
http sourcehttp支持http的post和get(get仅仅用于测试)
scribe sourceorg.apache.flume.source.scribe.ScribeSource
对scribe的兼容
syslog sourcesyslogtcp
syslogudp
监听syslog,支持tcp或者udp;
sequence sourceseq用于测试,自动产生编号自增的数据
spooling directory source
监控某个目录下的所有文件,将其新加入的文件作为数据源传输走;
每传输玩一个文件后,会被rename成其他名字(表示已经传输过)或者删掉;
默认监控目录下的文件具有:immutable、uniquely-named属性,否则会出错;
jms sourcejms从消息队列获取数据。active mq

用户也可以自己实现source,继承与类AbstractSource即可。配置时,type配置为类的全称。

channel

channel

type简介
memory channelmemory消息放在内存中,提供高吞吐,但不提供可靠性;
可能丢失数据
file channelfile对数据持久化;但是配置较为麻烦,需要配置数据目录和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 channeljdbc内置的derb数据库,对event进行了持久化,提供高可靠性;
看来是取代同样具有持久特性的file channel

sinks

sinks,负责处理source来的数据,常用的如下:
flume支持的sink

type简介
hdfs sinkhdfs将数据写到hdfs上;
可以配置目录(支持转义%Y-%m-%d);
logger sinklogger采用logger,logger可以配置(可以直接输出到控制台,也可输出到文件);
注意:logger对event的body长度有限制,超过限制会截断;
avro sinkavro发送给另外一个avro的source(当然也可以不是flume的source,可以是自己
开发的基于avro的server)
thift sinkthrift发送给另外一个thrift的source
IRC sinkircInternet Relay Chat
file roll sinkfile_roll本地file,支持rotate(可配置大小、时间、event count来进行rotate);
null sinknull丢弃,等同于scribe的null store
hbase sinkhbase
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 sinkorg.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 sinkorg.apache.flume.sink.elasticsearch.ElasticSearchSink
类似的同上,换成了elasticsearch cluster
custom sink$FQCNfull 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;





参考文献:


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值