簡體   English   中英

如何使用歷史數據集豐富Flink DataStream

[英]How to use historical dataset for enriching Flink DataStream

我正在使用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流媒體程序中,什么功能可以達到上述豐富要求? 我發現堆棧溢出的打擊問題與我的問題類似,但我無法解決問題,所以我決定尋求幫助:)

在Flink流中使用靜態DataSet豐富DataStream

任何幫助將非常感激。

但是,由於數據庫數據不是固有流,因此輸出不正確。

當然,可以使用來自關系數據庫的信息來豐富流數據。 但是,棘手的是要以某種方式確保在需要之前提取豐富數據。 通常,您可能需要緩沖要豐富的流,直到豐富數據被引導/攝取為止。 例如,有時采取的一種方法是

  1. 在禁用要豐富的流的情況下運行應用
  2. 一旦充分吸收了濃縮數據並將其存儲在flink狀態下,請保存一個保存點
  3. 在啟用要豐富流的情況下從保存點重新啟動應用程序

但是,在您描述的情況下,似乎更簡單的方法可行。 如果您只需要24小時的歷史數據,那為什么不忽略歷史交易數據庫呢? 只需運行您的應用程序,直到看到24小時的流數據,此后歷史數據庫就變得無關緊要了。

但是,如果您必須提取歷史數據,並且您不喜歡上面概述的基於保存點的方法,則還有其他兩種可能:

  • 以flink狀態(例如ListState或MapState)緩沖未豐富的事件,直到已吸收歷史流
  • 編寫一個自定義SourceFunction來阻止主流,直到提取歷史數據為止

有關此主題的更詳盡的探索,請參閱Apache Flink中的引導狀態

計划在將來的版本btw中為該用例提供更好的支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM