[Storm中文文档]Trident教程
声明
本文首发于个人技术博客,转载请注明出处,本文链接:http://qifuguang.me/2015/11/27/Storm中文文档-Trident教程/
前言
最近工作中需要用到Storm,于是买了一本关于Storm的书,翻开一看基本都是照着官方文档翻译的,并且翻译的质量真的不敢恭维。我自认为语文水平比英语水平要好,但是我看别人翻译的书竟然看不懂,一怒一下,自己研究官方文档来了。我知道有很多和我一样的人,不喜欢看英文的文档,所以就一边看文档,一边翻译,分享出来,希望对需要的人有所帮助。当然,我的英语很渣,翻译的时候难免有差错,敬请谅解。
正文
Trident是一个基于Storm的用于实时计算的高级抽象原语。它支持高吞吐(每秒百万级别),有状态的流处理,并且还能够提供低延时的分布式查询功能。如果你熟悉一些比较高级的批处理工具,比如Pig和Cascading,那么对于Trident你应该有一种似曾相识的感觉。Trident具有连接,聚合,分组,自定义行为和过滤的功能。除此之外,Trident能够基于内存或者数据库做有状态的,增量式的计算。Trident本身能够保证每个Tuple严格只被执行一次,所以使用Trident很容易构建一个靠谱的Topology。
Illustrative example
下面通过一个例子介绍Trident。这个例子需要做两件事:
- 从一个能产生句子的输入流中实时计算各个单词的数量;
- 实现查询功能:输入一个句子,句子中每个单词用空格分隔,查询这个句子中所有单词出现的数量的总和。
出于演示目的,本例将从一个能够产生无限英文句子的输入流中读取数据:
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能够循环产生无限的英文语句,下面的代码是计算单词出现次数的部分代码:
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
,它通过一个指定的Spout创建一个新的数据输入流。在本例中,输入流仅仅是一个比较简单的FixedBatchSpout。输入流也可以是消息队列,比如Kestrel和Kafka。Trident在Zookeeper保存每一个从输入流中读取的Tuple的处理信息,在上面的代码中,字符串"spout1"表示这些Tuple的处理信息在Zookeeper上的存储路径。
Trident是将输入数据分成许多小块做批量处理的。例如,本例中输入的数据流有可能被分割成如下这样的小块:
它将被编译成如下的Storm Topology:
英文文档原文地址:http://storm.apache.org/documentation/Trident-tutorial.html
如果你喜欢我的文章,请关注我的微信订阅号:“机智的程序猿”,更多精彩,尽在其中: