hadoop系列之Storm入门
一.Javadoc
二.概念
下面介绍storm的一些基本概念和一些资源的相关链接,包括Topologies、Streams、Spouts、Bolts、Stream groupings、Reliability、Tasks和Workers。
1.Topologies(拓扑)
在storm中,实时应用的逻辑会被打包成storm拓扑,storm拓扑和MapReduce的job类似,主要区别就是MR的一个job有始有终,而拓扑只要不是人为kill就不会主动结束。拓扑就是使用stream groupings连接多个spout和bolt的一张图。TopologyBuilder是Java中用于构建拓扑的Class,拓扑支持生产环境中运行和用于开发测试的Local mode。
2.Streams
流是storm的核心抽象。流是通过分布式方式创建和处理的元组的无限序列。流使用一个命名流元组的字段的概要来定义。默认情况下,元组包括了integers, longs, shorts, bytes, strings, doubles, floats, booleans和byte arrays,用户可以实现自己的序列化功能,以便更多的自定义类型可以原生支持。每个流在声明时都会有一个id,由于单流的spouts和bolts很普遍,用于声明流和概要的类OutputFieldsDeclarer有很方便的方法声明单独的流而无需具体id,这种情况下流会有一个默认id"default"。storm的动态化元组类型和声明自定义序列化器见serializations。
3.Spouts
spout是拓扑中流的数据源。通常是spouts从外在的数据源读取元组并把元组发散到拓扑,spouts支持可靠(失败重新发送)和不可靠(失败忽略)两种模式。spouts可以发散多个流,前提是使用OutputFieldsDeclarer类的declareStream方法并且在使用SpoutOutputCollector类的emit方法时制定要发散到的流。spouts的一个重要方法是nextTuple,作用是发散一个新的tuple到拓扑或者在没有新tuple简单返回。storm在同一个线程中调用所有spout方法,所以nextTuple万万不能堵塞。spouts另一个重要方法是ack和fail,只会被支持可靠性的spouts使用。所有的spouts必须实现IRichSpout接口。
4.Bolts
拓扑中bolts负责处理加工,bolts能够做的包括但不限于过滤、函数、聚合、连接、数据库操作等等。bolts能够做简单的流变化。复杂流转换一般需要多个bolts。例如将一组数据做按照出现次数排序需要至少两步,一个bolt负责统计每条数据出现的次数,接下来由一个或者多个bolt来取出出现次数topN的数据。bolts支持发散到多个流,需要使用OutputFieldsDeclarer类的declareStream方法声明多个流并且使用OutputCollector类的emit方法声明每个具体的要发散到的流。当声明bolt的输入流时,其实是订阅了另一个组件的某个具体的流,如果想订阅这个组件的所有流,不得不每个订阅一次。InputDeclarer类提供了订阅默认id的流的语法糖,declarer.shuffleGrouping("1")等效于declarer.shuffleGrouping("1", DEFAULT_STREAM_ID)。bolts的主要方式是execute,可以理解为新元组的输入,bolts使用OutputCollector类发散新元组。bolts在处理完每个元组时必须调用OutputCollector类的ack方法,从而使得storm知道处理完成。一般情况下处理一个输入元组,发散0到多个元组,然后才ack这个输入元组,storm提供了IBasicBolt接口(IRichBolt是通用的bolts接口)用于自动ack。OutputCollector类是线程安全的并且可以在任何时候被调用,在bolts中使用多线程异步处理是可以的。