以前一直在使用Facebook开源的Scribe作为项目中的日志收集系统,Scribe能够满足我们需求,不过前段时间看到了几种分布式日志收集系统的比对之后,发现Cloudera的Flume从实现上来说更加完善,最近有时间探索了一下。


1 安装,作为Cloudera发行版的一大优势,安装从来不是什么麻烦的问题,只要我们将CDH的源(目前支持Ubuntu,CentOS,OpenSUSE等)加入到系统中,就可以通过系统的包管理工具来安装了,具体请参见:https://ccp.cloudera.com/display/CDH4DOC/Flume+Installation


2. 使用,首先我们要了解Flume的几个组件的概念:Source,Channel和Sink。

source:顾名思义,就是数据的来源,这个来源可以来自Web Service中封装的客户端(AVRO客户端),可以是NETCAT服务,也可以是一个不断增长的日志文件(tail -f)。

channel:提供了一层缓冲机制,来实现数据的事务性传输,最大限度保证数据的安全传输。这层缓冲可以在内存中,可以在文件中、数据库中,当然也可以是自定义的实现。

sink:将数据转发到目的地,或者继续将数据转发到另外一个source,实现接力传输。可以通过AVRO Sink来实现。

下面是一个已经测试通过的Flume的配置实例:

syslog-agent.sources = Syslog
syslog-agent.channels = MemoryChannel-1
syslog-agent.sinks = HDFS-LAB

# For each one of the sources, the type is defined
syslog-agent.sources.Syslog.type = exec
syslog-agent.sources.Syslog.command = tail -f /var/log/hadoop/hadoop-hadoop-namenode-test00.log
# The channel can be defined as follows.
syslog-agent.sources.Syslog.channels = MemoryChannel-1

# Each sink's type must be defined
syslog-agent.sinks.HDFS-LAB.type = hdfs
#Specify the channel the sink should use
syslog-agent.sinks.HDFS-LAB.channel = MemoryChannel-1
syslog-agent.sinks.HDFS-LAB.hdfs.path = hdfs://test00:9000/flumetest/
syslog-agent.sinks.HDFS-LAB.hdfs.filePrefix = data
syslog-agent.sinks.HDFS-LAB.hdfs.file.rollInterval = 60
syslog-agent.sinks.HDFS-LAB.hdfs.fileType = DataStream
syslog-agent.sinks.HDFS-LAB.hdfs.rollSize = 1073741824
syslog-agent.sinks.HDFS-LAB.hdfs.rollCount = 0
syslog-agent.sinks.HDFS-LAB.hdfs.rollInterval = 10

# Each channel's type is defined.
syslog-agent.channels.MemoryChannel-1.type = memory

# Other config values specific to each type of channel(sink or source)
# can be defined as well
# In this case, it specifies the capacity of the memory channel
syslog-agent.channels.MemoryChannel-1.capacity = 1000

其中的syslog-agent是我们启动时需要指定的agent的name:

flume-ng agent --conf-file flume.conf --name syslog-agent

然后我们指定了agent的source,channel和sink。我们的source,也就是数据的来源,来自于对一个日志文件的追踪,这里我们执行了tail -f命令来追踪hadoop namenode的日志;

我们指定使用内存来作为channel的存储媒介,其存储容量是1000条日志;
最后就是我们数据写入的sink——HDFS sink,它将我们的数据以DataStream(也就是原始文本)的形式写入我们指定的HDFS路径下。

具体的配置说明信息可以参见:http://archive.cloudera.com/cdh4/cdh/4/flume-ng/FlumeUserGuide.html

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐