`
manzhizhen
  • 浏览: 293737 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Flume快速入门(四):File Channel之FlumeEventQueue

阅读更多

       虽然我们把FlumeEventQueue想象成Event指针的内存队列,但FlumeEventQueue中的内部实现是很绕的,不跑跑Flume的单元测试,很容易看晕。本文的目的就是通过简化模型来剖析FlumeEventQueue中的四种操作:addTail、removeHead、addHeadremove

       上一篇博文地址:http://manzhizhen.iteye.com/admin/categories/357759

       FlumeEventQueue中(准确的说应该是EventQueueBackingStore中)有queueSizequeueHead两个int属性,用来保存队列的长度和取元素时的索引(队列ADT中是从头取元素,从尾放元素)。这两个属性的初始值都是0。还有一个Map类型的overwriteMap属性(准确来说是EventQueueBackingStoreFile中的属性),它就是队列的容器了,它里面存放了所有未被消费的Event指针(准确来说不是所有的,具体细节请看Flume快速入门(三))。当然,还有个int型的队列容量属性capacity(准确来说是EventQueueBackingStore中的),有了对capacity的判断,queueHead在自增的过程中就不会过界了。我们接下来仔细看看FlumeEventQueue是如何通过如上几种属性来制造队列行为的。

 

操作名称:addTail

使用场景:Source将Event写入Channel。

具体操作(伪代码):

       1. index = queueSize;

       2. queueSize++;

       3. put Event to overwriteMap at key is [queueHead+index];

 

操作名称:removeHead

使用场景:Sink从Channel取Event。

具体操作(伪代码):

       1. index = 0;

       2. take Event from overwriteMap at key is [queueHead] ;

       3. set 0 to overwriteMap at key is [queueHead];

       4. queueHead++;

       5. queueSize--;

 

操作名称:addHead

使用场景:Sink从Channel取Event失败,将Event回滚到FlumeEventQueue中

具体操作(伪代码):

       1. index = 0;

       2. queueSize++;

       3. queueHead-- ;

       4. set Event to overwriteMap at key is [queueHead];

 

操作名称:remove

使用场景:当从故障中恢复数据时,需要从log file中加载数据到FlumeEventQueue,每加载一个Event需要将FlumeEventQueue中可能存在的相同的Event删除

具体操作(伪代码):

       1. 遍历overwriteMap,找到该Event对应的index;

       2. 既然已经决定删除index上的Event,则为了保证队列的元素的连续性,需要对部分Event位移,为了位移最少数量的Event,当index大于queueSize的一半,将index右边的元素向左(队尾)移动,否则则将index左边的元素向右(队头)移动;

       3. 如果是左移,则set 0 to overwriteMap at key is [queueHead+queueSize-1] ;如果是右移,则set 0 to overwriteMap at key is [queueHead],并且queueHead++;

       4. queueSize--;

 

       我们已经给出了上面四种操作的详细步骤,当然,为了防止queueHead在自增或自减中越界,它会随时和0capacity来做比较来使queueHead在一个首尾相连的环中移动,但具体映射到overwriteMapkey是根据EventQueueBackingStoreFile#getPhysicalIndex方法来的:

 

  protected int getPhysicalIndex(int index) {
    return HEADER_SIZE + (getHead() + index) % getCapacity();
  }

 其中HEADER_SIZE的值是比1024稍大点的质数1029,而getHead()获取的就是queueHead.

       如果你了解了FlumeEventQueue的这四种操作,就几乎了解了Flume的内存队列在运行状态时候的主体流程,其他细节是无关紧要的,感兴趣的可以读读源码。

       下一篇:http://manzhizhen.iteye.com/blog/2311120

分享到:
评论

相关推荐

    Flume1.6.0入门:安装、部署、及flume的案例

    - **Channel 的作用**:Channel 是 Flume 中确保数据可靠性的关键组件。通常建议使用 FileChannel,它可以将事件持久化到本地文件系统中,从而避免数据丢失。 - **可靠性级别**:Flume 提供了三个级别的可靠性保障,...

    最全Flume视频教程,大数据入门必学

    视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 1、介绍: ...章节九:Channel选择器 章节十:Sink处理器 章节十一:导入数据到HDFS 章节十二:Flume SDK 章节十三:Flume监控

    Flume1.5.0入门:安装、部署、及flume的案例

    5. **Channel**:Channel 作为一个中间缓存,存储事件直到它们被成功处理。常见的 Channel 类型包括 MemoryChannel(内存存储)和 FileChannel(文件系统存储)。 6. **Reliability and Recovery**:Flume 提供了三...

    flume-ng安装

    Flume-NG 安装与配置指南 Flume-NG 是一个分布式日志收集系统,能够从各种数据源中实时采集数据,并将其传输到集中式存储系统中。本文将指导您完成 Flume-NG 的安装和基本配置。 安装 Flume-NG 1. 先决条件:...

    尚硅谷大数据技术之Flume

    Flume 组成架构主要包括 Agent、Source、Channel 和 Sink 四个组件。 1.2.1 Agent Agent 是一个 JVM 进程,它以事件的形式将数据从源头送至目的地,是 Flume 数据传输的基本单元。Agent 主要有 3 个部分组成,...

    尚硅谷大数据技术之Flume笔记1

    3. Flume快速入门: - **安装地址**:Flume的官网、文档查看和下载链接分别在http://flume.apache.org/、http://flume.apache.org/FlumeUserGuide.html和http://archive.apache.org/dist/flume/。 - **安装部署...

    Flume入门使用.pdf

    以下是对Flume入门使用的详细说明: 1. **Flume 组件配置**: 在`netcat-logger.conf`配置文件中,我们看到Flume的配置主要由三部分组成:Sources、Sinks 和 Channels。 - **Sources**:在这里是`r1`,类型设置为...

    04、日志收集系统Flume-实时计算4-3:flume配置深入.pptx

    - **Flume Channel**:如内存 Channel,提供数据在 Source 和 Sink 之间的临时存储,保证数据传输的可靠性。 - **Flume Interceptor**:拦截器允许在数据进入 Channel 之前进行预处理,如过滤、转换等操作。 4. *...

    大数据Flume学习视频-免费

    Flume支持Memory Channel、File Channel等多种类型。 - **Sink(目标)**:负责从Channel中读取数据并将数据发送到目的地,例如HDFS、HBase或其他Flume节点等。 #### 三、Flume配置与部署 - **配置文件**:Flume的...

    大数据Ambari之flume集成编译好的源码包

    Flume由Agent、Source、Channel和Sink四个主要部分组成: 1. **Agent**: Flume的核心组件,负责数据的流动。每个Agent包含一个或多个Source、Channel和Sink。 2. **Source**: 负责接收数据,例如网络套接字、系统...

    大数据技术之Flume.docx

    大数据技术之Flume Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。它基于流式架构,灵活简单。 Flume定义 Flume是一个高可用的,高可靠的,分布式的海量日志采集、...

    Flume集群环境搭建,flume监控

    Flume从1.5.0版本开始,重构了其内部架构,核心组件、配置以及代码架构都进行了重大改动,这个新版本被称为Flume NG(Next Generation),即Flume的新一代版本,用以替代了原来的Flume OG(Original Generation)。...

    flume1.7.0源码

    Flume 支持多种 Channel 类型,如 Memory Channel(内存通道)、File Channel(文件通道)和 JDBC Channel(基于数据库的通道)。这些 Channel 实现了不同的持久化策略,以适应不同场景的需求。 5. **Sink ...

    apache-flume-1.9.0-bin.tar,kafka_2.11-0.10.1.0,zookeeper-3.3.6_.tar

    Flume由多个组件构成,包括源(Source)、通道(Channel)和接收器(Sink),这些组件协同工作,确保数据的稳定流动。 Apache Kafka是一个分布式的流处理平台,由LinkedIn开发并贡献给Apache社区。Kafka主要设计...

    Flume1.8安装部署

    1. 启动 Flume:使用命令 `cd $FLUME_HOME/conf`,然后使用命令 `flume-ng a` 启动 Flume。 五、Flume-Ng 组件概述 1. Flume-Ng:Flume 的下一代版本,提供了更好的性能和可扩展性。 2. Flume-Ng 组件:包括 Agent...

    flume1.6.0.rar

    常见类型有 Memory Channel(内存通道)和 File Channel(文件通道),1.6.0 版本可能会优化这些通道的性能和容错机制。 6. **数据接收器(Sink)**: 数据接收器负责将数据发送到目的地。常见的 Sink 包括 HDFS ...

    flume开发相关工具包

    5. **通道(Channel)**:Channel是数据缓冲区,提供了Source和Sink之间的数据传输。常见类型有Memory Channel(内存通道)和File Channel(文件通道)。 6. **可靠性与容错性**:Flume利用Channel的持久化能力确保...

    flume1.8.rar

    一个 Flume Agent 包含 Source、Channel 和 Sink 三个组件。 - **Source**: 负责接收外部数据源产生的数据,如日志文件、网络套接字等。 - **Channel**: 存储 Source 接收到的数据,作为临时缓冲区,保证数据的...

    如何设计一套Flume进阶课程体系+编程+研发

    flume进阶:如何设计一套Flume进阶课程体系+编程+研发; flume进阶:如何设计一套Flume进阶课程体系+编程+研发; flume进阶:如何设计一套Flume进阶课程体系+编程+研发; flume进阶:如何设计一套Flume进阶课程体系+...

    flume-ng-sql-source-1.5.2

    - **可靠性**:通过使用可配置的持久化Channels(如File Channel),Flume可以在网络故障或节点故障后恢复未完成的传输,确保数据完整性。 - **灵活性**:Flume支持多种数据源和目标,可以通过配置轻松地扩展和...

Global site tag (gtag.js) - Google Analytics