实时流计算框架-storm-关于grouping的理解

setBolt()  setNumTasks() 方法有一个参数,  可以设置运行这个bolt的Task数量---线程数量. 那么grouping就是处理spout数据源分发给这些Task的策略.

这里例举3个比较常用的.

fieldGrouping, spout会把tuple发送给Bolt对应的Task,但是,要按照tuple的某个field来标识Task. 这样这个Task以后就只能收到field值为A的这个tuple, 这个理解起来略困难.举个例子.

需求: 按学号统计学生这个学期每次月考的各科平均成绩, 假设一个学期3次月考.Tuple数据是这样的

Field {学号,  日期,   语文,  数学, 英语}

Data {0024, 07-15, 80,     80,   90}

Data {0025, 07-15, 80,     50,   70}

Data {0026, 07-15, 80,     30,   100}

-------------------------------------------

Data {0024, 08-15, 80,     50,   100}

Data {0025, 08-15, 80,     70,   80}

Data {0026, 08-15, 80,     100,   50}

----------------------------------------------

Data {0024, 09-15, 80,     100,   80}

Data {0025, 09-15, 80,     80,   100}

Data {0026, 09-15, 80,     100,   90}

假设spout会按月考的日期发送Tuple给Bolt, 那么如果Bolt对应的Task要想按学号统计成绩,那么就必须用到fieldGrouping(学号)

这样如果我的Bolt有3个Task, 每个Task处理固定学号对应的学生的数据.

Task1收到的数据, (第一次收到0024学生的Tuple,以后就只接收0024学生的tuple)(Task2, Task3 同理)

Data {0024, 07-15, 80,     80,   90}

Data {0024, 08-15, 80,     50,   100}

Data {0024, 09-15, 80,     100,   80}

Task2收到的数据

Data {0025, 07-15, 80,     50,   70}

Data {0025, 08-15, 80,     70,   80}

Data {0025, 09-15, 80,     80,   100}

Task3收到的数据

Data {0026, 07-15, 80,     30,   100}

Data {0026, 08-15, 80,     100,   50}

Data {0026, 09-15, 80,     100,   90}

 

shuffleGrouping, spout会把tuple随机分发给Bolt对应的Task,达到Bolt对应的每个Task收到的tuple数量尽可能平均.很好理解.

allGrouping, spout会把tuple广播发送给Bolt对应的Task, 达到Bolt对应的每个Task都受到了tuple.很好理解.

还是上面的例子, 同样的需求:

如果shuffleGrouping呢, 还是3个Task, 每个Task拿到的数据就不能保证是同一个学生的了.无法实现.

如果是allGrouping广播, 每个task拿到所有学生的数据, 这样每个task可以处理1个学生, 丢掉其他的2个学生的数据, 只是造成了资源浪费,传了不必要的数据.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值