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