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 集群。您也不必考虑两个主题之间的不均匀性,例如:分区数。这使作业调整更容易。
考虑到来自两个主题的数据在一点连接并最终发送到 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 是一种直接的方法,它跳过了过滤阶段,因此效率更高一些。它还从基础设施的角度在两个流中提供自主权,例如:主题之一是移动到新的 kafka 集群。您也不必考虑两个主题之间的不均匀性,例如:分区数。这使作业调整更容易。