我有一个连接到Kinesis Stream的Storm集群。消息看起来像这样。
{
_c: "a"
}
或者它应该是
{
_c: "b"
}
我想将一个带有_c =“a”的元组发送到一个螺栓,将_c =“b”发送到另一个螺栓。我如何实现这一目标?
这是使用GSon将消息从Kinesis解析为JSON对象的螺栓
@Override
public void execute(Tuple tuple) {
String partitionKey = (String) tuple.getValueByField(SampleKinesisRecordScheme.FIELD_PARTITION_KEY);
String sequenceNumber = (String) tuple.getValueByField(SampleKinesisRecordScheme.FIELD_SEQUENCE_NUMBER);
byte[] payload = (byte[]) tuple.getValueByField(SampleKinesisRecordScheme.FIELD_RECORD_DATA);
ByteBuffer buffer = ByteBuffer.wrap(payload);
String data = null;
try {
data = decoder.decode(buffer).toString();
HashMap < String, String > map = new Gson().fromJson(data, new TypeToken < HashMap < String, Object >> () {}.getType());
this.outputCollector.emit(tuple, new Values(map));
this.outputCollector.ack(tuple);
} catch (CharacterCodingException e) {
this.outputCollector.fail(tuple);
}
}
由于
答案 0 :(得分:0)
您可以在bolt中定义两个流,然后声明两个输出流:
@Override
public void execute(Tuple tuple) {
// ...
// Some Code
// ...
if (_c =="a") {
collector.emit("stream1", tuple, new Values(_c));
} else {
collector.emit("stream2", tuple, new Values(_c));
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declareStream("stream1", new Fields("_c"));
outputFieldsDeclarer.declareStream("stream2", new Fields("_c"));
} }
在拓扑中,您可以使用ShuffleGrouping
中的选项传递Stream_id。
topology.setBolt("FirstBolt",new FirstBolt(),1);
topology.setBolt("newBolt1", new Custombolt(),1).shuffleGrouping("FirstBolt", "stream1");
topology.setBolt("newBolt2", new Custombolt(),1).shuffleGrouping("FirstBolt", "stream2");
另一种可能性是将它发送到两个螺栓,然后检查两个螺栓中的值并执行所需的代码。