Flume使用详解

楼高2年前技术文章815

一、Flume概念

Flume 是 Cloudera 提供的日志收集系统,具有分布式、高可靠、高可用性等特点,对海量 日志采集、聚合和传输,Flume 支持在日志系统中定制各类数据发送方,同时,Flume 提 供对数据进行简单处理,并写到各种数据接受方的能力

二、Flume部署

1、官网下载Flume安装包,解压即可,无需编译 

2、设置Flume环境变量

3、修改配置文件,重命名 flume-conf.properties.template 文件为 simple.conf,也可以自定义一个配置文件。

三、Flume基本组件

1、Sources(输入端口)

Source 是负责接收数据到 Flume Agent 的组件。Source 组件可以处理各种类型、各种 格式的日志数据,包括 avro、thrift、exec、jms、spooling directory、netcat、taildir、 sequence generator、syslog、http、legacy。

2、Channle(管道或传输频道)

Channel 是位于 Source 和 Sink 之间的缓冲区。因此,Channel 允许 Source 和 Sink 运 作在不同的速率上。Channel 是线程安全的,可以同时处理几个 Source 的写入操作和几个 Sink 的读取操作。 Flume 自带两种 Channel:Memory Channel 和 File Channel。 Memory Channel 是内存中的队列。Memory Channel 在不需要关心数据丢失的情景下适 用。如果需要关心数据丢失,那么 Memory Channel 就不应该使用,因为程序死亡、机器宕 机或者重启都会导致数据丢失。 File Channel 将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数 据。

3、Sink(输出端口) 

Sink 不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储 或索引系统、或者被发送到另一个 Flume Agent。 Sink 组件目的地包括 hdfs、logger、avro、thrift、ipc、file、HBase、solr、自定 义。

四、Flume架构

1、数据流 

Flume 的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到 目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。 Flume 传输的数据的基本单位是 Event,如果是文本文件,通常是一行记录,这也是事务的 基本单位。Event 从 Source,流向 Channel,再到 Sink,本身为一个 byte 数组,并可携带 headers 信息。Event 代表着一个数据流的最小完整单元,从外部数据源来,向外部的目的 地去。 Flume 运行的核心是 Agent。它是一个完整的数据收集工具,含有三个核心组件,分别是 source、channel、sink。通过这些组件,Event 可以从一个地方流向另一个地方,如下图 所示。

image.png

source 可以接收外部源发送过来的数据。不同的 source,可以接受不同的数据格式。比如 有目录池(spoolingdirectory)数据源,可以监控指定文件夹中的新文件变化,如果目录中有 文件产生,就会立刻读取其内容。 channel 是一个存储地,接收 source 的输出,直到有 sink 消费掉 channel 中的数据。channel 中的数据直到进入到下一个 channel 中或者进入终端才会被删除。当 sink 写入失败后,可 以自动重启,不会造成数据丢失,因此很可靠。 sink 会消费 channel 中的数据,然后送给外部源或者其他 source。如数据可以写入到 HDFS 或者 HBase 中。 sink 会消费 channel 中的数据,然后送给外部源或者其他 source。如数据可以写入到 HDFS 或者 HBase 中。 flume 允许多个 agent 连在一起,形成前后相连的多级跳。

2、Source 核心组件

Client 端操作消费数据的来源,Flume 支持 Avro,log4j,syslog 和 httppost(body 为 json 格式)。可以让应用程序同已有的 Source 直接打交道,如 AvroSource,SyslogTcpSource。 也可以写一个 Source,以 IPC(进程间通信协议)或 RPC(远程进程间通信协议)的方式接入自 己的应用,Avro 和 Thrift 都可以(分别有 NettyAvroRpcClient 和 ThriftRpcClient 实现了 RpcClient 接口),其中 Avro 是默认的 RPC 协议。具体代码级别的 Client 端数据接入,可 以参考官方手册。 对现有程序改动最小的使用方式是使用是直接读取程序原来记录的日志文件,基本可以实现 无缝接入,不需要对现有程序进行任何改动。对于直接读取文件 Source,有两种方式: ExecSource:以运行 Linux 命令的方式,持续的输出最新的数据,如 tail-F 文件名指令,在 这种方式下,取的文件名必须是指定的。ExecSource 可以实现对日志的实时收集,但是存 在 Flume 不运行或者指令执行出错时,将无法收集到日志数据,无法保证日志数据的完整 性。 SpoolSource:监测配置的目录下新增的文件,并将文件中的数据读取出来。需要注意两点: 拷贝到 spool 目录下的文件不可以再打开编辑;spool 目录下不可包含相应的子目录。 SpoolSource 虽然无法实现实时的收集数据,但是可以使用以分钟的方式分割文件,趋近于 实时。如果应用无法实现以分钟切割日志文件的话,可以两种收集方式结合使用。在实际使 用的过程中,可以结合 log4j 使用,使用 log4j 的时候,将 log4j 的文件分割机制设为 1 分钟 一次,将文件拷贝到 spool 的监控目录。log4j 有一个 TimeRolling 的插件,可以把 log4j 分 割文件到 spool 目录。基本实现了实时的监控。Flume 在传完文件之后,将会修改文件的后 缀,变为.COMPLETED(后缀也可以在配置文件中灵活指定)。

3、Channel 核心组件 

当前有几个 channel 可供选择,分别是 MemoryChannel,JDBCChannel,FileChannel, PsuedoTransactionChannel。比较常见的是前三种 channel。 MemoryChannel 可以实现高速的吞吐,但是无法保证数据的完整性。 MemoryRecoverChannel 在官方文档的建议上已经建义使用 FileChannel 来替换。 FileChannel 保证数据的完整性与一致性。在具体配置 FileChannel 时,建议 FileChannel 设置的目录和程序日志文件保存的目录设成不同的磁盘,以便提高效率。 FileChannel 是一个持久化的隧道(channel),它持久化所有的事件,并将其存储到磁盘中。 因此,即使 Java 虚拟机当掉,或者操作系统崩溃或重启,再或者事件没有在管道中成功地 传递到下一个代理(agent),这一切都不会造成数据丢失。MemoryChannel 是一个不稳定 的隧道,其原因是由于它在内存中存储所有事件。如果 java 进程死掉,任何存储在内存的 事件将会丢失。另外,内存的空间收到 RAM 大小的限制,而 FileChannel 这方面是它的优势, 只要磁盘空间足够,它就可以将所有事件数据存储到磁盘上。

4、Sink 核心组件 Sink 在设置存储数据时,可以向文件系统、数据库、hadoop 存数据,在日志数据较少时, 可以将数据存储在文件系中,并且设定一定的时间间隔保存数据。在日志数据较多时,可以 将相应的日志数据存储到 Hadoop 中,便于日后进行相应的数据分析.更多 sink 的内容可以 参考官方手册。

五、可靠性 

Flume 的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到 目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。 Flume 使用事务性的方式保证传送 Event 整个过程的可靠性。Sink 必须在 Event 被存入 Channel 后,或者,已经被传达到下一站 agent 里,又或者,已经被存入外部数据目的地之 后,才能把 Event 从 Channel 中 remove 掉。这样数据流里的 event 无论是在一个 agent 里还是多个 agent 之间流转,都能保证可靠,因为以上的事务保证了 event 会被成功存储起 来。而 Channel 的多种实现在可恢复性上有不同的保证。也保证了 event 不同程度的可靠 性。比如 Flume 支持在本地保存一份文件 channel 作为备份,而 memorychannel 将 event 存在内存 queue 里,速度快,但丢失的话无法恢复。

六、可恢复性 

Flume恢复还是靠 Channel。推荐使用 FileChannel,事件持久化在本地文件系统里(性能较差)。

相关文章

REPMGR-PG高可用搭建(一)

REPMGR-PG高可用搭建(一)

PG高可用对比数据库复制的术语和定义这些术语和定义应该有助于讨论复制。在与其他Postgres开发人员进行了大量讨论之后,我编译了它们,但是这些定义应该是普遍可用的,并且也应该适用于其他RDBMS。复...

PG的表膨胀

1 什么是表膨胀众所周知,PostgreSQL的多版本并发是通过保留变更前的记录来实现的。当数据记录被DML修改,旧版本记录仍保留不变,仅仅需要修改相关记录的xmin、xmax属性,并新增写入变更后的...

MySQL运维实战(2.2)忘记密码如何处理

如果忘记了一个普通用户的密码,可以使用管理员账号登录,修改其他用户的密码。但是如果所有管理员账号的密码都忘记了,应该怎么处理呢?如果忘记root密码,可以使用skip-grant-tables参数启动...

网络策略NetworkPolicy

网络策略NetworkPolicy

目的:为了实现细粒度的容器间网络访问隔离策略。引用:1.3版本NetworkPolicy机制 -> 1.8版本networking.k8s.io/v1稳定版本功能:对pod、ns之间网络通信限制...

HDFS元数据损坏恢复方法

HDFS元数据损坏恢复方法

HDFS JournalNode 编辑目录(dfs.journalnode.edits.dir)下数据损坏(单节点损坏或所有节点数据损坏),如何恢复 HDFS?单节点损坏a)  &...

kubernetes dashboard

kubernetes dashboard

1、背景Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。你可...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。