Jstorm与Storm中的并行度区分

关于Storm中的并行度的问题,建议大家看看Storm的官网:http://storm.apache.org/documentation/Understanding-the-parallelism-of-a-Storm-topology.html (当然,我在博客中也翻译了这一篇文章)

在storm中负责运行topology,主要用到了3个东西:worker(进程)、executor(线程)、task。storm中的一个明显的特征是:一个spout或者bolt的task数量在一开始被配置好之后就不能再进行更改,而executor的数量只能小于或者等于task的数量,也就是说executor对应执行一个或者多个task(executor执行的task必须来自同一个bolt或者spout) 例如:你可以这样来配置:builder.setBolt(new MyBolt(), 3).setNumTasks(128).shuffleGrouping("spout");此处将bolt的task数设置成了128个,默认executor数是与task数量是一致的。

要知道storm在0.8.0版之前并无executor这一概念,只有worker与task(线程)。而引入executor在worker与task中间加入一层就是为了把topology的逻辑语意和实际运行给分别开。

例如:storm中有一个fieldsgroup,即field相同的tuple会被送到相同的task中(内部实现是根据field,hash然后映射的taskid上)

public List<Integer> grouper(List<Object> values) {
        int hashcode =
                this.out_fields.select(this.group_fields, values).hashCode();
        int group = Math.abs(hashcode % this.out_tasks.size());
        return JStormUtils.mk_list(out_tasks.get(group));
    }
上面这段代码来自jstorm(storm源码为clojure),fieldsgroup实现很简单。

对于固定task数量的storm来说,fieldgrouping很方便,我们在前期可以将TaskNum设置好,topology运行后,我们可以通过rebalance命令修改并发度。。


而对于Jstorm,目前的Jstorm并没有引入Executor这一概念,所以还是一个task对应一个线程。因此,当我们在Jstorm中使用了fieldsgrouping这种功能后,通过rebalance修改并发读时,需要小心了。(无法保证field相同的tuple被发送到同一个task中)。

如果,我们想要在Jstorm中达到与Storm中一样的效果,我们需要自己实现一个grouping,借助一致性hash,在可改变的task(这里是线程)上面封装一层不变的抽象task。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值