什么时候 Kafka 连接器优于 Spark 流解决方案?

When is a Kafka connector preferred over a Spark streaming solution?

使用 Spark 流,我可以读取 Kafka 消息并将数据写入不同类型的表,例如 HBase、Hive 和 Kudu。但这也可以通过为这些表使用 Kafka 连接器来完成。我的问题是,在哪些情况下我应该更喜欢连接器而不是 Spark 流解决方案。

Kafka 连接器解决方案的容忍度如何?我们知道,使用 Spark 流,我们可以在多个节点上使用检查点和执行器 运行 来实现容错执行,但是 Kafka 连接器如何实现容错(如果可能的话)?通过 运行 多个节点上的连接器?

因此,一般来说,就简单地从 Kafka 读取记录并将其发送到其他服务而言,功能上应该没有太大差异。

Kafka Connect 在标准任务方面可能更容易,因为它提供了各种开箱即用的连接器,因此它很可能会减少编写任何代码的需要。因此,如果您只是想将一堆记录从 Kafka 复制到 HDFS 或 Hive,那么使用 Kafka connect 可能会更容易和更快。

考虑到这一点,当你需要做一些不标准的事情时,Spark Streaming 会彻底接管,即如果你想对记录执行一些聚合或计算并将它们写入 Hive,那么你可能应该选择 Spark从头开始流。

一般来说,我发现用 Kafka connect 做一些不合标准的事情,例如将一条消息拆分为多条消息(假设它是 JSON 数组)非常麻烦,而且通常需要比它会在 Spark 中。

至于 Kafka Connect 容错,如文档中所述,这是通过 运行 多个具有相同 group.id 的分布式工作人员实现的,如果其中一个工作人员失败,工作人员会重新分配任务和连接器.

in which situations I should prefer connectors over the Spark streaming solution.

"It Depends":-)

  1. Kafka Connect 是 Apache Kafka 的一部分,因此在安全性、交付语义等方面与 Apache Kafka 的集成更加紧密
  2. 如果您不想编写任何代码,Kafka Connect 更容易,因为它只需 JSON 配置和 运行
  3. 如果你还没有使用 Spark,Kafka Connect 可以说是更 易于部署(运行 JVM,传入配置)
  4. 作为一个框架,Kafka Connect 更具可移植性,因为概念是相同的,您只需为每次要集成的技术插入适当的连接器
  5. Kafka Connect 为您处理所有棘手的事情,例如模式、偏移量、重启、横向扩展等等等等
  6. Kafka Connect 支持单消息转换,以便在数据通过管道时对数据进行更改(屏蔽字段、删除字段、更改数据类型等)。对于更高级的处理,您可以使用 Kafka Streams 或 ksqlDB 之类的东西。
  7. 如果您使用的是 Spark,并且它工作得很好,那么将其拆解以使用 Kafka Connect 并不一定明智:)

Also how tolerant is the Kafka connector solution? … how is fault tolerance (if possibe) achieved with Kafka connectors?

  1. Kafka Connect 可以 运行 处于分布式模式,在这种模式下,您有一个或多个跨节点的工作进程。如果一个 worker 失败,Kafka Connect 会重新平衡剩余任务中的任务。如果添加一个 worker,Kafka Connect 将重新平衡以确保工作负载分配。这在 Apache Kafka 2.3 中得到了显着改进 (KIP-415)
  2. Kafka Connect 使用 Kafka 消费者 API 并跟踪传送到 Kafka 本身目标系统的记录的偏移量。如果任务或工作人员失败,您可以确定它将从正确的点重新启动。许多连接器也支持一次性交付(例如 HDFS、Elasticsearch 等)

如果您想了解有关 Kafka Connect 的更多信息,请参阅 docs here and my talk here. See a list of connectors here, and tutorial videos here


免责声明:我为 Confluent 工作,并且是 Kafka Connect 的忠实粉丝:-)