说我有这个三叉戟的工作:
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
的外部状态进行交互,但在这种情况下,我如何确保我只处理一次记录?
答案 0 :(得分:2)
经过一番研究,这就是我发现的:
updateStateByKey
可以提供一次性语义,但这取决于它的输出完全取代之前的输出(它在每次检查点上发出整个状态)这一事实。这使得它无法用于任何非重要的状态。此外,无法使用现有数据初始化状态。如果重新启动工作,状态将重置(至少是我的理解)。有计划在1.3.0中添加此功能。总之,如果你想要与Trident进行交易更新似乎是安全的选择。