Flume安装操作使用

jopen 8年前

1.    背景介绍

Flumecloudera20097月开源的日志系统。

Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。

Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。它的主要目标是把应用程序中的数据传送到Hadoop的分布式文件系统(HDFS)。它基于数据流构建了一个简单灵活的架构。它非常健壮,具有容错性。它使用了一个简单可扩展的数据模型,这种数据模型支持线上实时分析应用。

Flume主要用Java实现,而且已经通过类Unix操作系统的测试。

Flume有两大版本,flume-og(flume original generation)flume-ng(flume next generation)。以下提到flume,均指flume-ng版。

2.    学习资料

官方网站:http://flume.apache.org/

源码SVN下载地址:https://github.com/apache/flume

博客 http://blog.csdn.net/chinalgf/article/category/1333195

3. 下载安装

1.1        下载

系统环境: RedHat Enterprise Linux 6.3

官方下载地址:http://flume.apache.org/download.html

 

1.2  安装

Linux下安装

1.在终端进入Flume安装的目录,如/usr/local/flume,下载安装文件,解压

cd /usr/local/flume

wget http://www.apache.org/dyn/closer.cgi/flume/1.4.0/apache-flume-1.4.0-bin.tar.gz

tar -xzvf apache-flume-1.4.0-bin.tar.gz

2.Flume需要jdk1.6+环境,在安装flume之前先安装好JDK的环境

3.配置环境变量

vi /etc/profile  或者 vi ~/.bash_profile

export FLUME_HOME=/usr/local/flume  

export FLUME_LOG_DIR=$FLUME_HOME/log

export FLUME_CONF_DIR=$FLUME_HOME/conf

export PATH=$JAVA_HOME/bin:$PATH:$FLUME_HOME/bin

使配置生效 source /etc/profile

修改flume配置

cd $FLUME_CONF_DIR

cp flume-conf.properties.template flume-conf.properties

cp flume-env.sh.template flume-env.sh

4、测试安装是否成功

在终端里面输入“flume-ng -h”,如果打印出帮助信息说明已经安装成功。

4.    工作流程和原理

AgentFlume的基本单位。每个Agentsourcechannelsink三类组件构成,如下图。其中source在这里的角色类似生产者,负责收集agent外部传来的数据,这个数据可以是日志,也可以是上一级Agent通过网络发送过来的消息。收集到数据后,source会将它们传到一个或多个channel里,channel在这里起到缓冲的作用,在被sink消费前,消息停留在channel中。Sink就是消费者了,它负责从channel中取走消息,输出到存储介质(如HDFS)或下一跳Agent,等。更详细的资料参考http://flume.apache.org/FlumeUserGuide.html

Flume系统由多个agent互联组成,可以根据需求,建立各种agent的连接方式。

Flume内置了很多常用的组件,同时Flume也允许用户开发自己的组件。

Flume处理的基本数据单位是一个event,它有bodyheaders两部分组成,body中保存数据内容,headers中存储一些额外的信息。

5.    操作实例

一、FlumeAvro联合的实例

   把以下内容写入配置文件“conf/flume.conf”

 

# Define a memory channel called ch1 on agent1

agent1.channels.ch1.type = memory

 

# Define an Avro source called avro-source1 on agent1 and tell it

# to bind to 0.0.0.0:41414. Connect it to channel ch1.

agent1.sources.avro-source1.channels = ch1

agent1.sources.avro-source1.type = avro

agent1.sources.avro-source1.bind = 0.0.0.0

agent1.sources.avro-source1.port = 41414

 

# Define a logger sink that simply logs all events it receives

# and connect it to the other end of the same channel.

agent1.sinks.log-sink1.channel = ch1

agent1.sinks.log-sink1.type = logger

 

# Finally, now that we've defined all of our components, tell

# agent1 which ones we want to activate.

agent1.channels = ch1

agent1.sources = avro-source1

agent1.sinks = log-sink1

 

在终端1输入下面的命令,启动Agent

bin/flume-ng agent --conf ./conf/ -f conf/flume.conf -Dflume.root.logger=DEBUG,console -n agent1


然后在另一个终端2里面启动avro-client,

bin/flume-ng avro-client --conf conf -H localhost -p 41414 -F /etc/passwd -Dflume.root.logger=DEBUG,console

 

如果在终端1当中打印出下面的信息,那么实例成功

2014-03-31 13:56:26,354 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:70)] Event: { headers:{} body: 72 6F 6F 74 3A 78 3A 30 3A 30 3A 72 6F 6F 74 3A root:x:0:0:root: }

2014-03-31 13:56:26,355 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:70)] Event: { headers:{} body: 62 69 6E 3A 78 3A 31 3A 31 3A 62 69 6E 3A 2F 62 bin:x:1:1:bin:/b }

2014-03-31 13:56:26,355 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:70)] Event: { headers:{} body: 64 61 65 6D 6F 6E 3A 78 3A 32 3A 32 3A 64 61 65 daemon:x:2:2:dae }

2014-03-31 13:56:26,355 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:70)] Event: { headers:{} body: 61 64 6D 3A 78 3A 33 3A 34 3A 61 64 6D 3A 2F 76 adm:x:3:4:adm:/v }

2014-03-31 13:56:26,356 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:70)] Event: { headers:{} body: 6C 70 3A 78 3A 34 3A 37 3A 6C 70 3A 2F 76 61 72 lp:x:4:7:lp:/var }

...

 

详解:

本实例创建了一个内存通道——ch1、Avro RPC源——avro-source1和一个日志sink——log-sink1。任何从avro-source1发送到ch1的事件,都会被传送到log-sink1。

Flume提供了各种各样的sources、sinks和channels,不同的插件具有特定的可选的和必须的配置,具体信息参考:http://flume.apache.org/FlumeUserGuide.html