我正在使用Flink开发用于卡交易的实时欺诈检测系统,我需要利用以前的交易来丰富每张卡的状态,以计算以下交易功能:
对于每张卡,我都有一个功能,可以统计过去24小时内的交易次数。另一方面,我有2个数据源:
首先,一个数据库表,用于存储卡交易,直到昨天结束。
第二,今天的交易流。
因此,第一步是从数据库中获取每张卡的昨天交易并将其存储在卡状态下。然后,第二步是使用今天进行中的交易更新此状态,并计算过去24小时内的交易数量。 我试图将数据库数据作为流读取,并将其连接到今天的事务。因此,为了达到上述目标,我使用了RichFlatMap函数。但是,由于数据库数据不是固有流,因此输出不正确。 RichFlatMap函数位于以下位置:
transactionsHistory.connect(transactionsStream).flatMap(new
RichCoFlatMapFunction<History, Tuple2<String, Transaction>,
ExtractedFeatures>() {
private ValueState<History> history;
@Override
public void open(Configuration config) throws Exception {
this.history = getRuntimeContext().getState(new
ValueStateDescriptor<>("card history", History.class));
}
//historical data
@Override
public void flatMap1(History history,
Collector<ExtractedFeatures> collector) throws Exception {
this.history.update(history);
}
//new transactions from stream
@Override
public void flatMap2(Tuple2<String, Transaction>
transactionTuple, Collector<ExtractedFeatures> collector) throws
Exception {
History history = this.history.value();
Transaction transaction = transactionTuple.f1;
ArrayList<History> prevDayHistoryList =
history.prevDayTransactions;
// This function returns transactions which are in 24 hours
//window of the current transaction and their count.
Tuple2<ArrayList<History>, Integer> prevDayHistoryTuple =
findHistoricalDate(prevDayHistoryList,
transaction.transactionLocalDate);
prevDayHistoryList = prevDayHistoryTuple.f0;
history.prevDayTransactions = prevDayHistoryList;
this.history.update(history);
ExtractedFeatures ef = new ExtractedFeatures();
ef.updateFeatures(transaction, prevDayHistoryTuple.f1);
collector.collect(ef);
}
});
在Flink流媒体程序中,达到上述丰富要求的正确设计模式是什么? 我发现堆栈溢出的打击问题与我的问题类似,但是我无法解决问题,所以我决定寻求帮助:)
Enriching DataStream using static DataSet in Flink streaming
任何帮助将不胜感激。
答案 0 :(得分:1)
但是,由于数据库数据不是固有流,因此输出不正确。
当然可以用来自关系数据库的信息来丰富流数据。但是,棘手的是要以某种方式确保在需要之前提取丰富数据。通常,您可能需要缓冲要丰富的流,直到丰富数据被引导/摄取为止。例如,有时采用的一种方法是
但是,在您描述的情况下,似乎更简单的方法可行。如果您只需要24小时的历史数据,那为什么不忽略历史交易数据库呢?只需运行您的应用程序,直到看到24小时的流数据传输,此后,无论如何,历史数据库将变得无关紧要。
但是,如果您必须提取历史数据,并且您不喜欢上面概述的基于保存点的方法,则还有其他两种可能:
有关此主题的更详尽探索,请参见Bootstrapping State In Apache Flink。
计划在将来的版本btw中为该用例提供更好的支持。