共计 2500 个字符,预计需要花费 7 分钟才能阅读完成。
这篇文章主要讲解了“Apache Flume 是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“Apache Flume 是什么”吧!
Flume 是为高效收集聚合大量日志数据设计的可靠的、可用的分布式系统。它有一个基于流式数据流的简单灵活的体系。它提供了可控的可靠机制和许多故障转移与恢复机制。它使用了一个用于在线分析应用的简单可扩展的数据模型。
FileChannel 是一个持久化的 Flume channel,支持并行的写到多个磁盘并且支持加密。
概念
当使用 Flume 时,每个流程都有一个 Source、Channel、Sink。一个典型的例子是一个 webserver 通过 RPC(比如:AvroSource)将 events 写到一个 Source、然后 Source 将 events 写到 MemoryChannel,最后 HDFSSink 消费 event,将它写到 HDFS。
MemoryChannel 能提供很高的吞吐量,但是当系统断电或程序崩溃时会丢失数据。因此人们急需一个能持久化的 Channel。FileChannel 在 FLUME-1085 被实现。它的目标是提供一个可靠的高吞吐量的 Channel。FileChannel 保证当断电或崩溃发生时,事务被提交,没有数据丢失。
重要的一点是 FileChannel 不做任何数据的复制,仅依赖于底层磁盘的可靠性,因此,由于持久性需要使用 FileChannel 的用户在购买和配置硬件时注意这一点。底层的磁盘将要做 RAID、SAN 或类似的东西。
许多系统为了高的吞吐率需要拿允许小量数据丢失做交换。Flume 组决定 FileChannel 采用不同的方式。Flume 是一个支持事务的系统,多个 event 可以在单个事务中被 put 或 take。batch size 用来控制吞吐率。使用大的 batch size,flume 可以以高吞吐率移动数据,并且不丢失数据。batch size 完全可以通过 client 控制。这个方法与 DBMS
相似。
一个 flume 事务包含 put 或 take,一个事务中不能同时有 put 和 take 操作。每个事务都要实现 put 和 take 方法。source 通过 put 将 event 放入 channel,sink 通过 take 将 event 从 channel 拿走。
设计
FileChannel 是基于内存队列和 WAL 设计的。每次事务都是根据事物类型(Take 和 Put)写到 WAL,队列也做相应的修改。每次事务被 commited,都会调用 fsync 确保 events 被存储在磁盘文件,同时指向该 event 的指针被放到队列中。这里的队列服务就像其他队列一样:它管理着什么被 sink 消费。在 Take 期间,该 event 的指针从队列被删除。直接从 WAL 读这个 event。由于今天我们有大量可用的 RAM,从操作系统的文件缓存中读取也是经常发生的。
崩溃后,通过重放 WALs,队列位置能恢复到崩溃前同样的状态,而那些没有 commited 的事务被丢弃。重放 WALs 相当耗时,因此队列本身会周期性的写到磁盘。将队列写到磁盘称为 checkpoint。这样,崩溃后,队列首先从磁盘 checkpoint 文件加载,然后仅仅重放那些队列被最后一次 checkpoint 到磁盘后 commited 的事务,这样明显的减少了读取 WAL 的数量。
例如,一个 channel 有 2 个 event,如下所示:
WALs 包含 3 个重要的属性:事务 ID、序列号、event 数据。每个事务都有唯一的事务 Id,并且每个 event 都有唯一的序列号。事务 Id 被用来简单的将 event 分组到同一事务,而序列号在重放 log 时使用。上图中,事务 ID 为 1,序列号为 1,2,3.
当队列被 checkpoint 到磁盘,增加序列号,同时序列号也被保存到磁盘。重启时,队列首先从磁盘加载,然后比队列序列号大的任何 WAL 实体被重放。checkpoin 操作期间,队列是 locked,以至于没有 Put 或 Take 操作可以更改它的状态。如果 checkpoint 期间允许队列的修改,将导致磁盘存储的队列快照与实际队列不一致。
在上面例子中,事务 1commited 后,checkpoint 发生,在队列中的结果带着 events 被保存到磁盘还有序列号 4 也被保存。
之后,在事务 2 中,从队列 take 一个 event:
如果这个时候崩溃了,重启时队列从 checkpoint 加载,注意,checkpoint 发生在事务 2 前,2 个 event“a”和“b”都会被加载到队列,之后任何比 4 大的已经确认的事务被重放,重放后,“a”event 从队列被删除。 上面的设计 2 点没有考虑到,Take 或 Put 进行中,同时发生 checkpoint,会导致数据丢失。假定 checkpoint 发生在 take“a”之后:
如果此时崩溃,在以上描述的设计下,event“b”被加载进入队列,之后重放比 5 大的任何 WAL 实体,事务 2 被 rollback,但是这里的 take“a”不会被重放。event“a”被丢失,Put 也存在相似的情况。由于这个原因,当队列的 checkpoint 发生时,仍然在处理中的事务也被写出,以至于可以适当的处理这个问题。
实现
FileChannel 在 Flume 项目的 flume-file-channel 模块,对应包名为 org.apache.flume.channel.file。上面描述的队列对应
FlumeEventQueue 类,WAL 对应
Log 类。队列本身是一个环形数组,通过内存映射文件支撑;而 WAL 对应一组文件,可以使用
LogFile 类和它的子类读写这些文件。
感谢各位的阅读,以上就是“Apache Flume 是什么”的内容了,经过本文的学习后,相信大家对 Apache Flume 是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!