Apache Flume - File通道设计
原文链接:https://blogs.apache.org/flume/entry/apache_flume_filechannel
说明:翻译在尽量符合原文表达的基础上,尽量保证行文流畅。水平有限,请多指正!
这篇文章是关于Flume FileChannel的。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类和它的子类读写这些文件。
FileChannel在遇到硬件、软件、环境失败时,给Flume用户提供了持久化的保证,而且具有高的吞吐量。这两个方面对于大多数情况都是比较重要的,因此FileChannel是推荐使用的Channel。
Apache Flume - File通道设计的更多相关文章
- 分布式日志收集系统Apache Flume的设计详细介绍
问题导读: 1.Flume传输的数据的基本单位是是什么? 2.Event是什么,流向是怎么样的? 3.Source:完成对日志数据的收集,分成什么打入Channel中? 4.Channel的作用是什么 ...
- 【转】Flume(NG)架构设计要点及配置实践
Flume(NG)架构设计要点及配置实践 Flume NG是一个分布式.可靠.可用的系统,它能够将不同数据源的海量日志数据进行高效收集.聚合.移动,最后存储到一个中心化数据存储系统中.由原来的Fl ...
- Apache Flume日志收集系统简介
Apache Flume是一个分布式.可靠.可用的系统,用于从大量不同的源有效地收集.聚合.移动大量日志数据进行集中式数据存储. Flume简介 Flume的核心是Agent,Agent中包含Sour ...
- Apache Flume 1.7.0 各个模块简介
Flume简介 Apache Flume是一个分布式.可靠.高可用的日志收集系统,支持各种各样的数据来源,如http,log文件,jms,监听端口数据等等,能将这些数据源的海量日志数据进行高效收集.聚 ...
- Apache Flume 1.7.0 发布,日志服务器
Apache Flume 1.7.0 发布了,Flume 是一个分布式.可靠和高可用的服务,用于收集.聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型.这是一个可靠.容错的服务. 本次更 ...
- flume file channel 异常解决
1. 错误提示 -- ::, (SinkRunner-PollingRunner-DefaultSinkProcessor) [ERROR - org.apache.flume.SinkRunner$ ...
- Apache Flume 简介
转自:http://blog.163.com/guaiguai_family/blog/static/20078414520138100562883/ Flume 是 Cloudera 公司开源出来的 ...
- Flafka: Apache Flume Meets Apache Kafka for Event Processing
The new integration between Flume and Kafka offers sub-second-latency event processing without the n ...
- Apache Flume 1.7.0 自定义输入输出
自定义http source config a1.sources.r1.type=http a1.sources.r1.bind=localhost a1.sources.r1.port= a1.so ...
随机推荐
- 【shell 练习1】编写Shell条件句练习
实例一.比较两个整数大小 #!/bin/bash while true do read -p "Please input two int nums:" a b >/dev/& ...
- SIG蓝牙mesh笔记5_Provisionging
目录 Bluetooth Mesh Provisioning Provisioning bearer layer Generic Provisioning PDU Bluetooth Mesh Pro ...
- C语言struct中的长度可变数组(Flexible array member)
C_struct中的长度可变数组(Flexible array member) Flexible array member is a feature introduced in the C99 sta ...
- 将System.Drawing.Bitmap转换为Direct2D.D2DBitmap
最近在尝试Direct2D编程,挺好玩的. 但是有时候还是会用到GDI+来生成图片,但D2D绘图需要用到自己的D2DBitmap类. 因此需要转换,查阅了下网上的资料,写了这么一个方法: using ...
- [c++] Getting Started - CMake
CMake is an open-source cross platform build system, according to CMake's creator, Kitware. But CMak ...
- c#调用c++dll(c++界面在c#显示)____制作dll
1.c++dll含界面,以摄像头dll为例: 1.直接在c++SDK上调试运行成功,生成dll. 2.留一个调用接口(格式如下,写在cpp文件中,即函数体): extern "C" ...
- Android - TabHost 选项卡功能用法详解
TabHost效果图 : 源码下载地址 : http://download.csdn.net/detail/han1202012/6845105 . 作者 :万境绝尘 转载请注明出处 ...
- lintcode-187-加油站
187-加油站 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油gas[i],并且从第_i_个加油站前往第_i_+1个加油站需要消耗汽油cost[i]. 你有一辆油箱容量无限大的汽车,现在要从 ...
- lintcode-152-组合
152-组合 组给出两个整数n和k,返回从1......n中选出的k个数的组合. 样例 例如 n = 4 且 k = 2 返回的解为: [[2,4],[3,4],[2,3],[1,2],[1,3],[ ...
- JS DOM视频相关的知识
1.实现点击a标签改变图片时,如果a的href属性有一个目标网址,但是点击又必须跳转到另外一张图,往往会最后跳转到目标网址,可以在onclick事件函数中加入ruturn false,阻止跳转到页面. ...