2018年第20周-Flume概念(简单例子)

Flume 1.8.0

简介

概要

Flume是一个分布式,可靠性和可用性的系统,此系统用于收集、聚合和移动大量数据日志数据,从各种各样的数据源将数据移动到数据存储中心。
Flume不仅仅是日志数据聚合。由于数据源是可以自定义,Flume可以用于传输大量事件数据(event data)不局限于流量数据,社交媒体数据,邮件信息等各种各样的数据。
Flume是Apache的顶级项目。
两个发布版本0.9.x和1.x。
此文档适用于版本1.x,0.9.x的文档在这http://archive.cloudera.com/c...
但还是推荐使用1.x版本,最新架构有性能的提升和灵活的配置。

系统要求(System Requirements)

1.Java1.8及以上的环境
2.内存——需根据source、channel或sink来决定
3.硬盘空间——需根据channel或sink来决定
4.目录权限——agent能够有该数据目录的读写权限

架构(Architecture)

数据流模型(Data flow model)

事件(event)是数据流的单元。可以是字节数据或者是文本。
agent是JVM进程(包含各个组件,如source、channel和sink),接受实践并传递给下个目标。

source消费从外部源(如web server)传递过来的事件。外部源传送的事件的格式需Flume的source认得。例如,Avro source可以接受Avro事件。
channel用于暂存source接受过来的事件,直到被sink消费。
sink从channel中将事件移动到外部存储,如HDFS(通过HDFS sink)。

2018年第20周-Flume概念(简单例子)

在agent里的source和sink都是异步运行的,事件存储在channel里。

复杂的流(Complex flows)

Flume运行用户构建多跳跃的流,也就是事件从一个agent留到下一个agent,可以多个agent。也允许fan-in和fan-out,路由和备份路由。

可靠性(Reliability)  

事件暂存在channel里,然后就被传送到下一个agent或最终仓库(如HDFS)。事件只有在下个一个channel保存了或最终仓库保存了,才会从上一个channel里删掉。这是Flume提供的传送语义。

Flume使用事务方法保证事件传递的可靠性。source和sink都封装了事务用于存储和获取。这个保证了多个事件能够可以可靠的点对点传送。

可恢复性(Recoverability)

channel负责从奔溃中恢复。Flume支持可持久化的file channel。但如果用memory channel虽然会快一些,但agent奔溃后,将无法恢复。

部署(Setup)

安装agent(Setting up an agent)

agent的配置文件是文本形式,类似与Java配置文件。多个agent可以使用同一个配置文件。配置文件包括source、sink和channel属性,以及它们之间怎么匹配。

配置独立组件(Configuring individual components)

流里面的每个组件(source、sink或channel)都是有自己的name、type等属性和实例。例如Avro source需要hostname和port去获取数据。memory channel需要最大队列数。HDFS sink需要知道文件系统的URI,创建文件的路径等。这些属性都是配置在一个文件中。

组合起来(Wiring the pieces together)

agent需要知道什么组件启动,以及它们是怎么连接。只需要在agent里把名字列出来,然后将source连接channl,channel接连sink即可。

启动agent(Starting an agent)

可以通过flume-ng命令来启动agent。启动时需指定agent名字、配置文件目录和配置文件。

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

一个简单的例子

以下是单节点flume的配置信息:

# 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

这配置可以让用户通过telnet工具连接4444端口,发送文本,然后在和日志logger中输出。

配置文件定义了一个名为a1的agent,此agent拥有一个source监听4444端口,一个channel将事件暂存在内存中,和一个sink将时间输出到console里。这配置文件定义了很多组件,然后定义它们的类型和其他配置信息。
配置文件可以定一个多个agent,启动flume进程时可以指定agent启动。
启动命令如下

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

在另外个终端启动telnet:

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

在之前的终端就会输出:

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配置。剩下的就是选择自己想使用的sink、channel或source去熟悉。

参考:http://flume.apache.org/Flume...

相关推荐