【翻译】关于Apache Flume FileChannel

这篇文章关于Apache Flume中的File Channel,Apache Flume 是一个分布式,可靠的,高可用的服务,可以有效的收集,聚合,传输海量的日志数据,Flume具备基于流数据的简单灵活的架构,具备鲁棒性,容错性,可靠性机制和许多故障转移和回滚机制。
Flume使用简单可扩展的数据模型,支持在线分析应用程序。
FileChannel是支持并行加密写入多个磁盘的持久化Flume channel.web

概述

当使用Flume 时,每一个工做流都拥有Source, Channel, and Sink,典型例子是一个webserver经过RPC将事件(events)写入Source(例如:Avro Source),sources又将events写入MemoryChannel,同时HDFS Sink从MemoryChannel消费events,并写入HDFS
【翻译】关于Apache Flume FileChannelapache

MemoryChannel提供高吞吐的性能,同时在断电和程序崩溃以后会形成数据丢失。所以须要开发一个持久化的Channel。File Channel的目标是提供一个可靠的高吞吐Channel。File Channel保证当事务被提交后,不会由于一系列程序崩溃或者掉电而形成数据丢失。
值得注意的是,FileChannel自己不会对数据进行任何复制。 所以,它只能与底层磁盘同样可靠。 因为其耐用性而使用FileChannel的用户在购买和配置硬件时应考虑到这一点。 底层磁盘应为RAID,SAN或相似磁盘。
许多系统以少许数据丢失风险换取更高的吞吐量(例如fsync,每隔几秒从内存到磁盘)。 Flume团队决定采用不一样的方法实现FileChannel。 Flume是一个事务性系统,多个事件(events)能够是单个事务中实现或者put或者take的操做。 批量大小可用于控制吞吐量。 使用大的批处理容量,Flume能够经过流处理数据,在高吞吐量的状况下而不会丢失数据。 批量处理的大小彻底能够由客户端控制。 这对于RDBMS用户比较熟悉。
Flume事务或者包含Puts 操做,或者Takes操做,不一样时支持两个操做,同时commit和rollback 也是如此。每一个事物transanction都是了Put 和Take方法。Source 调用Put 方法将事件写入Channel,Sinks执行Takes 方法从channel中取数据。数组

设计

FileChannel除了基于内存队列以外,还基于预写日志WAL。每一个事务都根据事务类型(Take或Put)写入WAL,并相应地修改队列。每次提交事务时,都会在相应的文件上调用fsync,以确保数据确实写入磁盘上,并将指向该事件的指针放在队列中。该队列就像任何其余队列同样:它管理还没有被Sink消费的内容。在获取期间,将队列中指针删除。而后直接从WAL读取事件。因为目前可用的RAM量很大,所以从操做系统文件缓存中进行读取很是常见。
程序崩溃后,能够重放WAL以将队列置于崩溃以前的状态,所以已提交的事务不会丢失。重放WAL可能很是耗时,所以队列自己会按期写入磁盘。将队列写入磁盘称为检查点。崩溃后,队列从磁盘加载,而后只有队列保存到磁盘后才提交事务,这大大减小了必须读取的WAL数量。缓存

例如,channel中有两个以下图所示的events。
【翻译】关于Apache Flume FileChannel架构

WAL包含三个重要项:事务ID,序列号和事件数据。 每一个事务都有一个惟一的事务ID,每一个事件都有一个惟一的序列号。 事务id仅用于将事件分组到事务中,而在重放日志时使用序列号。 在上面的示例中,事务id为1,序列号为1,2和3。
当队列保存到磁盘(检查点)时,序列号也会增长并保存。 在从新启动时,首先加载来自磁盘的队列,而后重放序列号大于队列的全部WAL条目。 在检查点操做期间,通道被锁定,所以任何Put或Take操做都不能改变它的状态。 容许在检查点期间修改队列将致使存储在磁盘上的队列的快照不一致。
在上面的示例队列中,在提交事务1以后发生检查点,致使队列中的事件a,事件b被保存到磁盘,同时序列号为4。分布式

而后,事件a在事务2中被taken。
【翻译】关于Apache Flume FileChannel
若是发生崩溃,则从磁盘读取队列检查点。 请注意,因为检查点发生在事务2以前,所以队列中当前存在事件a和b。 而后读取WAL并应用序列号大于4的任何已提交事务,从而致使从队列中删除“a”(该操做的event是[2,5,Take "a"])。ide

上述设计不包括两个项目。 在检查点发生时正在进行的Takes和Puts将丢失。 假设在获取“a”以后发生了检查点:
【翻译】关于Apache Flume FileChannel性能

若是此时发生崩溃,则在上述设计下,事件“b”将在队列上而且在重放时将重放序列号大于5的任何WAL条目。 将重播事务2的回滚[2,6,Rollback],但不会重放事务2的Taken[2,4,Take "a"]。 所以,“a”不会被放置在队列中,从而致使数据丢失。 Puts也会采用相似的方案。 所以,当发生队列检查点时,也会写出仍在进行中的事务,以即可以适当地解决上述场景。加密

实现

FileChannel存储在Flume项目的flume-file-channel模块中,包名是org.apache.flume.channel.file。 上面描述的队列的名称为FlumeEventQueue,WAL名称为Log。 队列自己是一个循环数组,由内存映射文件支持,而WAL是一组使用LogFile类及其子类编写和读取的文件。操作系统

结论

FileChannel为Flume用户提供了面对硬件,软件和环境故障时的耐用性,同时保持了高吞吐量。 对于耐用性和高吞吐很重要的大多数拓扑而言,推荐使用File Channel。

原文:http://blog.cloudera.com/blog/2012/09/about-apache-flume-filechannel/#comment-18923

相关文章
相关标签/搜索