我有一个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")
一个比另一个更“有效”吗?我找不到任何关于这是否有影响的文件。
谢谢!
2条答案
按热度按时间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个)。在第二种情况下,需要更多的内存和内核,以满足额外的驱动程序需求。n9vozmp42#
每个操作都需要完整的沿袭执行。你最好把它分成三个独立的Kafka读物。否则,每个主题将阅读n次,其中n是写入次数。
我真的不建议这样做,但如果你想把所有的主题放在同一个阅读,那么就这样做: