Hello~ Flume

导读:如想直接获知配置agent的方法,请阅读Setting up an agent小节。

Overview

概述

Apache Flume是一个高可靠、高可用的分布式的海量日志收集、聚合、传输系统。它可以从不同的日志源采集数据并集中存储。

Flume也算是Hadoop生态系统的一部分,源于Cloudera,目前是Apache基金会的顶级项目之一。Flume有两条产品线,0.9.x版本和1.x版本。本文主要介绍Flume 1.3.0,即"NG"产品线上的最新稳定版。(BTW,Flume是Apache 2.0  License)

Resource

资源

Architecutre

架构

数据流模型

Flume以agent为最小的独立运行单位。一个agent就是一个JVM。单agent由Source、Sink和Channel三大组件构成,如下图(图片摘自Flume官方网站):

Agent component diagram

Flume的数据流由事件(Event)贯穿始终。事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source,比如上图中的Web Server生成。当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。你可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。

很直白的设计,其中值得注意的是,Flume提供了大量内置的Source、Channel和Sink类型。不同类型的Source,Channel和Sink可以自由组合。组合方式基于用户设置的配置文件,非常灵活。比如:Channel可以把事件暂存在内存里,也可以持久化到本地硬盘上。Sink可以把日志写入HDFS, HBase,甚至是另外一个Source等等。

如果你以为Flume就这些能耐那就大错特错了。Flume支持用户建立多级流,也就是说,多个agent可以协同工作,并且支持Fan-inFan-out、Contextual Routing、Backup Routes。

高可靠性

作为生产环境运行的软件,高可靠性是必须的。

从单agent来看,Flume使用基于事务的数据传递方式来保证事件传递的可靠性。Source和Sink被封装进一个事务。事件被存放在Channel中直到该事件被处理,Channel中的事件才会被移除。这是Flume提供的点到点的可靠机制。

从多级流来看,前一个agent的sink和后一个agent的source同样有它们的事务来保障数据的可靠性。

可恢复性

 还是靠Channel。推荐使用FileChannel,事件持久化在本地文件系统里(性能较差)。

概念到此为止,下面开始实战。

Setting up an agent

Agent需要知道哪些组件将被启用,组件如何连接来构成数据流。用户只需要简单地提供一个配置文件来告诉agent该如何去做即可。

例子:事件源于一个netcat source,使用内存Channel,最后使用logger Sink把日志输出到控制台上。(例子源于Flume官方文档,请准备好Linux环境)

Agent是用一个名为flume-ng的脚本来启动的:

Flume 1.3:

$ bin/flume-ng agent -n $agent_name -c conf -f $property_file_path

Flume 1.2和之前版本:

$ bin/flume-ng node -c conf -f $property_file_path -n $agent_name
 

$agent_name:  agent的名字,随便给个名吧,注意和property文件里agent名一致

$property_file_path: 配置文件路径。

下面给出配置文件。(新建一个文件example.conf,粘贴以下内容,并保存)

# example.conf: A single-node Flume configuration

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444

# Describe the sink
a1.sinks.k1.type = logger

# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

该配置文件中agent的名字是a1,所以修改启动命令:

$ bin/flume-ng agent --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console

 1.2及更低版本的用户,请把命令中的agent改为node。

 接着速速启动Flume agent吧。启动前确保44444端口没有被占用。

启动成功后,使用telnet向Agent发送日志:

$ telnet localhost 44444

 会看到如下日志:

Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.

 输入你的日志内容,比如:Hello world!回车发送。

 得到如下日志,说明你已经成功发送日志:

$ telnet localhost 44444
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
Hello world! <ENTER>
OK

在Flume agent的控制台里你可以看到如下信息:

12/06/19 15:32:19 INFO source.NetcatSource: Source starting
12/06/19 15:32:19 INFO source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:44444]
12/06/19 15:32:34 INFO sink.LoggerSink: Event: { headers:{} body: 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 0D          Hello world!. }

至此,恭喜你!一个最简单的Flume agent已经正常工作了!

Setting multi-agent flow

设置多agent的流

先给几张官网的图:

Two agents communicating over Avro RPC

A fan-in flow using Avro RPC to consolidate events in one place

 大家可以按照官方用户手册来深入学习。

猜你喜欢

转载自joshuasabrina.iteye.com/blog/1806298