我即将为我的组织实现一个基于 Kafka 和 Spark 的流基础结构。但是,在 Kafka 中摄取数据时,我对决定最佳方法感到困惑。
对于这项任务,确实有许多解决方案是可能的
。
- Spark本身可以用来从外部源代码读取和写入Kafka。我不想用那条路。
卡- 夫卡连接
- Kafka Client API(生产者和消费者)
- Akka-Stream Kafka(据我所知,这可能是反应式Kafka客户端,但我不确定)
为了做出选择,我当然可以自己尝试一切,但是,我想知道是否有人已经克服了这个障碍。
我倾向于(4)。因此,对于任何对最后任务的这些框架有一些经验的人,我想知道他是否可以与我分享经验。
特别是,我想知道在使用(4)和(2)之间观察到的利弊。是什么让 Kafka Connect 成为更好的摄取选择。使用真的要做更多的工作吗(4)。Kafka Connect是被动的吗?卡夫卡连接手柄背压吗?
将 Kafka 外部的数据导入 Kafka 主题的一种方法是编写自己的服务或应用程序。它将使用普通的 Kafka 生产者,除了与托管数据的外部系统通信外,您的服务或应用程序还必须跟踪它已经处理了哪些数据,以便在重新启动时知道从哪里开始。它还必须跟踪该信息,可能将信息分解为多个并行任务,在多个进程之间分配任务等等。
Akka Streams Kafka 框架实际上只是普通生产者/消费者 API 的响应式变体。您仍然必须执行上述所有相同类型的事情。
Kafka Connect 是一个框架,用于将外部系统中的数据移动到 Kafka 到 Kafka,或者将 Kafka 内部的数据移动到外部系统。Kafka Connect 完成了上述大部分工作,同时委托给连接器进行与外部系统通信和使用外部系统的逻辑。Kafka Connect 定义了源连接器和接收器连接器,每个连接器的职责和功能略有不同。两者都相对容易编写。
Kafka Connect 的一大优势是可用于各种现有系统的可用连接器数量。如果连接器合适,只需安装在 Kafka Connect 工作线程上,配置连接器以与外部系统通信,然后监视和管理 Kafka Connect 工作线程。无需编写任何代码。例如,除了从外部系统复制数据的连接器之外,其他连接器还监视外部系统的更改并捕获新的/更改的/已删除的数据。有时,这些连接器可能只监视文件系统的更改,而其他连接器则是适当的更改数据捕获连接器,用于监视插入、更新和删除的行/对象/文档的数据库管理系统。这些连接器永远运行,不断监视任何新的或更改的信息,并将其传递到适当的 Kafka 主题中。
如果数据存在于没有连接器的系统中,则可以编写源连接器,也可以编写执行大部分工作的普通创建者应用程序。
在之前关于您问题的评论中,您谈到了Kafka和Kafka Connect不是被动的。它们不是,但这并不限制连接器与外部系统的通信方式。有些连接器可以建立与外部系统的连接,外部系统将信息推送到连接器中的客户端。其他连接器实现轮询(或更常见的是长时间轮询)外部系统。这完全取决于您如何与外部系统交谈。
现在,用于源连接器的 Kafka Connect API 确实使用了拉取模型,但基本上这是因为 Kafka Connect worker 正在轮询连接器以查找"源记录",将这些记录写入 Kafka,然后重复该过程。连接器的每个任务都在单独的线程中运行,因此这种持续循环的速度将与连接器生成数据并且 Kafka Connect 可以将其写入 Kafka 的速度一样快。请注意,当当时没有源记录时,连接器通常会阻塞,然后工作线程不会在没有数据时简单地旋转。
从开发人员的角度来看,此 API 非常容易实现。您的连接器任务被要求提供源记录,然后您返回这些记录。Kafka Connect负责其他一切。Kafka Connect 框架由 Kafka 开发人员使用最佳实践和已经更高性能的 Kafka 生产者库编写。
在容错方面,Kafka Connect 工作线程集群将自动在集群中分配连接器和任务。如果任何工作线程失败或无法与群集的其余部分(例如,网络分区)通信,群集将自动在其余工作线程上重新平衡连接器的任务。由于 Kafka Connect 会自动管理/保留连接器的偏移量(每条消息来自源中的位置),因此重新启动的任务将从其他任务中断的位置继续,从而确保至少一次数据在外部源系统中传递。