【Flume NG用户指南】(1)设置


作者:周邦涛(Timen)
Email:zhoubangtao@gmail.com
转载请注明出处:  http://blog.csdn.net/zhoubangtao/article/details/27706813

简介部分请参考【Flume NG用户指南】(0)介绍

2 设置

2.1 设置一个Agent

Flume Agent配置存在本地的配置文件中。它是一个Java Properties文件格式的文本文件。一个配置文件中可以配置一个或多个Agent。配置文件包含了一个Agent中每一个Source、Sink和Channel的属性,以及它们如何连接起来形成数据流。

2.1.1 配置各自的组件

每一个组件(Source、Sink和Channel)都有name、type以及跟特性type相关联的其他属性集。例如,一个Avro Source需要一个hostname或者是IP地址以及一个端口号去接收数据。一个Memory Channel的最大队列数(“capacity”),一个HDFS Sink需要知道文件系统的URI,创建文件的路径以及文件循环的频率(“hdfs.rollInternal”)等等。一个组件的所有这些属性都需要被设置在这个Flume Agent所以来的配置文件中。

2.1.2 把各个组件串起来

Flume Agent需要知道加载什么样的组件,以及如何将这些组件按照循序串起来形成数据流。这就需要列出Agent中每一个Source、Sink和Channel的名字,然后为每一个Source和Sink指定连接的Channel。例如,一个Agent从一个叫avroWeb的Avro Source通过一个叫做file-channel的File Channel传输Event到一个叫hdfs-cluster1的HDFS Sink中。这个配置文件就需要包含这些组件的名字,并且file-channel作为avroWeb和hdfs-cluster1共享的Channel。

2.1.3 启动一个Agent

Agent通过一个叫做flume-ng的shell脚本启动,flume-ng位于Flume分发包的bin目录下。你需要在命令行指定Agent的名字、配置文件目录以及对应的配置文件:

$ bin/flume-ng agent -n $agent_name -c conf -f conf/flume-conf.properties.template

下载Flume Agent就会运行配置的Source和Sink了。

2.1.4 一个简单的例子

这里我们举一个配置文件例子,描述单节点Flume部署。这个配置文件用户生成Event并且把他们顺序地打印到console上。

# 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

这个配置文件定义了一个单独的叫做a1的Agent。a1有一个在44444端口上监听数据的Source,一个把Event暂存到Memory的Channel以及一个把Event数据打印到console的Sink。这个配置文件命名了各种各样的组件,然后描述了他们的类型和配置参数。一个给定的配置文件可能定义了多个命名的Agent;当一个给定的Flume进程要被启动时,一个标志会传进去来告诉它到底哪个命名的Agent要被启动。

基于这个配置文件,我们可以通过以下方式启动Flume:

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

注意在一个完整的部署中,我们通常会多包含一个配置:--conf=<conf-dir>。<conf-dir>目录包含一个叫做flume-env.sh的shell脚本和一个log4j配置文件。这个例子中我们传入了一个Java选项强制Flume把日志记录在console上,并且不使用定制的环境脚本。

从另一个shell终端,我们可以telnet 44444端口然后发送一个Event:

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

之前的Flume启动终端上就会用日志形式输出传入的Event。

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!下边的文章更详细的讲述了Agent 的配置。

2.1.5 安装第三方插件

Flume完整的基于插件的架构。Flume自来了很多直接可用的Source、Channel、Sink和Serializer。但是还有很多第三方的实现是跟Flume分开发行的。

你可以在flume-env.sh中把第三方的jar包添加到FLUME_CLASSPATH变量中来包含定制的组件,但是现在Flume支持一个叫做plugins.d的特殊目录,它会自动把按照一定格式打包起来的Plugin组装起来。这个可以更方便的管理插件打包,以及更简单的调试和跟踪,尤其是jar包依赖冲突。

2.1.5.1 plugins.d目录

plugins.d目录位于$FLUME_HOME/plugins.d。在启动时,flume-ng启动脚本查找plugins.d目录下符合以下格式的plugin,然后把他们包含到合适的路径上。

2.1.5.2 plugin的目录布局

每一个在plugins.d目录的plugin(其实就是子目录)能够包含三个子目录:

plugins.d目录下两个plugin的例子:

plugins.d/
plugins.d/custom-source-1/
plugins.d/custom-source-1/lib/my-source.jar
plugins.d/custom-source-1/libext/spring-core-2.5.6.jar
plugins.d/custom-source-2/
plugins.d/custom-source-2/lib/custom.jar
plugins.d/custom-source-2/native/gettext.so

2.2 数据采集

Flume支持很多从不同数据源采集数据的机制

2.2.1 RPC

Flume分发包中的一个Avro客户端可以通过Avro RPC机制将一个给定的文件发送给Flume Avro Source。

$ bin/flume-ng avro-client -H localhost -p 41414 -F /usr/logs/log.10

上边的命令会发送/usr/logs/log.10的内容发送到监听那个端口的Flume Source上。

2.2.2 执行命令

Flume分发包中有一个exec Source可一个执行一个给定的命令,并且消费的输出。一个输出的一行。例如以'\r'或'\n'或两者结尾的文本。

注:Flume不支持tail作为一个Source。不过你可以封装tail命令到一个exec Source中从而流化文件。

2.2.3 网络流

Flume支持一下的机制去从常用的日志流中读取数据,例如:

2.3 配置多Agent流


为了使数据跨多个Agent和hop传输,前一个Agent的Sink和当前Agent的Source需要时Avro类型的,并且Sink指向Source的hostname和port。

2.4 合并

日志收集中一个非常常见的场景是大量的日志生产客户端向少量的和存储系统关联的消费端Agent发送数据。例如,从成百上千个Web服务器收集日志然后发送到十几个写入HDFS集群的Agent。


这可以通过配置多个第一层的带有Avro Sink的Agent,并且所Avro Sink都指向一个单的Agent的Avro Source上。第二层Agent的Source合并接收过来的数据到单独的Channel中,然后由Sink消费并发送到目的地。

2.5 拆分流(多路输出)

Flume支持多路输出Event到一个或多个目的地。可以通过定义一个流多路输出器,它来复制或选择性路由一个Event到一个或多个Channel中。


上边的例子显示了一个叫“foo”的Agent的一个Source扇出数据流到三个不同的Channel中。这个扇出可以是复制或者多路输出。在复制流的情况下,每一个Event被发送到三个Channel中。在多路输出的情况下,一个Event根据它的属性和预定义值的匹配情况被传送到可用Channel一个子集中,例如,如果一个Event的属性叫做txnType,并且被设置为“customer”,然后它应该被传送到channel1和channel3中,如果被设置为“vendor”,它应该被传送到channel2中,否则channel3中。这些映射都可以在配置文件中进行配置。

关于Flume的配置请参考配置一文【Flume NG用户指南】(2)配置

作者:周邦涛(Timen)
Email:zhoubangtao@gmail.com
转载请注明出处:  http://blog.csdn.net/zhoubangtao/article/details/27706813

相关内容

    暂无相关文章