- 浏览: 56972 次
- 性别:
- 来自: 北京
文章分类
最新评论
事务:Storm容错机制通过一个系统级别的组件acker,结合xor校验机制判断一个tuple是否发送成功,进而spout可以重发该tuple ,保证一个tuple在出错的情况下至少被重发一次。
在需要精确统计tuple的数量如销售金额场景时,希望每个tuple”被且仅被处理一次” 。Storm 0.7.0引入了Transactional Topology, 它可以保证每个tuple”被且仅被处理一次”, 这样我们就可以实现一种非常准确,且高度容错方式来实现计数类应用。
批处理:事务处理单个tuple效率比较低,逐个处理单个tuple,增加很多开销,如写库、输出结果频率过高因此storm中引入batch处理,批处理是一次性处理一批(batch)tuple,事务可确保该批次要么全部处理成功,如果有处理失败的则全部不计,Storm会对失败的批次重新发送,且确保每个batch被且仅被处理一次。
事务机制原理:Storm事务处理中,把一个batch的计算分成了两个阶段processing和commit阶段:Processing 阶段:多个batch可以并行计算;Commiting阶段:batch之间强制按照顺序进行提交
举例:
Processing 阶段:多个batch可以并行计算,上面例子中bolt2是普通的batchbolt(实现IBatchBolt),那么多个batch在 bolt2的task之间可以并行执行.
Commiting阶段:batch之间强制按照顺序进行提交,上图中Bolt3实现IBatchBolt并且标记需要事务处理的(实现了ICommitter接口或者通过TransactionalTopologyBuilder的setCommitterBolt方法把BatchBolt添加到topology里面),那么在Storm认为可以提交batch的时候调用 finishbatch,在finishBatch做txid的比较以及状态保存工作。例子中batch2必须等待batch1提交后,才可以进行提交。
对于只处理一次的需要:从原理上来讲,需要在发送tuple的时候带上txid,在需要事务处理的时候,根据该txid是否以前已经处理成功来决定是否进行处理,当然需要把txid和处理结果一起做保存。
在事务batch处理中:一批tuple赋予一个txid,为了提高batch之间处理的并行度,storm采用了pipeline(管道)处理模型,这样多个事务可以并行执行,但是commit的是严格按照顺序的。
事务Topology 实现
1、事务spout实现
事务性的spout需要实现ITransactionalSpout,这个接口包含两个内部接口类Coordinator和Emitter。在topology运行的时候,事务性的spout内部包含一个子Topology,结构图如下:
这里面有两种类型的tuple,一种是事务性的tuple,一种是batch中的tuple;
coordinator 开启一个事务准备发射一个batch时候,进入一个事务的processing阶段,会发射一个事务性 tuple(transactionAttempt & metadata)到”batch emit”流
Emitter以all grouping(广播)的方式订阅coordinator的”batch emit”流,负责为每个batch实际发射tuple。发送的tuple都必须以TransactionAttempt作为第一个field,storm根据这个field来判断tuple属于哪一个batch。
coordinator只有一个,emitter根据并行度可以有多个实例
TransactionAttempt 和 元数据
TransactionAttempt包含两个值:一个transaction id,一个attempt id。transaction id的作用就是我们上面介绍的对于每个batch中的tuple是唯一的,而且不管这个batch replay多少次都是一样的。
attempt id是对于每个batch唯一的一个id, 但是对于同一个batch,它replay之后的attempt id跟replay之前就不一样了,我们可以把attempt id理解成replay-times, storm利用这个id来区别一个batch发射的tuple的不同版本
metadata(元数据)中包含当前事务可以从哪个point进行重放数据,存放在zookeeper中的,spout可以通过Kryo从zookeeper中序列化和反序列化该元数据。
事务内部处理流程图
2、事务性Bolt
BaseTransactionalBolt
处理batch在一起的tuples,对于每一个tuple调用调用execute方 法,而在整个batch处理(processing)完成的时候调用finishBatch方法。如果BatchBolt被标记成Committer,则 只能在commit阶段调用finishBatch方法。一个batch的commit阶段由storm保证只在前一个batch成功提交之后才会执行。并且它会重试直到topology里面的所有bolt在commit完成提交。那么如何知道batch的processing完成了,也就是bolt是否接收处理了batch里面所有的tuple;在bolt内部,有一个 CoordinatedBolt的模型。
CoordinateBolt具体原理如下:
每个CoordinateBolt记录两个值:有哪些task给我发送了tuple(根据topology的grouping信息);我要给哪些task发送信息(同样根据groping信息)。
等所有的tuple都发送完了之后,CoordinateBolt通过另外一个特殊的stream以emitDirect的方式告诉所有它发送过 tuple的task,它发送了多少tuple给这个task。下游task会将这个数字和自己已经接收到的tuple数量做对比,如果相等,则说明处理 完了所有的tuple。
下游CoordinateBolt会重复上面的步骤,通知其下游。
在需要精确统计tuple的数量如销售金额场景时,希望每个tuple”被且仅被处理一次” 。Storm 0.7.0引入了Transactional Topology, 它可以保证每个tuple”被且仅被处理一次”, 这样我们就可以实现一种非常准确,且高度容错方式来实现计数类应用。
批处理:事务处理单个tuple效率比较低,逐个处理单个tuple,增加很多开销,如写库、输出结果频率过高因此storm中引入batch处理,批处理是一次性处理一批(batch)tuple,事务可确保该批次要么全部处理成功,如果有处理失败的则全部不计,Storm会对失败的批次重新发送,且确保每个batch被且仅被处理一次。
事务机制原理:Storm事务处理中,把一个batch的计算分成了两个阶段processing和commit阶段:Processing 阶段:多个batch可以并行计算;Commiting阶段:batch之间强制按照顺序进行提交
举例:
Processing 阶段:多个batch可以并行计算,上面例子中bolt2是普通的batchbolt(实现IBatchBolt),那么多个batch在 bolt2的task之间可以并行执行.
Commiting阶段:batch之间强制按照顺序进行提交,上图中Bolt3实现IBatchBolt并且标记需要事务处理的(实现了ICommitter接口或者通过TransactionalTopologyBuilder的setCommitterBolt方法把BatchBolt添加到topology里面),那么在Storm认为可以提交batch的时候调用 finishbatch,在finishBatch做txid的比较以及状态保存工作。例子中batch2必须等待batch1提交后,才可以进行提交。
对于只处理一次的需要:从原理上来讲,需要在发送tuple的时候带上txid,在需要事务处理的时候,根据该txid是否以前已经处理成功来决定是否进行处理,当然需要把txid和处理结果一起做保存。
在事务batch处理中:一批tuple赋予一个txid,为了提高batch之间处理的并行度,storm采用了pipeline(管道)处理模型,这样多个事务可以并行执行,但是commit的是严格按照顺序的。
事务Topology 实现
1、事务spout实现
事务性的spout需要实现ITransactionalSpout,这个接口包含两个内部接口类Coordinator和Emitter。在topology运行的时候,事务性的spout内部包含一个子Topology,结构图如下:
这里面有两种类型的tuple,一种是事务性的tuple,一种是batch中的tuple;
coordinator 开启一个事务准备发射一个batch时候,进入一个事务的processing阶段,会发射一个事务性 tuple(transactionAttempt & metadata)到”batch emit”流
Emitter以all grouping(广播)的方式订阅coordinator的”batch emit”流,负责为每个batch实际发射tuple。发送的tuple都必须以TransactionAttempt作为第一个field,storm根据这个field来判断tuple属于哪一个batch。
coordinator只有一个,emitter根据并行度可以有多个实例
TransactionAttempt 和 元数据
TransactionAttempt包含两个值:一个transaction id,一个attempt id。transaction id的作用就是我们上面介绍的对于每个batch中的tuple是唯一的,而且不管这个batch replay多少次都是一样的。
attempt id是对于每个batch唯一的一个id, 但是对于同一个batch,它replay之后的attempt id跟replay之前就不一样了,我们可以把attempt id理解成replay-times, storm利用这个id来区别一个batch发射的tuple的不同版本
metadata(元数据)中包含当前事务可以从哪个point进行重放数据,存放在zookeeper中的,spout可以通过Kryo从zookeeper中序列化和反序列化该元数据。
事务内部处理流程图
2、事务性Bolt
BaseTransactionalBolt
处理batch在一起的tuples,对于每一个tuple调用调用execute方 法,而在整个batch处理(processing)完成的时候调用finishBatch方法。如果BatchBolt被标记成Committer,则 只能在commit阶段调用finishBatch方法。一个batch的commit阶段由storm保证只在前一个batch成功提交之后才会执行。并且它会重试直到topology里面的所有bolt在commit完成提交。那么如何知道batch的processing完成了,也就是bolt是否接收处理了batch里面所有的tuple;在bolt内部,有一个 CoordinatedBolt的模型。
CoordinateBolt具体原理如下:
每个CoordinateBolt记录两个值:有哪些task给我发送了tuple(根据topology的grouping信息);我要给哪些task发送信息(同样根据groping信息)。
等所有的tuple都发送完了之后,CoordinateBolt通过另外一个特殊的stream以emitDirect的方式告诉所有它发送过 tuple的task,它发送了多少tuple给这个task。下游task会将这个数字和自己已经接收到的tuple数量做对比,如果相等,则说明处理 完了所有的tuple。
下游CoordinateBolt会重复上面的步骤,通知其下游。
发表评论
-
ITridentSpout、FirstN(取Top N)实现、 流合并和join
2017-05-25 10:01 1036一、ITridentSpout 基于事务 static int ... -
Trident实战之计算网站PV
2017-05-24 13:24 6521、Trident实战之计算网站PV /** * ... -
Trident API和概念
2017-05-23 10:57 753一、Trident API——Spout ITride ... -
Trident入门
2017-05-22 13:44 518英文原址:https://github.com/nathanm ... -
分布式远程调用drpc实例
2017-05-22 10:53 420一、DRPC定义 分布式dRPC(distributed RP ... -
不透明分区事务IOpaquePartitionedTransactional实例
2017-05-22 10:54 6821、spout public class MyOpaq ... -
分区事务IPartitionedTransactionalSpout实例
2017-05-21 11:02 5841.分区事务spout public class My ... -
普通事务ITransactionalSpout实例之按天统计数据
2017-05-20 16:56 4901、普通事务Spout /** * 普通事务Spou ... -
普通事务ITransactionalSpout实例
2017-05-20 15:45 8211、普通事务Spout /** * 普通事务Spou ... -
Storm事务API
2017-05-19 16:00 614Spout ITransactionalSpout<T& ... -
集群统一启动和停止shell脚本开发
2017-05-17 09:56 4531、cd 2、ls -al 显示隐藏目录 3、rm -rf ... -
storm高并发UV统计
2017-05-14 22:05 1138统计高并发UV可行的方案(类似WordCount的计算去重wo ... -
storm高并发PV统计,利用zookeeper锁输出汇总值
2017-05-14 14:42 899汇总型方案: 1、shuffleGrouping下,pv(单线 ... -
storm高并发PV统计
2017-04-16 17:54 689一、PV统计思考 方案需要考虑分析多线程下,注意线程安全问题。 ... -
Storm高并发运用WordSum
2017-04-16 14:21 10721、创建发射所有字符串统计总个数及去重个数处理类 pub ... -
storm分组策略介绍
2017-04-16 11:46 705一、storm数据来源 Spout的数据源: MQ:直接流数 ... -
Storm高并发介绍
2017-04-16 10:18 594并发度: worker:指的是component (spo ... -
Storm 字符统计Demo
2017-04-14 13:57 5351、数据源读取,字符发射spout类 /** * 字符 ... -
Storm 本地模式
2017-04-09 22:25 398本地模式,是在eclipse等编译器编写strom运行文件 ... -
Storm启动配置
2017-03-29 17:40 673一、安装Storm wget ...
相关推荐
Storm入门教程 之Storm原理和概念详解,出自Storm流计算从入门到精通之技术篇,Storm入门视频教程用到技术:Storm集群、Zookeeper集群等,涉及项目:网站PV、UV案例实战、其他案例; Storm视频教程亮点: 1、Storm...
【标题】:Storm事务详解(Transaction Topology) 在分布式计算领域,Apache Storm是一个实时计算系统,它能够处理无界数据流并确保数据处理的正确性。"Storm事务详解"主要探讨的是Storm中的事务处理机制,即...
在分布式流处理系统Apache Storm中,事务性拓扑是一个关键特性,它允许开发人员构建能够保证数据完整性和一致性的实时处理应用。事务性拓扑在Storm 0.7.0版本中引入,解决了消息可能被重复处理的问题,这对于那些...
在大数据处理领域,Storm、Durid和Hadoop是三个关键组件,它们分别承担着不同的职责。...同时,对于学习大数据处理技术,特别是Storm的实时计算、Durid的数据库管理以及Hadoop的批处理,也是一个宝贵的实践案例。
Storm-编程模型详解.md
### Storm原理分析 #### 一、Storm基本结构 Apache Storm 是一个开源的分布式实时计算系统,主要用于处理流式数据。Storm 提供了一种简单而强大的模型来定义并行计算过程,使得用户能够轻松地处理无限的数据流。...
《Storm Trident API 使用详解》 Storm Trident API 是 Apache Storm 框架中用于构建实时大数据处理应用程序的关键组件。它的核心概念是"Stream",一种无界的数据序列,它被分割成一系列批次(Batch),以便在...
- **批处理事务**:介绍Storm Trident提供的批处理事务机制,提高数据处理的一致性和可靠性。 - **DRPC**:讨论Distributed Remote Procedure Call(分布式远程过程调用)的实现方法和应用场景,为复杂系统的构建...
在事务性拓扑方面,Storm提供了对事务的支持,但这种事务并不等同于传统数据库中的事务。Storm的事务性拓扑主要用于确保数据处理的精确一次性交付(exactly-once processing semantics),这在某些需要极高可靠性的...
### Storm的文档详解 #### 一、Storm基础概念 **1.1 什么是Storm?** Apache Storm 是一款免费且开源的分布式实时计算系统。它专为处理无界数据流而设计,能够实现实时数据处理任务,具备低延迟、高可用、分布式...
"storm事务1111"可能指的是针对Storm的一种特定事务处理机制或实践案例。Storm的核心特性之一是其容错性,而事务处理是保证数据准确性和一致性的关键组成部分。 在Storm中,事务处理通常涉及到Trident框架,这是一...
第7章演示集成Storm和非事务型系统 的复杂性,通过集成Storm和开源探索性分析架构 Druid实现一个可配置的实时系统来分析金融事件。 第8章探讨Lambda体系结构的实现方法,讲解如何 将批处理机制和实时处理引擎结合...
Storm是一个分布式实时计算系统,允许开发者编写处理无限数据流的程序。配置项是Storm的核心组成部分,它们用于定制Storm集群的行为,以适应不同的环境和需求。以下是对文档中提及的一些主要配置项的详细解释: 1. ...
### Storm配置项详解 #### 概述 Apache Storm是一款免费开源、分布式、高容错性的实时计算系统。Storm因其灵活性及高效性,在大数据处理领域占据了重要地位。本文将基于Storm 0.6.0版本,深入解析其核心配置项,...
Storm核心概念详解.md
Storm集成Redis详解.md
Apache Storm是一个实时计算的分布式计算框架,它类似于Hadoop,但它是为了实时处理而不是批处理设计的。Storm可以处理大量的数据流,并且可以保证每个数据项都会被处理。Storm集群是由一个主节点(Nimbus)和多个...
Apache Storm 可以轻松可靠地处理无限制的数据流,实时处理就像 Hadoop 进行批处理一样。Apache Storm 很简单,可以与任何编程语言一起使用,而且使用起来非常有趣! Apache Storm 有很多用例:实时分析、在线机器...
虽然Storm和Hadoop分别针对实时计算和批处理两个不同的场景,但它们之间可以通过以下几种方式集成使用: - **数据共享**:Storm可以从HDFS读取数据作为输入,或者将处理结果写回到HDFS中。 - **计算互补**:Storm...
总之,Storm部署是一个涉及多个组件和配置的过程,理解其工作原理和依赖关系至关重要。通过以上步骤,可以成功搭建一个运行Storm应用的集群。在实际操作中,务必仔细检查每个环节,确保所有服务正常运行,从而实现...