Apache Storm 官方文档 —— Trident Spouts

与一般的 Storm API 一样,spout 也是 Trident 拓扑的数据来源。不过,为了实现更复杂的功能服务,Trident Spout 在普通的 Storm Spout 之上另外提供了一些 API 接口。

数据源、数据流以及基于数据流更新 state(比如数据库)的操作,他们之间的耦合关系是不可避免的。Trident State 一文中有这方面的详细解释,理解他们之间的这种联系对于理解 spout 的运作方式非常重要。

Trident 拓扑中的大部分 spout 都是非事务型 spout。在 Trident 拓扑中可以使用普通的 IRichSpout 接口来创建数据流:

TridentTopology topology = new TridentTopology();
topology.newStream("myspoutid", new MyRichSpout());

Trident 拓扑中的所有 spout 都必须有一个唯一的标识,而且这个标识必须在整个 Storm 集群中都是唯一的。Trident 需要使用这个标识来存储 spout 从 ZooKeeper 中消费的元数据(metadata),包括 txid 以及其他相关的 spout 元数据。

你可以使用以下配置项来设置用于存储 spout 元数据的 ZooKeeper 地址(一般情况下不需要设置以下选项,因为 Storm 默认会直接使用集群的 ZooKeeper 服务器来存储数据 —— 译者注):

  1. transactional.zookeeper.servers:ZooKeeper 的服务器列表
  2. transactional.zookeeper.port:ZooKeeper 集群的端口
  3. transactional.zookeeper.root:元数据在 ZooKeeper 中存储的根目录。元数据会直接存储在该设置目录下。

管道

默认情况下,Trident 每次处理只一个 batch,知道该 batch 处理成功或者失败之后才会开始处理其他的 batch。你可以通过将 batch 管道化来提高吞吐率,降低每个 batch 的处理延时。同时处理的 batch 的最大数量可以通过topology.max.spout.pending 来进行配置。

不过,即使在同时处理多个 batch 的情况下,Trident 也会按照 batch 的顺序来更新 state。例如,假如你正在处理一个将全局计数结果整合并更新到数据库中的任务,那么在你向数据库中更新 batch1 的计数结果时,你同时可以继续处理 batch2、batch3 甚至 batch10 的计数工作。不过,Trident 只会在 batch1 的 state 更新结束之后才会处理后续 batch 的 state 更新操作。这是实现恰好一次处理的语义的必要基础,我们已经在 Trident State 一文中讨论了这一点。

Trident spout 类型

下面列出了一些可用的 spout API 接口:

  1. ITridentSpout:这是最常用的 API,支持事务型和模糊事务型的语义实现。不过一般会根据需要使用它的某个已有的实现,而不是直接实现该接口。
  2. IBatchSpout:非事务型 spout,每次会输出一个 batch 的 tuple。
  3. IPartitionedTridentSpout:可以从分布式数据源(比如一个集群或者 Kafka 服务器)读取数据的事务型 spout。
  4. OpaquePartitionedTridentSpout:可以从分布式数据源读取数据的模糊事务型 spout。

当然,正如这篇教程的开头提到的,除了这些 API 之外,你还可以使用普通的 IRichSpout

时间: 2024-12-28 09:52:00

Apache Storm 官方文档 —— Trident Spouts的相关文章

Apache Storm 官方文档 —— Trident API 概述

Trident 的核心数据模型是"流"(Stream),不过与普通的拓扑不同的是,这里的流是作为一连串 batch 来处理的.流是分布在集群中的不同节点上运行的,并且对流的操作也是在流的各个 partition 上并行运行的. Trident 中有 5 类操作: 针对每个小分区(partition)的本地操作,这类操作不会产生网络数据传输: 针对一个数据流的重新分区操作,这类操作不会改变数据流中的内容,但是会产生一定的网络传输: 通过网络数据传输进行的聚合操作: 针对数据流的分组操作:

Apache Storm 官方文档 —— Trident State

Trident 中含有对状态化(stateful)的数据源进行读取和写入操作的一级抽象封装工具.这个所谓的状态(state)既可以保存在拓扑内部(保存在内存中并通过 HDFS 来实现备份),也可以存入像 Memcached 或者 Cassandra 这样的外部数据库中.而对于 Trident API 而言,这两种机制并没有任何区别. Trident 使用一种容错性的方式实现对 state 的管理,这样,即使在发生操作失败或者重试的情况下状态的更新操作仍然是幂等的.基于这个机制,每条消息都可以看作

Apache Storm 官方文档 —— Trident 教程

Trident 是 Storm 的一种高度抽象的实时计算模型,它可以将高吞吐量(每秒百万级)数据输入.有状态的流式处理与低延时的分布式查询无缝结合起来.如果你了解 Pig 或者 Cascading 这样的高级批处理工具,你就会发现他们和 Trident 的概念非常相似.Trident 同样有联结(join).聚合(aggregation).分组(grouping).函数(function)以及过滤器(filter)这些功能.Trident 为数据库或者其他持久化存储上层的状态化.增量式处理提供了

Apache Storm 官方文档中文版

原文链接    译者:魏勇 About 本项目是 Apache Storm 官方文档的中文翻译版,致力于为有实时流计算项目需求和对 Apache Storm 感兴趣的同学提供有价值的中文资料,希望能够对大家的工作和学习有所帮助. 虽然 Storm 的正式推出已经有好几个年头了,发行版也已经到了 0.10.x,但是目前网络上靠谱的学习资料仍然不多,很多比较有价值的资料都过时了(甚至官方网站自己的资料都没有及时更新,这大概也是发展太快的社区的通病),而较新的资料大多比较零碎,在关键内容的描述上也有些

Apache Storm 官方文档 —— 内部技术实现

这部分的 wiki 是为了说明 Storm 是怎样实现的.在阅读本章之前你需要先了解怎样使用 Storm. 代码库架构 拓扑的生命周期1 消息传递的实现1 Ack 框架的实现 Metrics 事务型拓扑的工作机制1 单元测试2 时间模拟 完整的拓扑 集群跟踪 说明 1 该文内容已过期.2 该文官方文档暂未提供. 转载自 并发编程网 - ifeve.com

Apache Storm 官方文档 —— 在生产环境中运行拓扑

在生产环境集群中运行拓扑的方式与本地模式非常相似,主要包括以下几个步骤: 1) 定义拓扑(如果使用 Java 进行开发就可以使用 TopologyBuilder) 2) 使用 StormSubmitter 向集群提交拓扑.StormSubmitter 接收拓扑名称.拓扑配置信息以及拓扑对象本身作为参数,如下所示: Config conf = new Config(); conf.setNumWorkers(20); conf.setMaxSpoutPending(5000); StormSubm

Apache Storm 官方文档 —— 使用 Maven 构建 Storm 应用

在开发拓扑的时候,你需要在 classpath 中包含 Storm 的相关 jar 包.你可以将各个 jar 包直接包含到你的项目的 classpath 中,也可以使用 Maven 将 Storm 添加到依赖项中.Storm 已经集成到 Maven 的中心仓库中.你可以在项目的 pom.xml 中添加以下依赖来将 Storm 包含进项目中: <dependency> <groupId>org.apache.storm</groupId> <artifactId&g

Apache Storm 官方文档 —— 多语言接口协议

本文描述了 Storm (0.7.1 版本以上)的多语言接口协议. Storm 多语言协议 Shell 组件 Storm 的多语言支持主要通过 ShellBolt,ShellSpout 和 ShellProcess 类来实现.这些类实现了 IBolt 接口.ISpout 接口,并通过使用 Java 的 ProcessBuilder 类调用 shell 进程实现了执行脚本的接口协议. 输出域 输出域是拓扑的 Thrift 定义的一部分.也就是说,如果你在 Java 中使用了多语言接口,那么你就需要

Apache Storm 官方文档 —— 源码组织结构

原文链接    译者:魏勇 Strom 的代码有三个层次: 第一,Storm 在一开始就是按照兼容多语言的目的来设计的.Nimbus 是一个 Thrift 服务,拓扑也被定义为 Thrift 架构.Thrift 的使用使得 Storm 可以用于任何一种语言. 第二,所有的 Storm 接口都设计为 Java 接口.所以,尽管 Storm 核心代码中有大量的 Clojure 实现,所有的访问都必须经过 Java API.这就意味着 Storm 的每个特性都可以通过 Java 来实现. 第三,Sto