spark结构化流媒体应用程序阅读多个Kafka主题

5jvtdoz2  于 2021-06-06  发布在  Kafka
关注(0)|答案(2)|浏览(613)

我有一个spark structured流媒体应用程序(v2.3.2),它需要阅读许多kafka主题,做一些相对简单的处理(主要是聚合和一些连接),并将结果发布到许多其他kafka主题。因此在同一个应用程序中处理多个流。
我想知道,如果我只设置一个直接readstream,订阅多个主题,然后用selects拆分流,而不是每个主题一个readstream,从资源的Angular (内存、执行器、线程、kafka侦听器等)来看,是否会有不同。
像这样的

df = spark.readStream.format("kafka").option("subscribe", "t1,t2,t3")
...
t1df = df.select(...).where("topic = 't1'")...
t2df = df.select(...).where("topic = 't2'")...

与。

t1df = spark.readStream.format("kafka").option("subscribe", "t1")
t2df = spark.readStream.format("kafka").option("subscribe", "t2")

一个比另一个更“有效”吗?我找不到任何关于这是否有影响的文件。
谢谢!

klh5stk1

klh5stk11#

从资源(内存和内核)的Angular 来看,如果在集群上以多个流(多个驱动器和执行器)的形式运行它,则会有所不同。
对于第一个案例,你提到- df = spark.readStream.format("kafka").option("subscribe", "t1,t2,t3")... t1df = df.select(...).where("topic = 't1'")... t2df = df.select(...).where("topic = 't2'")... 考虑到将有一个驱动程序和2个执行器,你已经提供给上述。
在第二种情况下- t1df = spark.readStream.format("kafka").option("subscribe", "t1") t2df = spark.readStream.format("kafka").option("subscribe", "t2") 您可以将它们作为不同的流运行—2个驱动程序和2个执行器(每个执行器1个)。在第二种情况下,需要更多的内存和内核,以满足额外的驱动程序需求。

n9vozmp4

n9vozmp42#

每个操作都需要完整的沿袭执行。你最好把它分成三个独立的Kafka读物。否则,每个主题将阅读n次,其中n是写入次数。
我真的不建议这样做,但如果你想把所有的主题放在同一个阅读,那么就这样做:

streamingDF.writeStream.foreachBatch { (batchDF: DataFrame, batchId: Long) =>
  batchDF.persist()
  batchDF.filter().write.format(...).save(...)  // location 1
  batchDF.filter().write.format(...).save(...)  // location 2
  batchDF.unpersist()
}

相关问题