Storm高级原语-Trident topology

Trident是Storm的一种高级抽象,提供高吞吐量实时计算和低延迟分布式查询,支持有状态流处理。它包括joins、aggregations、grouping等功能,以及一致性和有且仅有一次的语义。Trident通过将输入流转换为batch并使用批处理API处理,实现了容错和分布式查询。在示例中,展示了如何计算单词计数并持久化存储,以及如何执行分布式查询。
摘要由CSDN通过智能技术生成

Trident是在storm基础上,一个以实时计算为目标的高度抽象。 它在提供处理大吞吐量数据能力(每秒百万次消息)的同时,也提供了低延时分布式查询和有状态流式处理的能力。 如果你对Pig和Cascading这种高级批处理工具很了解的话,那么应该很容易理解Trident,因为他们之间很多的概念和思想都是类似的。Tident提供了 joins, aggregations, grouping, functions, 以及 filters等能力。除此之外,Trident 还提供了一些专门的原语,从而在基于数据库或者其他存储的前提下来应付有状态的递增式处理。Trident也提供一致性(consistent)、有且仅有一次(exactly-once)等语义,这使得我们在使用trident toplogy时变得容易。

举例说明

让我们一起来看一个Trident的例子。在这个例子中,我们主要做了两件事情:

1、从一个流式输入中读取语句并计算每个单词的个数

2、提供查询给定单词列表中每个单词当前总数的功能

因为这只是一个例子,我们会从如下这样一个无限的输入流中读取语句作为输入:

FixedBatchSpout spout = new FixedBatchSpout(new Fields("sentence"), 3,
               new Values("the cow jumped over the moon"),
               new Values("the man went to the store and bought some candy"),
               new Values("four score and seven years ago"),
               new Values("how many apples can you eat"));
spout.setCycle(true);

这个spout会循环输出列出的那些语句到sentence stream当中,下面的代码会以这个stream作为输入并计算每个单词的个数:

TridentTopology topology = new TridentTopology();
TridentState wordCounts =
     topology.newStream("spout1", spout)
       .each(new Fields("sentence"), new Split(), new Fields("word"))
       .groupBy(new Fields("word"))
       .persistentAggregate(new MemoryMapState.Factory(), new Count(), new Fields("count"))
       .parallelismHint(6);

在这段代码中,我们首先创建了一个TridentTopology对象,该对象提供了相应的接口去构造Trident计算过程。 ①、TridentTopology类中的newStream方法从输入源(input source)中读取数据,并创建一个新的数据流。在这个例子中,我们使用了上面定义的FixedBatchSpout对象作为输入源。输入数据源同样也可以是如Kestrel或者Kafka这样的队列服务。Trident会在Zookeeper中保存一小部分状态信息来追踪数据的处理情况,而在代码中我们指定的字符串“spout1”就是Zookeeper中用来存储状态信息的Znode节点。

Trident在处理输入stream的时候会把输入转换成batch(包含若干个tuple)来处理。比如说,输入的sentence stream可能会被拆分成如下的batch:

一般来说,这些小的batch中的tuple可能会在数千或者数百万这样的数量级,这完全取决于你的输入的吞吐量。

Trident提供了一系列非常成熟的批处理API来处理这些小batch。这些API和你在Pig或者Cascading中看到的非常类似, 你可以做groupby、join、 aggregation、执行 function和filter等等。当然,独立的处理每个小的batch并不是非常有趣的事情,所以Trident提供了功能来实现batch之间的聚合并可以将这些聚合的结果存储到内存、Memcached、Cassandra或者是一些其他的存储中。同时,Trident还提供了非常好的功能来查询实时状态,这些实时状态可以被Trident更新,同时它也可以是一个独立的状态源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值