storm各组件基本概念

storm的一些基本概念如下:
1、topology(计算拓扑)
    一个实时计算应用程序逻辑被封装在topology对象中,相当于hadoop里面的一个job,跟job不同的是,topology会一直运行直到你显式杀死它。一个topology是spout和bolt组成的图状结构,而链接spout和bolt的就是stream grouping。
2、steam(消息流)
    一个消息流是一个没有边界的tuple序列,这些tuples会被以一种分布式并行地创建和处理。对消息流的定义主要是对消息流里的tuple结构的定义,tuple里的每个字段一个名字,tuple字段类型可以是:integer、long、short、byte、string、double、float、boolean、byte array。也可以自定义类型,不过要实现对应的序列化器。
3、spout(消息源)
    spout是storm里面一个topology的消息产生者。一般来说消息源会从一个外部源读取数据并且向topology发出消息:tuple。spout可以使可靠的也可以是不可靠的。
4、bolt(消息处理者)
    消息处理逻辑封装在bolt内,bolt可以做很多事:过滤,聚合,查询数据库等等;ACK调用在这一层,保证每条消息都得到了处理。
5、stream grouping(消息分发策略)
    定义每个bolt接受什么样的流作为输入、定义一个stream应该如何分配给bolts上面的多个task。
    5.1、shuffle grouping:随机分组,随机派发stream里面的tuple,保证每个bolt接收到的tuple数目相同;
    5.2、fields grouping:按字段分组;
    5.3、all grouping:广播分组,对于每个tuple,所有的bolts都会收到;
    5.4、global grouping:全局分组,这个tuple被分配到storm中的一个bolt的其中一个task

    5.5、non grouping:不分组, 这个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。

    5.6、direct grouping:直接分组, 这是一种比较特别的分组方法,用这种分组意味着消息的发送者举鼎由消息接收者的哪个task处理这个消息。 只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来或者处理它的消息的taskid (OutputCollector.emit方法也会返回taskid)

6、reliability(可靠性)
    storm保证每个tuple会被topology完整的执行。storm会跟踪由每个spout tuple所产生的tuple树(一个bolt处理一个tuple之后可能会发射别的tuple从而可以形成树状结构),并且跟踪这棵tuple树什么时候成功处理完。每个topology都有一个消息超时的设置, 如果storm在这个超时的时间内检测不到某个tuple树到底有没有执行成功, 那么topology会把这个tuple标记为执行失败,并且过一会会重新发射这个tuple。
    为了利用storm的可靠性特性,在你发出一个新的tuple以及你完成处理一个tuple的时候你必须要通知storm。这一切是由OutputCollector来完成的。通过它的emit方法来通知一个新的tuple产生了, 通过它的ack方法通知一个tuple处理完成了。
7、task(任务)
    每一个Spout和Bolt会被当作很多task在整个集群里面执行。每一个task对应到一个线程,而stream grouping则是定义怎么从一堆task发射tuple到另外一堆task。你可以调用TopologyBuilder.setSpout()和TopBuilder.setBolt来设置并行度 — 也就是有多少个task。
8、worker(工作进程)
    一个topology可能会在一个或者多个工作进程里面执行,每个工作进程执行整个topology的一部分。比如对于并行度是300的topology来说,如果我们使用50个工作进程来执行,那么每个工作进程会处理其中的6个tasks(其实就是每个工作进程里面分配6个线程)。storm会尽量均匀的工作分配给所有的工作进程。
原文地址:https://www.cnblogs.com/frady/p/2935053.html