我为什么要理解storm的一些概念
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我为什么要理解storm的一些概念相关的知识,希望对你有一定的参考价值。
本文翻译自官方文档:http://storm.apache.org/documentation/Concepts.html。
Topology,拓扑;类似MapReduce的Job。一个重要区别是MR的任务通常有结束,然而拓扑是一直运行下去的。在后端,拓扑就是一个Thrift结构体(structure),因此可以通过任何语言编写拓扑。Java提供了TopologyBuilder工具类,来帮助组装拓扑。
Stream,流;流是一连串的tuple,在定义时会同时指定schema,这个schema定义了各field的名字。默认地,tuple中可以包含java的各原生类型的数据;你也可以自己定义序列化/反序列化工具。tuple在clojure/java中是用命名列表实现的,其元素类型可以动态,storm只需要知道如何将java数据序列化成tuple及其逆过程即可。
Tuple可以由任何类型的对象构成,默认使用Kryo进行序列化。这是一个灵活、快速的序列化库,默认支持原生类型、ArrayList、HashMap、HashSet以及clojure的容器。为什么tuple中要支持动态类型?Hadoop中要求了静态类型的key和value,因此在用户端产生了大量的注解,导致API庞大而难用,却只在类型安全上获益,因此是不值得的。相反,动态类型更好用。更进一步,在tuple中使用静态类型是没有令人信服的策略的:假设一个bolt依赖多个上游stream,虽然一些基于反射的魔法可以让我们可以确知来的东西到底是什么类型,但是终究不如动态类型方便。最后,这样做可以让storm更好地以原生的风格与clojure等动态语言接入。
Spouts是streams的源头。通常,spout从外部读取tuple,然后将它们发射到topology中去。spout可以是可靠的或不可靠的;前者会重放哪些处理失败的tuple,而后者不会。spout也可以发射tuple到多个stream中去,这需要使用OutputFieldDeclarer的declareStream方法。spout的主要的方法是nextTuple,它是运行在单线程中的,所以千万不要阻塞它!ack和fail两个方法也很重要,只有reliable型的spout会调用它们。
Bolts是处理逻辑所在的地方。可以map,filter,aggr,join等等。它的主方法是execute,也可以使用OputputCollector句柄向下游发射tuple。必须在bolt处理一个tuple完成后调用ack。
以上是关于我为什么要理解storm的一些概念的主要内容,如果未能解决你的问题,请参考以下文章