繁体   English   中英

在 Spark 中,对象和变量如何保存在 memory 和不同的执行程序中?

[英]In Spark, how objects and variables are kept in memory and across different executors?

在 Spark 中,对象和变量如何保存在 memory 和不同的执行程序中?

我在用:

  • 火花 3.0.0
  • Scala 2.12

我正在使用自定义 Stream 源编写 Spark Structured Streaming 作业。 在执行 spark 查询之前,我创建了一堆元数据,供我的 Spark Streaming Job 使用

我想了解这些元数据如何在不同的执行者之间保存在 memory 中?

示例代码:

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 如何将 memory 中的“jobConfigs”保留在不同的执行程序中?

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

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

为每个任务复制局部变量,而广播变量仅在每个执行程序中复制。 来自文档

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM