虽然我们把FlumeEventQueue想象成Event指针的内存队列,但FlumeEventQueue中的内部实现是很绕的,不跑跑Flume的单元测试,很容易看晕。本文的目的就是通过简化模型来剖析FlumeEventQueue中的四种操作:addTail、removeHead、addHead和remove。
上一篇博文地址:http://manzhizhen.iteye.com/admin/categories/357759
FlumeEventQueue中(准确的说应该是EventQueueBackingStore中)有queueSize和queueHead两个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在自增或自减中越界,它会随时和0、capacity来做比较来使queueHead在一个首尾相连的环中移动,但具体映射到overwriteMap的key是根据EventQueueBackingStoreFile#getPhysicalIndex方法来的:
protected int getPhysicalIndex(int index) { return HEADER_SIZE + (getHead() + index) % getCapacity(); }
其中HEADER_SIZE的值是比1024稍大点的质数1029,而getHead()获取的就是queueHead.
如果你了解了FlumeEventQueue的这四种操作,就几乎了解了Flume的内存队列在运行状态时候的主体流程,其他细节是无关紧要的,感兴趣的可以读读源码。
相关推荐
- **Channel 的作用**:Channel 是 Flume 中确保数据可靠性的关键组件。通常建议使用 FileChannel,它可以将事件持久化到本地文件系统中,从而避免数据丢失。 - **可靠性级别**:Flume 提供了三个级别的可靠性保障,...
视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 1、介绍: ...章节九:Channel选择器 章节十:Sink处理器 章节十一:导入数据到HDFS 章节十二:Flume SDK 章节十三:Flume监控
5. **Channel**:Channel 作为一个中间缓存,存储事件直到它们被成功处理。常见的 Channel 类型包括 MemoryChannel(内存存储)和 FileChannel(文件系统存储)。 6. **Reliability and Recovery**:Flume 提供了三...
Flume-NG 安装与配置指南 Flume-NG 是一个分布式日志收集系统,能够从各种数据源中实时采集数据,并将其传输到集中式存储系统中。本文将指导您完成 Flume-NG 的安装和基本配置。 安装 Flume-NG 1. 先决条件:...
Flume 组成架构主要包括 Agent、Source、Channel 和 Sink 四个组件。 1.2.1 Agent Agent 是一个 JVM 进程,它以事件的形式将数据从源头送至目的地,是 Flume 数据传输的基本单元。Agent 主要有 3 个部分组成,...
3. Flume快速入门: - **安装地址**:Flume的官网、文档查看和下载链接分别在http://flume.apache.org/、http://flume.apache.org/FlumeUserGuide.html和http://archive.apache.org/dist/flume/。 - **安装部署...
以下是对Flume入门使用的详细说明: 1. **Flume 组件配置**: 在`netcat-logger.conf`配置文件中,我们看到Flume的配置主要由三部分组成:Sources、Sinks 和 Channels。 - **Sources**:在这里是`r1`,类型设置为...
- **Flume Channel**:如内存 Channel,提供数据在 Source 和 Sink 之间的临时存储,保证数据传输的可靠性。 - **Flume Interceptor**:拦截器允许在数据进入 Channel 之前进行预处理,如过滤、转换等操作。 4. *...
Flume支持Memory Channel、File Channel等多种类型。 - **Sink(目标)**:负责从Channel中读取数据并将数据发送到目的地,例如HDFS、HBase或其他Flume节点等。 #### 三、Flume配置与部署 - **配置文件**:Flume的...
Flume由Agent、Source、Channel和Sink四个主要部分组成: 1. **Agent**: Flume的核心组件,负责数据的流动。每个Agent包含一个或多个Source、Channel和Sink。 2. **Source**: 负责接收数据,例如网络套接字、系统...
大数据技术之Flume Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。它基于流式架构,灵活简单。 Flume定义 Flume是一个高可用的,高可靠的,分布式的海量日志采集、...
Flume从1.5.0版本开始,重构了其内部架构,核心组件、配置以及代码架构都进行了重大改动,这个新版本被称为Flume NG(Next Generation),即Flume的新一代版本,用以替代了原来的Flume OG(Original Generation)。...
Flume 支持多种 Channel 类型,如 Memory Channel(内存通道)、File Channel(文件通道)和 JDBC Channel(基于数据库的通道)。这些 Channel 实现了不同的持久化策略,以适应不同场景的需求。 5. **Sink ...
Flume由多个组件构成,包括源(Source)、通道(Channel)和接收器(Sink),这些组件协同工作,确保数据的稳定流动。 Apache Kafka是一个分布式的流处理平台,由LinkedIn开发并贡献给Apache社区。Kafka主要设计...
1. 启动 Flume:使用命令 `cd $FLUME_HOME/conf`,然后使用命令 `flume-ng a` 启动 Flume。 五、Flume-Ng 组件概述 1. Flume-Ng:Flume 的下一代版本,提供了更好的性能和可扩展性。 2. Flume-Ng 组件:包括 Agent...
常见类型有 Memory Channel(内存通道)和 File Channel(文件通道),1.6.0 版本可能会优化这些通道的性能和容错机制。 6. **数据接收器(Sink)**: 数据接收器负责将数据发送到目的地。常见的 Sink 包括 HDFS ...
5. **通道(Channel)**:Channel是数据缓冲区,提供了Source和Sink之间的数据传输。常见类型有Memory Channel(内存通道)和File Channel(文件通道)。 6. **可靠性与容错性**:Flume利用Channel的持久化能力确保...
一个 Flume Agent 包含 Source、Channel 和 Sink 三个组件。 - **Source**: 负责接收外部数据源产生的数据,如日志文件、网络套接字等。 - **Channel**: 存储 Source 接收到的数据,作为临时缓冲区,保证数据的...
flume进阶:如何设计一套Flume进阶课程体系+编程+研发; flume进阶:如何设计一套Flume进阶课程体系+编程+研发; flume进阶:如何设计一套Flume进阶课程体系+编程+研发; flume进阶:如何设计一套Flume进阶课程体系+...
- **可靠性**:通过使用可配置的持久化Channels(如File Channel),Flume可以在网络故障或节点故障后恢复未完成的传输,确保数据完整性。 - **灵活性**:Flume支持多种数据源和目标,可以通过配置轻松地扩展和...