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)。
在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去熟悉。