什么时候 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":-)
- Kafka Connect 是 Apache Kafka 的一部分,因此在安全性、交付语义等方面与 Apache Kafka 的集成更加紧密
- 如果您不想编写任何代码,Kafka Connect 更容易,因为它只需 JSON 配置和 运行
- 如果你还没有使用 Spark,Kafka Connect 可以说是更
易于部署(运行 JVM,传入配置)
- 作为一个框架,Kafka Connect 更具可移植性,因为概念是相同的,您只需为每次要集成的技术插入适当的连接器
- Kafka Connect 为您处理所有棘手的事情,例如模式、偏移量、重启、横向扩展等等等等
- Kafka Connect 支持单消息转换,以便在数据通过管道时对数据进行更改(屏蔽字段、删除字段、更改数据类型等)。对于更高级的处理,您可以使用 Kafka Streams 或 ksqlDB 之类的东西。
- 如果您使用的是 Spark,并且它工作得很好,那么将其拆解以使用 Kafka Connect 并不一定明智:)
Also how tolerant is the Kafka connector solution? … how is fault tolerance (if possibe) achieved with Kafka connectors?
- Kafka Connect 可以 运行 处于分布式模式,在这种模式下,您有一个或多个跨节点的工作进程。如果一个 worker 失败,Kafka Connect 会重新平衡剩余任务中的任务。如果添加一个 worker,Kafka Connect 将重新平衡以确保工作负载分配。这在 Apache Kafka 2.3 中得到了显着改进 (KIP-415)
- 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 的忠实粉丝:-)
使用 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":-)
- Kafka Connect 是 Apache Kafka 的一部分,因此在安全性、交付语义等方面与 Apache Kafka 的集成更加紧密
- 如果您不想编写任何代码,Kafka Connect 更容易,因为它只需 JSON 配置和 运行
- 如果你还没有使用 Spark,Kafka Connect 可以说是更 易于部署(运行 JVM,传入配置)
- 作为一个框架,Kafka Connect 更具可移植性,因为概念是相同的,您只需为每次要集成的技术插入适当的连接器
- Kafka Connect 为您处理所有棘手的事情,例如模式、偏移量、重启、横向扩展等等等等
- Kafka Connect 支持单消息转换,以便在数据通过管道时对数据进行更改(屏蔽字段、删除字段、更改数据类型等)。对于更高级的处理,您可以使用 Kafka Streams 或 ksqlDB 之类的东西。
- 如果您使用的是 Spark,并且它工作得很好,那么将其拆解以使用 Kafka Connect 并不一定明智:)
Also how tolerant is the Kafka connector solution? … how is fault tolerance (if possibe) achieved with Kafka connectors?
- Kafka Connect 可以 运行 处于分布式模式,在这种模式下,您有一个或多个跨节点的工作进程。如果一个 worker 失败,Kafka Connect 会重新平衡剩余任务中的任务。如果添加一个 worker,Kafka Connect 将重新平衡以确保工作负载分配。这在 Apache Kafka 2.3 中得到了显着改进 (KIP-415)
- 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 的忠实粉丝:-)