storm的学习与使用(二)

计算topo,一个实时计算程序的逻辑在storm里面被封装到topology里面,我把它叫做计算topo.storm里面的topology相当于Hadoop里面的一个MapReduce Job,他们的关键区别是,一个MapReduce Job最终总是会结束的,然而一个storm的topology会一直运行,除非你显式的杀死它。一个Topology是spout和bolt组成的图状结构,而连接spout和bolt的则是stream grouping


消息流:streams

消息流是storm里面最关键的抽象。一个消息流是一个没有边界的tuple序列,而这些tuple会被一种分布式的方式并行的创建和处理。对消息流的定义主要是对消息流里面的tuple的定义,我们会给tuple里面的每一个字段一个名字。并且不同的tuple的对应字段的类型必须一样,也就是说:两个tuple的第一个字段类型必须一样,第二个字段的类型比粗一样,但是第一个字段和第二个字段的类型可以不一样。

每个消息流在定义的时候都会被分配给一个id,因为单向消息流是那么的普遍,outputFieldsDeclarer定义了一些方法让你可以定义一个stream而不用指定这个id,在这种情况下这个stream会有默认的id:1


消息源:spouts

消息源是storm里面的消息生产者。一般来说,消息源会从一个外部源读取数据并且向topology里面发出消息:tuple。消息源spout可以是可靠的,也可以是不可靠的。一个可靠的消息源可以重新发射一个tuple,如果这个tuple没有被storm成功处理。但是一个不可靠的消息源spout一旦发出一个tuple就把它彻底忘了,也就不可能再发了。

消息源可以发射多条消息流stream。Spout里面最重要的方法是nextTuple要么发射一个新的tuple到topology里面或者简单的返回如果已经没有心的tuple了。要注意的是nextTuple方法不能使block spout的实现,因为storm在同一个线程上面调用所有的消息源spout的方法(是不是如果有多个spout或者spout多个线程在运行时,一旦一个spout阻塞,其他的spout也无法调用)。

另外两个比较重要的spout方法是ack和fail.storm在检测到一个tuple被整个topology成功处理的时候调用ack,否则调用fail.storm只对可靠的spout调用ack和fail.


消息处理者:bolts

所有的消息处理逻辑被封装在bolts里面。bolts可以做很多事情:过滤,聚合,查询数据库等等

bolt可以简单的做消息流的传递,复杂的消息流处理往往需要很多步骤,从而也就需要经过很多bolt.bolt可以也发射多条消息。bolt里面最主要的方法是execute.它以一个tuple作为输入,boltsoutputCollector来发射tuple,bolt必须要为他处理的每一个tuple调用ack方法,以通知storm这个tuple这个tuple被处理完成了,从而我们通知发送这个tuple的spout.

(对可靠性的验证需要做一下,自己还没做过可靠性的需求)

Stream grouping:消息分发策略

定义一个topo的其中一步是定义每个bolt接受什么样的流作为输入。stream grouping就是用来定义一个stream 应该如何分配给bolt上的多个task

6中stream grouping

1.shuffle grouping:随机分配,随机派发stream里面的tuple,保证每个bolt接收到的tuple数目相同

2.fields grouping:按字段分组,比如按userid来分组,具有同样的userid的tuple会被分到相同的bolt

3.All grouping:广播发送,对于每一个tuple,所有的bolt都会收到(是bolt还是bolt里面的线程)

4.global grouping:全局分组,这个tuple被分配到storm中的一个bolt的其中一个task。再具体一点就是分配给id值最低的那个task(那个是id值最低的那个)

5.Non Grouping:不分组,跟随机分组一个效果,不同之处是storm会把这个bolt方法哦这个bolt的订阅者同一个线程去执行

6.Direct grouping:直接分组


可靠性

storm会保证每个tuple会被topology完整的执行。storm会追踪由每个spout tuple所产生的tuple树,并且跟踪这颗tuple树什么时候成功处理完。每个topology都有一个消息超时的设置,如果storm在这个超时时间呗检测不到某个tuple树到底有没有执行成功,那么topology会把这个tuple标记为执行失败,并且过一会儿会重新发射这个tuple


为了利用storm的可靠性特性,在你发出一个新的tuple以及你完成处理一个tuple的时候你必须通知storm。使用ack(目前还真不会使用可靠性)


Tasks:任务

每一个spout和bolt都会被当做很多task在整个集群里面执行。每一个task对应到一个线程,而stream grouping则是定义怎么从一堆task发射tuple到另外一堆task.


工作进程

一个topo可能会在一个或者多个工作进程里面执行,每个进程执行整个topology的一部分


配置

storm里面有一堆参数可以配置调整nimbus,supervisor以及正在运行的topology的行为,一些配置是系统级别的,一些配置是topology级别的。所有有默认的配置的默认配置都在default.yaml里面。你可以通过配置storm.yaml来覆盖这里面的配置




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值