“Stream”是Trident中的核心数据模型,它被当做一系列的batch来处理。在Storm集群的节点之间,一个stream被划分成很多partition(分区),对流的操作(operation)是在每个partition上并行进行的。
注:
①“Stream”是Trident中的核心数据模型:有些地方也说是TridentTuple,没有个标准的说法。
②一个stream被划分成很多partition:partition是stream的一个子集,里面可能有多个batch,一个batch也可能位于不同的partition上
Trident有五类操作(operation):
1、Partition-local operations,对每个partition的局部操作,不产生网络传输
2、Repartitioning operations:对数据流的重新划分(仅仅是划分,但不改变内容),产生网络传输
3、Aggregation operations:聚合操作
4、Operations on grouped streams:作用在分组流上的操作
5、Merge、Join操作
Partition-local operations
对每个partition的局部操作包括:function、filter、partitionAggregate、stateQuery、partitionPersist、project等。
Functions
一个function收到一个输入tuple后可以输出0或多个tuple,输出tuple的字段被追加到接收到的输入tuple后面。如果对某个tuple执行function后没有输出tuple,则该tuple被过滤(filter),否则,就会为每个输出tuple复制一份输入tuple的副本。假设有如下的function:
public class MyFunction extends BaseFunction {
public void execute(TridentTuple tuple, TridentCollector collector) {
for(int i=0; i < tuple.getInteger(0); i++) {
collector.emit(new Values(i));
}
}
}
假设有个叫“mystream”的流(stream),该流中有如下tuple( tuple的字段为["a", "b", "c"] ),
[1, 2, 3]
[4, 1, 6]
[3, 0, 8]
运行下面的代码:
mystream.each(new Fields("b"), new MyFunction(), new Fields("d")))
则输出tuple中的字段为["a", "b", "c", "d"],如下所示
[1, 2, 3, 0]
[1, 2, 3, 1]
[4, 1, 6, 0]
Filters
fileter收到一个输入tuple后可以决定是否留着这个tuple,看下面的filter:
public