Flume 面试题总结

Flume 基础架构

  1. Agent

Agent 是一个 JVM 进程,它以事件的形式将数据从源头送至目的地。它主要由三个部分组成:Source、Channel、Sink。

  1. Source

Source 是负责接收数据到 Flume Agent 的组件。Source 组件可以处理各种类型、各种格式的日志数据。

  1. Sink

Sink 不断地轮询 Channel 中的时间且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者发送到另一个 Flume Agent。

4、Channel

Channel 是位于 Source 和 Sink 之间的缓冲区。因此,Channel 允许 Source 和 Sink 运作在不同的速率上。Channel 是线程安全的,可以同时处理几个 Source 的写入操作和几个 Sink 的读取操作。

Flume 自带三种 Channel:Memory Channel、File Channel 以及 JDBC Channel。

Memory Channel 是内存中的队列。Memory Channel 在不需要关心数据丢失的情况下使用。

自定义 Interceptor

自定义 CustomInterceptor 类并实现 org.apache.flume.interceptor.Interceptor 接口。重写 initialize()、intercept()、close()方法。intercept 方法有两个重载方法。

自定义 Source

MySource 需要继承 AbstractSource 类并实现 Configurable 和 PollableSource 接口,重写 getBackOffSleepIncrement()、getMaxBackOffSleepInterval()、configure(Context context)、process() 方法。

自定义 Sink

MySink 需要继承 AbstractSink 类并实现 Configurable 接口,重写 configure(Context context)、process() 方法。

Flume Channel 选择器

Channel 选择器可以让不同项目的日志通过不同的 Channel 到不同的 Sink 中去。官方有两种类型的选择器:Replicating Channel Selector 和 Multiplexing Channel Selector。前者会将Source 传过来的 Events 发往所有 Channel,而后者可以选择该发往哪些 Channel。默认的是前者。

如何实现Flume数据传输监控

使用基于 PHP 的第三方框架 Ganglia。

Flume参数调优

  1. Source

增加 Source 个数(使用 Tail Dir Source 时可以增加 FileGroups 个数)可以增加 Source 读取数据的能力。例如:当某一个目录产生的文件过多时需要将这个文件目录拆分成多个文件目录,同时配置多个 Source 分别监控不同的目录,以保证 Source 有足够的能力获取到新产生的数据。

  1. Channel

type 选择 memory 时 Channel 的性能最好,但是如果 Flume 进程意外挂掉可能会丢失数据。type 选择 file 时 Channel 容错性最好,但是性能比不上 memory channel。

使用 file channel 时 dataDirs 配置多个不同盘下的目录可以提高性能。

Capacity 参数决定 Channel 可容纳最大的 Event 条数。transactionCapacity 参数决定每次 Source 往 Channel 里面写的最大 Event 条数和每次 Sink 从 Channel 里面读的最大 Event 条数。transactionCapacity 需要大于 Source 和 Sink 的 batchSize 参数。

  1. Sink

增加 Sink 的个数可以增加 Sink 的消费能力,从而减轻 Channel 的压力。但是 Sink 也不是越多越好,过多的 Sink 也会占用系统资源,造成不必要的浪费。

batchsize 参数决定 Sink 一次批量从 Channel 读取的 Event 条数,适当调大这个参数可以提高 Sink 从 Channel 搬出 Event 的能力。

Flume 的事务机制

Flume 的事务机制(类似数据库的事务机制):Flume 使用两个独立的事务分别负责从 Source 到 Channel,以及从 Channel 到 Sink 的事件传递。比如 spooling directory source 为文件的每一行创建一个事件,一旦事务中所有的事件全部传递到 Channel 且提交成功,那么 Source 就将该文件标记为完成。同理,事务以类似的方式处理从 Channel 到 Sink 的传递过程,如果因为某种原因使得事件无法记录,那么事务将会回滚。且所有的事件都会保持到 Channel 中,等待重新传递。

Flume 采集数据会丢失吗

根据 Flume 的架构原理,Flume 是不会丢失数据的,其内部有完善的事务机制,Source 到 Channel 是事务性的,Channel 到 Sink 是事务性的,因此这两个环节不会出现数据丢失,唯一的可能性是 Channel 采用的是 memoryChannel,agent 宕机导致数据丢失,或者 Channel 存储数据已满,导致 Source 无法写入,造成数据丢失。

Flume 不会丢失数据,但是有可能造成数据的重复,例如数据已经成功由 Sink 发出,但是没有接收到响应,Sink 会再次发送数据,此时可能会导致数据的重复。

点个赞呗:程序员虾说 » Flume 面试题总结

赞 (0) 打赏

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. 风水很好啊,感谢分享回复

请作者喝杯咖啡~

支付宝扫一扫打赏

微信扫一扫打赏