Spark Streaming历史状态

Jig*_*ekh 7 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();
Run Code Online (Sandbox Code Playgroud)

我这里面临两个问题

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

我想我错过了如何实现这种逻辑的火花流/函数编程的关键点.

gpr*_*era 3

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

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

另外 persist() 它只是一种缓存形式,它实际上并不将数据保存在磁盘上(就像文件一样)。

希望能解答您的一些疑惑。

  • 当流媒体 24/7 运行时,有什么方法可以删除/重置密钥的状态..我的应用程序在一段时间内被杀死..如何处理? (2认同)