2014-06-20 56 views
7

我正在构建用于检测欺诈ATM卡交易的实时处理。为了有效地检测欺诈,逻辑要求具有卡的最后交易日期,日期(或最后24小时)的交易金额的总和。Spark Streaming历史状态

用例之一是如果在本国以外的卡交易超过30天在该国的最后交易然后发送警报尽可能欺诈

因此,试图看看Spark流作为解决方案。 为了实现这一点(约函数式编程也许我缺少的想法)以下 是我psudo代码

stream=ssc.receiverStream() //input receiver 
s1=stream.mapToPair() // creates key with card and transaction date as value 
s2=stream.reduceByKey() // applies reduce operation for last transaction date 
s2.checkpoint(new Duration(1000)); 
s2.persist(); 

我面临两个问题就在这里

1)如何进一步利用这最后交易日期未来从相同的卡比较
2)如何保持数据,所以即使重新启动驱动程序然后旧的s2值恢复回 3)updateStateByKey可以用来保持历史状态?

我想我缺少火花流/功能编程的关键点,如何实现这种逻辑。

+0

在这里完全丢失了这个问题,你是否无法将数据保存到一个文件 – aaronman

+0

@aaronman它可能不是那么简单在分布式环境中动态变化的工人;-) –

+0

@ om-nom-nom i' m只是不清楚问题所在,至于将文件保存在流式上下文中,spark可以让您为每个您处理的Dstream保存文件,而不需要太多的努力 – aaronman

回答

3

如果您使用的是Spark Streaming,则不应该真正将您的状态保存在文件中,特别是如果您打算全天候运行应用程序。 如果这不是你的意图,那么只需要一个Spark应用程序就可能会很好,因为你只面临大数据计算而不是实时计算批量。

是,updateStateByKey可用于通过各批保持状态,但它有一个特定的签名,你可以在文档中看到:) http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.streaming.dstream.PairDStreamFunctions

而且坚持(这只是一个缓存的形式,它不实际上不会将数据保存在磁盘上(如在文件上)。

希望澄清一些你的疑惑。

+2

是否有任何方法来删除/重置状态的密钥流时运行24/7 ..我的应用程序被杀死了一段时间..如何处理它? – mithra