1 Flume概述
Flume是一种分布式(distributed),可靠(reliable)且可用(available)的服务,用于高效地收集,汇总和移动大量日志数据。它具有基于流式数据流的简单而灵活的架构。它有可靠性机制和许多故障转移和恢复机制,具有强大的容错性和容错能力。它使用一个简单的可扩展数据模型,允许在线分析应用程序。
Apache Flume 1.8.0是Flume作为Apache顶级项目(TLP)的第11个版本。Apache Flume 1.8.0是可用于生产的软件。目前有两个发布代码行,版本0.9.x和1.x.本文档适用于1.4.x及其以后的版本。
系统要求:
Java运行时环境 - Java 1.8或更高版本。目录权限 - 代理(agent)使用目录的读/写权限
1、Flume是一个数据收集工具,具有强大的容灾和容错能力,可用于在线分析。 2、Flume的最新版本为1.8.0。可用于生产。 3、Flume有两个发布的版本,一个是0.9.x,一个是1.x。推荐使用1.x版本。本文档适用于1.4.x及其以后的版本。 4、Flume对系统的要求,Java要求1.8或者更高,Flume要有操作目录的读写权限。 |
2 Flume架构
Flume event是一个数据流单元,里面装载着byte类型的数据,这组数据的属性是可选的,可配置的。Flume agent是一个(JVM)进程,是用于承载event从外部源流向下一个目标(hop)的组件。
Flume source消费由外部源(如Web服务器)传递给它的event。外部源以Flume source识别的格式向Flume发送event。例如,Avro source可用于接收来自Avro客户端或另一个agent的Avro sink发送的event。使用Thrift Flume Source可以定义类似的流程,以接收来自Thrift Sink或Flume Thrift Rpc客户端的event。当source接收event时,它会将其存储到一个或多个channel。Channel可以存储event,直到event被sink消费。File channel就是一个例子,HDFS sink从channel中删除event并将event放入HDFS等外部存储库或将其转发到流中下一个agent(下一个hop)的source。agent中的source和sink与channel中的event异步运行。
Flume允许用户构建多级hop,event在到达最终目的地之前通过多个agent传播。它还允许扇入(fan-in)和扇出(fan-out)流,上下文路由和备份路由(故障转移)。
这些event在每个agent的channel中进行组织。然后将event传递到流中的下一个agent或终端存储库(如HDFS)。仅当event存储在下一个agent的channel或终端存储库中后才会从channel中删除event。这是Flume如何提供流的端到端可靠性原理。
Flume采用事务(transaction)来保证事件的可靠传递。这确保了该组事件可靠地在流程中从点到点传递。在多跳流情况下,来自前一个hop的sink和来自下一个hop的source都以事务运行,以确保数据安全地存储在下一个hop的channel中。
这些event在channel中组织,channel负责从失败中恢复。Flume支持由本地文件系统支持的持久file channel。还有一个memory channel,它将event简单地存储在内存队列中,速度更快,但是当agent进程死亡时仍然留在memory channel中的任何event都无法恢复。
1、Flume有三个组件,source、channel和sink,它们合起来称为一个agent,也可以理解为一个hop。启动后的一个agent就是一个JVM进程。在同一个agent中,source,channel和sink可以有多个。 2、source可以有多种类型,收集某种类型的数据就使用对应的source。Channel和sink也是一样的。每种具体的类型有多种参数可以配置。 3、Flume将数据封装为event,在channel中存储和恢复。数据(也就是Flume封装好的event)在一个agent中的流向一定是中source到channel,再到sink。 4、agent中的source和sink与channel中的event异步运行。 5、仅当event存储在下一个agent的channel或终端存储库中后才会从channel中删除event。 6、Flume采用事务(transaction)来保证event的可靠传递。 7、channel负责从失败中恢复event。当channel的类型为memory channel时,Flume是无法实现容灾的。虽然memory channel的速度会更快。 |
3 使用
Flume agent配置文件存储在本地配置文件中。这是一个遵循Java properties文件格式的文本文件。一个或多个agent的配置文件可以在同一个配置文件目录中指定。配置文件包括agent中每个source,channel和sink的属性,以及它们如何连接在一起形成数据流。
流中的每个组件(source,sink或channel)都具有特定的类型和实例的名称、类型和一组属性。例如,Avro source需要主机名(或IP地址)和端口号才能接收数据。Memory channel可以具有最大队列大小(capacity),HDFS sink需要知道文件系统URI,创建文件的路径等。组件的所有这些属性需要在属性文件中进行设置。
agent需要知道要加载的单个组件以及它们如何连接以构成流。这是通过列出agent中每个source,sink和channel的名称,然后为每个source和sink指定连接channel来完成的。例如,agent通过称为File channel的文件通道将来自Avro source的event(称为avroWeb)传输到HDFS sink hdfs-cluster1。配置文件将包含这些组件和文件通道的名称,作为avroWeb source和hdfs-cluster1 sink的共享通道。
代理程序使用名为flume-ng的shell脚本启动,该脚本位于Flume的bin目录中。需要在命令行上指定代理名称,配置目录和配置文件:
$ bin / flume-ng agent -n $ agent_name -c conf -f conf / flume-conf.properties.template |
现在代理将开始运行在给定属性文件中配置的source和sink。
配置示例:
如下给出了一个示例配置文件,描述单节点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 |
该配置定义了一个名为a1的agent。a1有一个侦听端口44444上的数据的source,一个缓存内存中事件数据的channel,以及一个将event数据记录到控制台的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>目录将包括一个shell脚本flume-env.sh和一个log4j的属性文件。在这个例子中,我们传递一个Java选项来强制Flume将日志输出到控制台,并且我们没有自定义环境脚本。
从一个单独的终端,我们可以telnet端口44444并发送一个event给Flume:
$ telnet localhost 44444 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. Hello world! <ENTER> OK |
原始的Flume终端将在日志消息中输出事件。
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!. } |
1、Flume依靠配置文件启动。多个配置文件可以存放在一个配置文件目录下面。每个配置文件可以配置多个agent。每个agent需要指定source、channel和sink,以及它们是如何绑定在一起的。每个具体的source类型的参数是不同的,根据它们的实际情况来确定,channel和sink的情况也是一样的。 2、Flume程序通过flume-ng这个脚本启动。启动时需要在命令行上指定代理名称,配置目录和配置文件目录。配置文件目录应该包括一个flume-env.sh和一个log4j的属性文件。 |