簡體   English   中英

Kafka -> Flink DataStream -> MongoDB

[英]Kafka -> Flink DataStream -> MongoDB

我想設置 Flink,以便它將數據流從 Apache Kafka 轉換和重定向到 MongoDB。 出於測試目的,我在 flink-streaming-connectors.kafka 示例( https://github.com/apache/flink )之上構建。

Kafka 流被 Flink 正確紅色,我可以映射它們等,但是當我想將每個收到和轉換的消息保存到 MongoDB 時就會出現問題。 我發現的關於 MongoDB 集成的唯一示例是來自 github 的 flink-mongodb-test。 不幸的是,它使用靜態數據源(數據庫),而不是數據流。

我相信 MongoDB 應該有一些 DataStream.addSink 實現,但顯然沒有。

實現它的最佳方法是什么? 我需要編寫自定義接收器函數還是我遺漏了什么? 也許它應該以不同的方式完成?

我不依賴於任何解決方案,因此任何建議將不勝感激。

下面有一個例子,我到底得到了什么作為輸入以及我需要作為輸出存儲什么。

Apache Kafka Broker <-------------- "AAABBBCCCDDD" (String)
Apache Kafka Broker --------------> Flink: DataStream<String>

Flink: DataStream.map({
    return ("AAABBBCCCDDD").convertTo("A: AAA; B: BBB; C: CCC; D: DDD")
})
.rebalance()
.addSink(MongoDBSinkFunction); // store the row in MongoDB collection

正如你在這個例子中看到的,我使用 Flink 主要是為了 Kafka 的消息流緩沖和一些基本的解析。

作為 Robert Metzger 答案的替代方法,您可以再次將結果寫入 Kafka,然后使用維護的 kafka 連接器之一將主題內容刪除到 MongoDB 數據庫中。

Kafka -> Flink -> Kafka -> Mongo/任何東西

通過這種方法,您可以維護“至少一次語義”行為。

目前 Flink 中沒有可用的 Streaming MongoDB sink。

但是,有兩種方法可以將數據寫入 MongoDB:

  • 使用 Flink 的DataStream.write()調用。 它允許您將任何 OutputFormat(來自 Batch API)與流媒體結合使用。 使用 Flink 的 HadoopOutputFormatWrapper,可以使用官方的 MongoDB Hadoop 連接器

  • 自己實現接收器。 使用 Streaming API 實現接收器非常容易,而且我確信 MongoDB 有一個很好的 Java 客戶端庫。

這兩種方法都不提供任何復雜的處理保證。 但是,當您將 Flink 與 Kafka(並啟用檢查點)一起使用時,您將擁有至少一次語義:在錯誤情況下,數據將再次流式傳輸到 MongoDB 接收器。 如果您正在執行冪等更新,則重做這些更新不應導致任何不一致。

如果你真的需要 MongoDB 的一次性語義,你可能應該在 Flink 中提交一個JIRA並與社區討論如何實現它。

暫無
暫無

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

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