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

 

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

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值