在Spark中,对象和变量是如何保存在内存中以及不同的执行器之间的



在Spark中,对象和变量是如何在内存中以及在不同的执行器中保存的?

我正在使用:

  • Spark 3.0.0
  • Scala 2.12

我正在写一个带有自定义流源的Spark结构化流作业。在执行spark查询之前,我创建了一组元数据,供我的spark Streaming Job 使用

我试图理解这些元数据是如何在不同的执行器中保存在内存中的?

示例代码:

case class JobConfig(fieldName: String, displayName: String, castTo: String)

val jobConfigs:List[JobConfig] = build(); //build the job configs
val query = spark
.readStream
.format("custom-streaming")
.load
query
.writeStream
.trigger(Trigger.ProcessingTime(2, TimeUnit.MINUTES))
.foreachBatch { (batchDF: DataFrame, batchId: Long) => {
CustomJobExecutor.start(jobConfigs) //CustomJobExecutor does data frame transformations and save the data in PostgreSQL.
}
}.outputMode(OutputMode.Append()).start().awaitTermination()

需要帮助理解以下内容:

在示例代码中,Spark将如何保持";jobConfigs";不同执行人之间的记忆?

广播还有什么额外的好处吗?

保留无法反序列化的变量的有效方法是什么?

为每个任务复制本地变量,同时只为每个执行器复制广播的变量。来自文档

Spark操作通过一组阶段执行,这些阶段由分布式"shuffle"操作分隔。Spark自动广播每个阶段中任务所需的公共数据。以这种方式广播的数据以序列化的形式缓存,并在运行每个任务之前进行反序列化。这意味着,只有当跨多个阶段的任务需要相同的数据时,或者当以反序列化形式缓存数据很重要时,显式创建广播变量才有用。

这意味着,如果您的jobConfigs足够大,并且使用变量的任务和阶段的数量明显大于执行器的数量,或者反序列化很耗时,那么在这种情况下,广播变量可能会有所不同。在其他情况下,他们不会。

最新更新