Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark结构化流媒体应用程序阅读多个卡夫卡主题_Apache Spark_Apache Kafka_Spark Structured Streaming - Fatal编程技术网

Apache spark Spark结构化流媒体应用程序阅读多个卡夫卡主题

Apache spark Spark结构化流媒体应用程序阅读多个卡夫卡主题,apache-spark,apache-kafka,spark-structured-streaming,Apache Spark,Apache Kafka,Spark Structured Streaming,我有一个Spark structured streaming应用程序(v2.3.2),它需要读取许多卡夫卡主题,进行一些相对简单的处理(主要是聚合和一些连接),并将结果发布到许多其他卡夫卡主题。因此,在同一个应用程序中处理多个流 我想知道,如果我只设置一个订阅多个主题的direct readStream,然后使用selects分割流,而不是每个主题1个readStream,那么从资源角度(内存、执行器、线程、Kafka侦听器等)来看,这是否会有不同 差不多 df = spark.readStre

我有一个Spark structured streaming应用程序(v2.3.2),它需要读取许多卡夫卡主题,进行一些相对简单的处理(主要是聚合和一些连接),并将结果发布到许多其他卡夫卡主题。因此,在同一个应用程序中处理多个流

我想知道,如果我只设置一个订阅多个主题的direct readStream,然后使用selects分割流,而不是每个主题1个readStream,那么从资源角度(内存、执行器、线程、Kafka侦听器等)来看,这是否会有不同

差不多

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

其中一个比另一个更“有效”吗?我找不到任何关于这是否有影响的文档


谢谢

每个操作都需要完整的沿袭执行。你最好把它分成三个独立的卡夫卡读物。否则,您将阅读每个主题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()
}
从资源(内存和内核)的角度来看,如果在集群上以多个流(多个驱动器执行器)的形式运行它,则会有所不同

对于第一个案例,您提到-

df=spark.readStream.format(“卡夫卡”)。选项(“订阅”、“t1、t2、t3”)。。。 t1df=df。选择(…)。其中(“主题='t1'”)。。。 t2df=df。选择(…)。其中(“主题='t2'”)。

考虑到将有一个驱动程序和2个执行器,您已提供给上述人员

在第二种情况下-

t1df=spark.readStream.format(“kafka”).option(“订阅”、“t1”)
t2df=spark.readStream.format(“kafka”)。选项(“订阅”、“t2”)

您可以将它们作为不同的流运行—2个驱动程序和2个执行器(每个执行器1个)。
在第二种情况下,将需要更多的内存和内核来提供额外的驱动程序

我认为Spark应用程序只能有一个驱动程序。你是说核心吗?是的,你是对的,spark应用程序只能有一个驱动程序。我的意思是,您可以将第二个案例代码片段作为两个不同的应用程序运行,一个用于主题t1,另一个用于主题t2。感谢这些解释。我明确地不想将流分成两个单独的应用程序。我的设置有很多不同的主题,但是每一个主题只有少量的流量(最多每秒几条消息)。每个主题有一个应用程序会导致集群资源上的大量管理开销,而每个应用程序只做很少的工作。所以我真的想在一个应用程序内进行优化,那么最终的建议是什么@jammann-你能分享你的解决方案吗?我正在运行少量的3-4个应用程序,每个应用程序都包含少量的5-10个查询。每个查询有一个应用程序对我来说开销太大了。我觉得你的第一句话大大提高了我对Spark结构化流媒体的直觉。当“从最后”看它时,很明显,一个人不应该在执行的沿袭中包含不必要的依赖项。谢谢你的洞察力!每个流写入程序都有一个检查点目录,用于跟踪读卡器中的读取偏移量。卡夫卡不在乎一条消息被读了多少次。因此,根据“动作”评论,如果我将两条流连接在一起并写入一个位置,那么也许可以一起读这两条流?意思是一次订阅多个主题。对吗@JoeWidenI很想知道其他考虑因素,比如检查点的位置。
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()
}