繁体   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