Spark Streaming历史状态

时间:2014-06-20 16:30:27

标签: java scala apache-spark shark-sql spark-streaming

我正在构建用于检测欺诈ATM卡交易的实时处理。为了有效地检测欺诈行为,逻辑要求按照卡片的最后交易日期,按天(或最后24小时)的交易金额总和

其中一个用例是,如果在该国家/地区之外的卡片交易超过该国家最后一次交易的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可以用来维持历史状态吗?

我认为我缺少如何实现这种逻辑的火花流/函数编程的关键点。

1 个答案:

答案 0 :(得分:3)

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

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

同样坚持()它只是一种缓存形式,它实际上并没有将你的数据保存在磁盘上(比如在文件上)。

希望澄清你的一些疑虑。