参考JSTORM:http://120.25.204.125/ProgrammingGuide_cn/StreamSplitJoin.html
分流、合并如图
1、分流
(1)发送相同tuple
其实和普通1v1 发送一模一样,就是有2个或多个bolt接收同一个spout或bolt的数据 举例来说:
builder.setSpout("GNSS-R", new GnssMessageReader(), 10);
// 直接落库
builder.setBolt("S-DB", new G3SaveVehToDB(), 80).shuffleGrouping("C-STATIC");
// 判断是否需要计算
builder.setBolt("C-SEND", new G2CheckSendAndCalu(), 40).localOrShuffleGrouping("C-STATIC");
(2)发送不同tuple
当发送不同的tuple到不同的下级bolt时, 这个时候,就需要引入stream流概念,发送方发送a 消息到接收方A’时使用stream A, 发送b 消息到接收方B’时,使用stream B
在提交topology时候:
除了指定上级名字,还有上级发送流名
builder.setSpout("GNSS-R", new GnssMessageReader(), 10);
// 直接落库
builder.setBolt("S-DB", new G3SaveVehToDB(), 80).shuffleGrouping("C-STATIC","STREAM-A");
// 判断是否需要计算
builder.setBolt("C-SEND", new G2CheckSendAndCalu(), 40).localOrShuffleGrouping("C-STATIC","STREAM-B");
上级节点发送tuple的时候:
public void execute(Tuple tuple, BasicOutputCollector collector) {
Object obj = tuple.getValue(0);
TradeCustomer tradeCustomer = (TradeCustomer)obj;
Pair trade = tradeCustomer.getTrade();
Pair customer = tradeCustomer.getCustomer();
collector.emit("STREAM-A", new Values(trade));
//"STREAM-A"就是流名称
collector.emit("STREAM-B", new Values(tupleId, customer));
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declareStream("STREAM-A", new Fields("TRADE"));
declarer.declareStream("STREAM-B", new Fields("CUSTOMER"));
}
在下游接收数据的时候分流接收:
区分SourceStreamId
if (input.getSourceStreamId().equals("STREAM-A") ) {
customer = pair;
customerTuple = input;
tradeTuple = tradeMap.get(tupleId);
if (tradeTuple == null) {
customerMap.put(tupleId, input);
return;
}
trade = (Pair) tradeTuple.getValue(1);
}
2、合并
在topology提交的时候
builder.setBolt("A", new A(), 1)
.shuffleGrouping("B")
.shuffleGrouping("C");
接收方是,区分一下来源component即可识别出数据的来源
if (input.getSourceComponent().equals("A") ) {
customer = pair;
customerTuple = input;
tradeTuple = tradeMap.get(tupleId);
if (tradeTuple == null) {
customerMap.put(tupleId, input);
return;
}
trade = (Pair) tradeTuple.getValue(1);
} else if (input.getSourceComponent().equals("B")) {
trade = pair;
tradeTuple = input;
customerTuple = customerMap.get(tupleId);
if (customerTuple == null) {
tradeMap.put(tupleId, input);
return;
}
customer = (Pair) customerTuple.getValue(1);
}