Spark Structured Streaming 从具有多个读取流的多个 Kafka 主题读取

Spark Structured Streaming reading from multiple Kafka topics with multiple read streams

考虑到来自两个主题的数据在一点连接并最终发送到 Kafka sink,这是从多个主题读取的最佳方式

val df = spark
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", servers)
  .option("subscribe", "t1,t2")

对比

val df1 = spark
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", servers)
  .option("subscribe", "t1")

val df2 = spark
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", servers)
  .option("subscribe", "t2")

我会在某个地方df1.join(df2)并将其发送到 Kafka sink。

就性能和资源使用而言,哪个是更好的选择?

提前致谢

PS:我看到另一个类似的问题 但是来自 2 个主题的数据框似乎没有一起使用

在第一种方法中,您必须在某个时候添加过滤器,然后继续加入。除非,您还想同时处理这两个流,否则第二种方法性能更高且更易于维护。

我想说方法 2 是一种直接的方法,它跳过了过滤阶段,因此效率更高一些。它还从基础设施的角度在两个流中提供自主权,例如:主题之一是移动到新的 kafka 集群。您也不必考虑两个主题之间的不均匀性,例如:分区数。这使作业调整更容易。