一:概述
Apache Flume是一个分布式,可靠且可用的系统,用于有效地从许多不同的源收集,聚合和移动大量日志数据到集中式数据存储。
Apache Flume的使用不仅限于日志数据聚合。由于数据源是可定制的,因此Flume可用于传输大量事件数据,包括但不限于网络流量数据,社交媒体生成的数据,电子邮件消息以及几乎任何可能的数据源。
二:数据流模型
Flume事件被定义为具有字节有效负载和可选字符串属性集的数据流单元。Flume代理是一个(JVM)进程,它承载事件从外部源流向下一个目标(跃点)的组件。
Flume源消耗由外部源(如Web服务器)传递给它的事件。外部源以目标Flume源识别的格式向Flume发送事件。例如,Avro Flume源可用于从Avro客户端或从Avro接收器发送事件的流中的其他Flume代理接收Avro事件。可以使用Thrift Flume Source定义类似的流程,以接收来自Thrift Sink或Flume Thrift Rpc客户端或Thrift客户端的事件,这些客户端使用Flume thrift协议生成的任何语言编写。当Flume源接收事件时,它将其存储到一个或多个频道。该通道是一个被动存储器,可以保持事件直到它被Flume接收器消耗。文件通道就是一个例子 - 它由本地文件系统支持。接收器从通道中移除事件并将其放入外部存储库(如HDFS(通过Flume HDFS接收器))或将其转发到流中下一个Flume代理(下一跳)的Flume源。给定代理程序中的源和接收器与通道中暂存的事件异步运行。
复杂的流程:
Flume允许用户构建多跳流,其中事件在到达最终目的地之前经过多个代理。它还允许扇入和扇出流,上下文路由和故障跳转的备份路由(故障转移)。
可靠性:
事件在每个代理的通道中进行。然后将事件传递到流中的下一个代理或终端存储库(如HDFS)。只有将事件存储在下一个代理的通道或终端存储库中后,才会从通道中删除这些事件。这就是Flume中的单跳消息传递语义如何提供流的端到端可靠性。
Flume使用事务方法来保证事件的可靠传递。源和接收器分别在事务中封装由信道提供的事务中放置或提供的事件的存储/检索。这可确保事件集在流中从一个点到另一个点可靠地传递。在多跳流的情况下,来自前一跳的接收器和来自下一跳的源都运行其事务以确保数据安全地存储在下一跳的信道中。
可恢复性:
事件在通道中进行,该通道管理从故障中恢复。Flume支持一个由本地文件系统支持的持久文件通道。还有一个内存通道,它只是将事件存储在内存中的队列中,这更快,但是当代理进程死亡时仍然留在内存通道中的任何事件都无法恢复。
设置代理:
Flume代理配置存储在本地配置文件中。这是一个遵循Java属性文件格式的文本文件。可以在同一配置文件中指定一个或多个代理的配置。配置文件包括代理中每个源,接收器和通道的属性以及它们如何连接在一起以形成数据流。
配置单个组件:
流中的每个组件(源,接收器或通道)都具有特定于类型和实例化的名称,类型和属性集。例如,Avro源需要主机名(或IP地址)和端口号来接收数据。内存通道可以具有最大队列大小(“容量”),HDFS接收器需要知道文件系统URI,创建文件的路径,文件轮换频率(“hdfs.rollInterval”)等。组件的所有此类属性需要在托管Flume代理的属性文件中设置。
将各个部分连接在一起
代理需要知道要加载哪些组件以及它们如何连接以构成流。这是通过列出代理中每个源,接收器和通道的名称,然后为每个接收器和源指定连接通道来完成的。例如,代理通过名为file-channel的文件通道将事件从名为avroWeb的Avro源流向HDFS sink hdfs-cluster1。配置文件将包含这些组件的名称和文件通道,作为avroWeb源和hdfs-cluster1接收器的共享通道。
启动Flume
使用名为flume-ng的shell脚本启动代理程序,该脚本位于Flume发行版的bin目录中。您需要在命令行上指定代理名称,配置目录和配置文件:
$ bin / flume-ng agent -n $ agent_name -c conf -f conf / flume-conf.properties.template
在这里,我们给出一个示例配置文件,描述单节点Flume部署。此配置允许用户生成事件,然后将其记录到控制台。
#example.conf:单节点Flume配置
#为此代理 命名 组件a1.sources = r1 a1.sinks = k1 a1.channels = c1
#描述/配置源 a1.sources.r1.type = netcat a1.sources.r1.bind = localhost a1.sources.r1.port = 44444
#描述接收器 a1.sinks.k1.type = logger
#使用缓冲内存中事件的通道 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100
#将源和接收器绑定到通道 a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1 此配置定义名为a1的单个代理。a1有一个侦听端口44444上的数据的源,一个缓冲内存中事件数据的通道,以及一个将事件数据记录到控制台的接收器。配置文件命名各种组件,然后描述其类型和配置参数。给定的配置文件可能会定义几个命名的代理 当一个给定的Flume进程启动时,会传递一个标志,告诉它要显示哪个命名代理。
鉴于此配置文件,我们可以按如下方式启动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和潜在的一个log4j的属性文件。在这个例子中,我们传递一个Java选项来强制Flume登录到控制台,我们没有自定义环境脚本。
从一个单独的终端,我们可以telnet端口44444并向Flume发送一个事件:
$ telnet localhost 44444 试试127.0.0.1 ...... 连接到localhost.localdomain(127.0.0.1)。 逃脱角色是'^]'。 你好,世界!<ENTER> 好
原始的Flume终端将在日志消息中输出事件。
19年12月6日15 :32:19 INFO source.NetcatSource:源起 19年12月6日15 :32:19 INFO source.NetcatSource:创建的ServerSocket:sun.nio.ch.ServerSocketChannelImpl [/127.0.0.1:44444] 19年12月6日15 :32:34 INFO sink.LoggerSink:事件:{头:{}体:48 65 6C 6F 6C 20 77 72 6F 6C 64 21 0D世界你好!} 恭喜 - 您已成功配置并部署了Flume代理!