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
可以用来保持历史状态?
我认为我错过了如何实现这种逻辑的火花流/函数式编程的关键点。
如果您使用的是Spark Streaming,则不应该真正将您的状态保存在文件中,特别是如果您打算全天候运行应用程序。 如果这不是你的意图,那么只需要一个Spark应用程序就可能会很好,因为你只面临大数据计算,而不是实时进行批量计算。
是的,updateStateByKey可以用来维护各个批次的状态,但它有一个特定的签名,您可以在文档中看到:http://spark.apache.org/docs/latest/api/scala/index.html#org .apache.spark.streaming.dstream.PairDStreamFunctions
另外persist()它只是一种缓存形式,它并不实际将数据保存在磁盘上(如在文件上)。
希望澄清一些你的疑惑。
链接地址: http://www.djcxy.com/p/21157.html