Apache spark 是否可以在Spark中设置默认存储级别?

Apache spark 是否可以在Spark中设置默认存储级别?,apache-spark,Apache Spark,在Spark中,可以显式设置RDD和数据帧的存储级别,但是可以更改默认存储级别吗?如果是,如何实现?如果不是,为什么不可能呢 这里和那里都有类似的问题,但答案只是指解决方案是显式设置存储级别,无需进一步解释。请检查以下内容 [SPARK-3824][SQL]将内存表中的默认存储级别设置为内存和磁盘 使用persist()您可以使用各种存储级别在Apache Spark中存储持久化RDD,Spark 3.0中的持久化级别如下: -仅内存:数据直接作为对象存储,仅存储在内存中 -仅内存\u SER:

在Spark中,可以显式设置RDD和数据帧的存储级别,但是可以更改默认存储级别吗?如果是,如何实现?如果不是,为什么不可能呢

这里和那里都有类似的问题,但答案只是指解决方案是显式设置存储级别,无需进一步解释。

请检查以下内容

[SPARK-3824][SQL]将内存表中的默认存储级别设置为内存和磁盘

使用persist()您可以使用各种存储级别在Apache Spark中存储持久化RDD,Spark 3.0中的持久化级别如下:

-仅内存:数据直接作为对象存储,仅存储在内存中

-仅内存\u SER:数据序列化为紧凑的字节数组表示形式,仅存储在内存中。使用 它必须以一定的代价进行反序列化

-内存和磁盘:数据直接作为对象存储在内存中,但如果内存不足,其余数据将序列化并存储在磁盘上

-仅磁盘\u:数据被序列化并存储在磁盘上

-关闭\u堆:数据存储在堆外

-内存和磁盘服务器:类似于内存和磁盘,但数据存储在内存中时会序列化。(数据存储在磁盘上时总是序列化。)

对于rdd,持久化api的默认存储级别为内存,而对于dataset,默认存储级别为内存和磁盘

例如,您可以如下方式保存数据:

val rdd = rdd.persist(StorageLevel.OFF_HEAP)
val df2 = df.persist(StorageLevel.MEMORY_ONLY_SER)

有关更多信息,您可以访问:

我建议您看一下。方法定义和文档如下所示-

/**
   * Caches the data produced by the logical representation of the given [[Dataset]].
   * Unlike `RDD.cache()`, the default storage level is set to be `MEMORY_AND_DISK` because
   * recomputing the in-memory columnar representation of the underlying table is expensive.
   */
  def cacheQuery(
      query: Dataset[_],
      tableName: Option[String] = None,
      storageLevel: StorageLevel = MEMORY_AND_DISK): Unit = writeLock {
    ...
    }
  }
在这里,如果您观察到spark内部没有使用任何配置来获取默认存储级别,那么它的默认值是在源代码中硬编码的


因为没有可用于覆盖默认行为的配置。在保存数据帧/RDD时,只有通过存储级别的选项。

谢谢Vahid,但这并不能回答我的问题。您的回答解释了我如何明确地为RDD和数据帧执行此操作,但没有解释是否以及如何更改默认存储级别。Sry对于误解,对于更改存储级别的默认级别,您应该更改spark-defaults.conf文件。谢谢。这似乎回答了我的问题。我可以想象,在某些情况下,更改默认存储级别在计算上可能非常昂贵,这可能就是我们不应该轻易覆盖它的原因。