Storm可以确保由Spout发送的每条消息都会被所有的Bolts完全处理,但是这需要用户来决定是否需要可靠性机制。如果是简单的统计分析,可靠性要求不是很高,则可以选择使用不可靠的Bolts。
Storm编程中,有各种Bolt,命名格式XXRichBolt或XXBasicBolt。其中,带有Rich的Bolt,是没有可靠性机制的,需要自己手动调用方法collect.ack()或者collect.fail();而带有Basic的Bolt是封装可靠性机制,在emit一个Tuple时,会在内部自动加入该tuple,进行锚定,所以用户只需要编写处理逻辑,系统会默认调用ack或fail方法。那么,storm是如何来进行ack呢?
注:若要storm系统对一个Tuple进行可靠性跟踪,必须指定一个唯一ID告知系统。因为在Spout中的ack()和fail()方法都有一个参数是messageID,系统是根据该ID来确定成功或失败的。如collector.emit(tuple, tupleID);
先明确一些概念:
1,什么叫做一个消息被所有的Bolts完全处理?
一个Tuple会经过不同的bolts,形成一个或多个分支,这些分支叫做Tuple树,当Tuple树被完全处理时,这个tuple才被完全处理;当中间某个节点处理失败或超时(超时时间,可以再定义Topology的Config时,进行修改属性conf.setMessageTimeoutSecs),tuple都是处理失败的。
2,锚定(Anchor技术):即collect.emit(inputTuple,new Values(……))。BasicBolt会在内部自动锚定到输入tuple;RichBolt默认是没有锚定的。
------------------一个tuple的ACK流程如下---------------------
1,Spout初始化,产生一个唯一标识taskID;
2,Spout创建一个Tuple,有个tupleID(64位随机数);
3,Spout发射Tuple(一定要指定一个唯一ID,来开启跟踪),并同时发送消息到Acker,要求其对Tuple进行跟踪;
4,Tuple经过一系列bolts,产生一个anchor tuple列表;
5,Bolt调用OutputCollector.ack(),进行一系列异或操作,若结果是0,则表示ok,否则fail;
6,根据taskID,回调原始Spout的ack()或fail()方法;
-----------------------------------------------------------------------
注意:方法ack、fail和nextTuple是在同一个线程中完成的,因此应当尽量避免在spout去调用sleep()方法。
如果必须要控制消息的发送速率,可以再开启一个异步线程来读取数据到队列,再由spout去取队列中的数据。
如果不关心数据是否丢失,或者想测试是否有某个bolt拖慢了spout的速度,可以进行如下配置:
1,在定义Topology时,conf.setNumAckers(0);
2,在spout中,不指定唯一的messageId,即不开启跟踪;
3,在bolt中,使用richBolt,即不进行锚定,发射新的tuple;
参考网址:找不到了。。。
如有错误,请指出
相关推荐
下面我们将详细探讨Storm的ack机制以及它如何保证数据的可靠性。 1. **什么是Storm的Ack机制?** Ack(确认)机制是Storm中的一个核心组件,它的主要任务是跟踪和确保每个数据包(tuple)在拓扑中正确处理。当一个...
本文档是关于Storm源码的详细走读笔记,主要分析了Storm的启动场景、Topology提交过程、worker进程中的线程使用情况、消息传递机制以及 TridentTopology的创建和ack机制等多个方面。 首先,文档提到了Storm集群中的...
- **Ack机制**:Storm通过消息确认(Ack)机制确保数据被正确处理,即使在故障情况下也能恢复。 3. **Storm中的高层机制** - **事务处理**:支持事务性消息处理,保证数据的一致性和完整性。 - **Trident API**...
ACK机制用于确保消息的可靠性处理,调度器则负责在Worker之间分发任务,多语言支持允许用户使用除Java以外的语言编写Spout和Bolt组件。 在运行Storm集群时,还需要理解关于资源隔离的概念,比如使用CGroup来限制...
为了确保可靠性,Storm引入了**Tuples的acking机制**。每个发出的tuple都有一个唯一的ID,并被复制到多个工作节点,以防止数据丢失。当Bolt处理完tuple并确认其成功时,会向Storm返回一个ack信号。如果某个tuple未被...
- **_ACK机制_**:用于确保数据流的可靠处理,防止数据丢失。 - **Tuple**:Storm中的基本数据结构,表示数据流中的一个记录。 开发Storm应用时,你需要编写Spout和Bolt的实现,然后将它们组装成Topology,并提交到...
### 大数据开发高级就业指导课程——...通过以上介绍可以看出,本课程旨在深入讲解Storm的并发机制、消息可靠性保障机制以及Trident的相关理论和实践操作,帮助学员掌握大数据处理的核心技术,提升解决实际问题的能力。
- **Ack机制**:当一个Tuple被完全处理并发出Ack信号时,才被认为是完成处理。 - **Fail机制**:如果Tuple处理失败,则可以通过Fail机制重新发送该Tuple。 - **Direct机制**:允许Tuple直接发送到指定的Bolt实例...
Storm 提供了一个 ACK 框架来确保消息的可靠处理。当 Spout 发送一条消息时,它会等待来自 Bolt 的确认(ACK),只有收到 ACK 后才会丢弃该消息。如果在规定时间内没有收到 ACK,Spout 将重新发送该消息。这种方式...
4. 数据可靠性:通过STORM的ACK机制和数据重发策略确保了数据处理的可靠性。 5. 设计方法:通过电商订单统计系统实例的具体案例来展示设计海量数据实时统计系统的方法,说明了理论与实践相结合的设计思路。 这个...
Bolt还支持ack和fail机制,以确保数据处理的可靠性。 **5. Topology提交** 使用SubmitTopology方法将拓扑提交到Storm集群。提交时需要指定拓扑名、配置和构建好的拓扑对象。配置可以包含各种运行时参数,例如nimbus...
Twitter于2011年开源Storm,它提供了对大规模、无界数据流进行连续计算的能力,保证了数据处理的低延迟和高可靠性。 1.2 我司实时服务现状 公司当前的实时服务面临着数据量大、处理延迟和业务连续性挑战。传统的...
在这部分的最后,提供了关于Storm可靠元组处理和ack的XOR魔法的详细介绍。 第三部分介绍了Petrel,这是一个轻量级的封装,用于简化Storm拓扑的构建和打包过程。这部分解释了如何使用Petrel构建一个基本的拓扑,以及...
在标准的Storm拓扑中,处理数据主要依赖于`ack`和`fail`机制。当一个元组被成功处理后,会发送一个`ack`信号,如果处理失败则发送`fail`。然而,当元组需要重发时,可能会导致重复处理,这就引入了不准确性和一致性...
**DPRC Topologies**(Direct Punctuation Reliable Commit):一种特殊的拓扑结构,旨在支持高可靠性数据处理。 #### 第四章 Spouts **可靠消息 versus 不可靠消息**: - **不可靠消息**:Storm 默认的行为,可能...
5. **可靠性保证**: Storm通过`Ack机制`确保数据不丢失。当一个Bolt处理完一个Tuple后,它会发送一个确认(Ack),如果某个Bolt在处理过程中失败,Storm会重新调度处理,直到成功。此外,如果任务失败,Storm会自动...
- 可靠性:Storm通过ack机制保证消息处理的可靠性,源码分析应涉及Storm是如何实现这一机制的。 - 任务调度:了解Storm是如何调度工作节点上的任务,以及如何处理资源分配。 - 通信机制:分析Storm内部各组件之间...
- TridentTopology的ack机制和调用关系。 8. Metrics执行流程: - 描述了如何收集和处理Storm集群中的性能指标。 这些知识点展示了Storm作为一个分布式实时计算系统的核心架构和运行机制。Storm通过其处理机制...
6. **错误处理和容错机制**:Storm提供了强大的容错机制,如消息确认(ack机制)和故障恢复。在SpringBoot整合中,我们需要确保这些机制与Spring的异常处理和事务管理协同工作,以实现无数据丢失和高可用性。 7. **...