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个学生的数据, 只是造成了资源浪费,传了不必要的数据.