簡體   English   中英

如何從Apache Flink中的數據庫中查找和更新記錄的狀態?

[英]How to look up and update the state of a record from a database in Apache Flink?

我正在研究數據流應用程序,我正在調查使用Apache Flink進行此項目的可能性。 主要原因是它支持漂亮的高級流構造,非常類似於Java 8的Stream API。

我將接收與數據庫中的特定記錄相對應的事件,並且我希望能夠處理這些事件(來自諸如RabbitMQ或Kafka之類的消息代理)並最終更新數據庫中的記錄並推送已處理的/將事件轉換為另一個接收器(可能是另一個消息代理)

理想情況下,與特定記錄相關的事件需要以FIFO順序進行處理(盡管會有一個時間戳有助於檢測無序事件),但可以並行處理與不同記錄相關的事件。 我打算使用keyBy()構造來按記錄分區流。

需要完成的處理取決於數據庫中有關記錄的當前信息。 但是,我無法找到一個示例或建議的方法來查詢數據庫以獲取此類記錄,以使用我需要處理它的其他信息來豐富正在處理的事件。

我想到的管道如下:

- > keyBy()對接收到的id - >從數據庫中檢索對應id的記錄 - >對記錄執行處理步驟 - >將處理后的事件推送到外部隊列並更新數據庫記錄

需要更新數據庫記錄,因為另一個應用程序將查詢數據。

在實現此管道之后,可能會有額外的優化措施。 例如,可以將(更新的)記錄緩存在托管狀態,以便同一記錄上的下一個事件不需要另一個數據庫查詢。 但是,如果應用程序不知道特定記錄,則需要從數據庫中檢索它。

Apache Flink中用於此類場景的最佳方法是什么?

您可以通過擴展RichFlatMap函數的豐富函數來執行數據庫查找,在open()方法中初始化數據庫連接一次,然后在flatMap()方法中處理每個事件:

public static class DatabaseMapper extends RichFlatMapFunction<Event, EncrichedEvent> {

    // Declare DB coonection and query statements

    @Override
    public void open(Configuration parameters) throws Exception {
      // Initialize Database connection
      // Prepare Query statements
    }

    @Override
    public void flatMap(Event currentEvent, Collector<EncrichedEvent> out) throws Exception {
      // look up the Database, update record, enrich event
      out.collect(enrichedEvent);        
    }
})

然后您可以使用DatabaseMapper ,如下所示:

stream.keyby(id)
      .flatmap(new DatabaseMapper())
      .addSink(..);

您可以在這里找到使用Redis緩存數據的示例。

暫無
暫無

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

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