如何在Trident中映射具有持久状态的元组?

时间:2013-11-08 12:51:52

标签: stream state apache-storm trident

我正在学习Trident框架。 Trident Streams上有几种方法可用于批处理中的聚合元组,包括this one,它允许使用Aggregator接口预先形成元组的有状态映射。但不幸的是,内置的对应物另外持久保存地图状态,就像persistentAggregate()的其他9次重载一样,只有Aggregator作为参数,不存在。

因此,如何通过结合较低级别的Trident和Storm抽象和工具来实现所需的功能?探索API非常困难,因为几乎没有Javadoc文档。

换句话说,persistentAggregate()方法允许通过更新某些持久状态来结束流处理:

stream of tuples ---> persistent state

我希望更新持久状态并发出不同的元组:

stream of tuples ------> stream of different tuples
                  with
            persistent state

Stream.aggregate(Fields, Aggregator, Fields)不提供容错功能:

stream of tuples ------> stream of different tuples
                  with
          simple in-memory state

1 个答案:

答案 0 :(得分:3)

您可以使用方法TridentState#newValuesStream()从州创建新流。 这将允许您检索聚合值的流。

为了便于说明,我们可以通过添加此方法和调试过滤器来改进example in Trident documentation

FixedBatchSpout spout = new FixedBatchSpout(new Fields("sentence"), 3,
    new Values("the cow jumped over the moon"),
    new Values("the man went to the store and bought some candy"),
    new Values("four score and seven years ago"),
    new Values("how many apples can you eat"));
spout.setCycle(true);

TridentTopology topology = new TridentTopology();        
topology.newStream("spout1", spout)
    .each(new Fields("sentence"), new Split(), new Fields("word"))
    .groupBy(new Fields("word"))
    .persistentAggregate(new MemoryMapState.Factory(), new Count(), new Fields("count"))                
    .newValuesStream().each(new Fields("count"), new Debug());

运行此拓扑将输出(到控制台)聚合计数。

希望有所帮助