什么是三叉戟在Spark Streaming中的persistentAggregate等价物?

时间:2015-01-07 18:49:56

标签: apache-spark spark-streaming

说我有这个三叉戟的工作:

TridentState wordCounts =
      topology.newStream("spout1", spout)
        .each(new Fields("sentence"), new Split(), new Fields("word"))
        .groupBy(new Fields("word"))
        .persistentAggregate(
            MemcachedState.opaque(serverLocations),
            new Count(),
            new Fields("count")
        )                

我如何在Spark Streaming中实现同样的功能?我看了updateStateByKey,但这似乎在内部保持状态(而不是像Memcached那样保持外部状态)&无限期。当我用例如保存它时,它看起来也试图转储每个批次上的所有内容。 saveAsTextFile而不是仅发出在该批次上更新的键值。

我知道我可以简单地与foreachRDD的外部状态进行交互,但在这种情况下,我如何确保我只处理一次记录?

1 个答案:

答案 0 :(得分:2)

经过一番研究,这就是我发现的:

  • Spark Streaming仅支持输出操作的至少一次语义,因此它不能提供Trident的一次性语义(至少不编写自己编写的代码)。
  • updateStateByKey 可以提供一次性语义,但这取决于它的输出完全取代之前的输出(它在每次检查点上发出整个状态)这一事实。这使得它无法用于任何非重要的状态。此外,无法使用现有数据初始化状态。如果重新启动工作,状态将重置(至少是我的理解)。有计划在1.3.0中添加此功能。

总之,如果你想要与Trident进行交易更新似乎是安全的选择。