7

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

用例之一是,如果在本国境外的卡交易超过该国家最后一次交易的 30 天,则发送警报作为可能的欺诈

因此试图将 Spark 流视为一种解决方案。为了实现这一点(可能我缺少关于函数式编程的想法),下面是我的伪代码

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可以用来维持历史状态?

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

4

1 回答 1

3

如果您使用的是 Spark Streaming,则不应真正将状态保存在文件中,尤其是当您计划 24/7 运行应用程序时。如果这不是您的意图,那么您可能只使用 Spark 应用程序就可以了,因为您只面临大数据计算,而不是实时批量计算。

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

同样 persist() 它只是一种缓存形式,它实际上并不会将您的数据保存在磁盘上(如文件上)。

希望已经澄清了你的一些疑惑。

于 2014-06-24T05:28:38.180 回答