精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文詳解Spark內(nèi)存模型原理,面試輕松搞定

開(kāi)發(fā) 前端
Spark內(nèi)存管理的核心目標(biāo)是在有限的內(nèi)存資源下,實(shí)現(xiàn)數(shù)據(jù)緩存的最大化利用和執(zhí)行計(jì)算的高效進(jìn)行,同時(shí)盡量減少由于內(nèi)存不足導(dǎo)致的數(shù)據(jù)重算或內(nèi)存溢出等問(wèn)題,是整個(gè)spark允許可以穩(wěn)定運(yùn)行的基礎(chǔ)保障。

1.引言 

Spark 是一個(gè)基于內(nèi)存處理的計(jì)算引擎,其中任務(wù)執(zhí)行的所有計(jì)算都發(fā)生在內(nèi)存中。因此,了解 Spark 內(nèi)存管理非常重要。這將有助于我們開(kāi)發(fā) Spark 應(yīng)用程序并執(zhí)行性能調(diào)優(yōu)。我們?cè)谑褂胹park-submit去提交spark任務(wù)的時(shí)候可以使用--executor-memory和--driver-memory這兩個(gè)參數(shù)去指定任務(wù)提交時(shí)的內(nèi)存分配,如果提交時(shí)內(nèi)存分配過(guò)大,會(huì)占用資源。如果內(nèi)存分配太小,則很容易出現(xiàn)內(nèi)存溢出和滿GC問(wèn)題。

Efficient memory use is critical for good performance, but the reverse is also true: inefficient memory use leads to bad performance.

Spark 的整體架構(gòu)圖如下:

圖片圖片

Spark 應(yīng)用程序包括兩個(gè) JVM 進(jìn)程:driver進(jìn)程和executor進(jìn)程。其中:

  • driver進(jìn)程是主控制進(jìn)程,負(fù)責(zé)創(chuàng)建 SparkSession/SparkContext、提交作業(yè)、將作業(yè)轉(zhuǎn)換為任務(wù)以及協(xié)調(diào)執(zhí)行器之間的任務(wù)執(zhí)行。
  • executor進(jìn)程主要負(fù)責(zé)執(zhí)行特定的計(jì)算任務(wù)并將結(jié)果返回給驅(qū)動(dòng)程序。driver的進(jìn)程的內(nèi)存管理相對(duì)簡(jiǎn)單,Spark并沒(méi)有對(duì)此制定具體內(nèi)存管理計(jì)劃。

因此在這篇文章中,我們將會(huì)詳細(xì)深入分析executor的內(nèi)存管理。

2.Excutor內(nèi)存模型

executor充當(dāng)在工作節(jié)點(diǎn)上啟動(dòng)的 JVM 進(jìn)程。因此,了解 JVM 內(nèi)存管理非常重要。我們知道JVM 內(nèi)存管理分為兩種類型: 

  • 堆內(nèi)存管理(In-Heap Memory):對(duì)象在 JVM 堆上分配并由 GC 綁定。
  • 堆外內(nèi)存管理(外部?jī)?nèi)存):對(duì)象通過(guò)序列化在JVM外部的內(nèi)存中分配,由應(yīng)用程序管理,不受GC約束。 

整體的JVM結(jié)構(gòu)如下所示:

圖片圖片

通常,對(duì)象的讀寫(xiě)速度為:on-heap > off-heap > disk

2.1 內(nèi)存管理 

Spark 內(nèi)存管理分為兩種類型:靜態(tài)內(nèi)存管理器(Static Memory Management,SMM),以及統(tǒng)一內(nèi)存管理器(Unified Memory Management,UMM)。

圖片圖片

在Spark1.6.0之前只有一種內(nèi)存管理方案,即Static Memory Management,但是從 Spark 1.6.0 開(kāi)始,引入U(xiǎn)nified Memory Manager 內(nèi)存管理方案,并被設(shè)置為 Spark 的默認(rèn)內(nèi)存管理器,從代碼中開(kāi)始發(fā)現(xiàn)(以下代碼是基于spark 2.4.8)。

// Determine whether to use the old memory management mode
val useLegacyMemoryManager = conf.getBoolean("spark.memory.useLegacyMode", false)


val memoryManager: MemoryManager =
if (useLegacyMemoryManager) {


// The old version uses static memory management
new StaticMemoryManager(conf, numUsableCores)


} else {
// The new version uses unified memory management
UnifiedMemoryManager(conf, numUsableCores)


}

而在最新的Spark 3.x開(kāi)始, Static Memory Management由于缺乏靈活性而已棄用,在源碼中已經(jīng)看到關(guān)于Static Memory Management的所有代碼,自然也就看不到控制內(nèi)存管理方案選擇的spark.memory.useLegacyMode這個(gè)參數(shù)。

2.2 靜態(tài)內(nèi)存管理器(SMM)

雖然在spark 3.x版本開(kāi)始SMM已經(jīng)被淘汰了,但是目前很多企業(yè)使用的spark的版本還有很多是3.x之前的,因此我覺(jué)得為了整個(gè)學(xué)習(xí)的連貫性,還是有必要說(shuō)一下的靜態(tài)內(nèi)存管理器 (SMM) 是用于內(nèi)存管理的傳統(tǒng)模型和簡(jiǎn)單方案,該方案實(shí)現(xiàn)上簡(jiǎn)單粗暴,將整個(gè)內(nèi)存區(qū)間分成了:存儲(chǔ)內(nèi)存(storage memory,)、執(zhí)行內(nèi)存(execution memory)和其他內(nèi)存(other memory)的大小在應(yīng)用程序處理過(guò)程中是固定的,但用戶可以在應(yīng)用程序啟動(dòng)之前進(jìn)行配置。這三部分內(nèi)存的作用及占比如下:storage memory:主要用于緩存數(shù)據(jù)塊以提高性能,同時(shí)也用于連續(xù)不斷地廣播或發(fā)送大的任務(wù)結(jié)果。通過(guò)spark.storage.memoryFraction進(jìn)行配置,默認(rèn)為0.6。

/**
 * Return the total amount of memory available for the storage region, in bytes.
 */
private def getMaxStorageMemory(conf: SparkConf): Long = {
  val systemMaxMemory = conf.getLong("spark.testing.memory", Runtime.getRuntime.maxMemory)
  val memoryFraction = conf.getDouble("spark.storage.memoryFraction", 0.6)
  val safetyFraction = conf.getDouble("spark.storage.safetyFraction", 0.9)
  (systemMaxMemory * memoryFraction * safetyFraction).toLong
}

其中又可以分成兩部分:預(yù)留區(qū)域:這部分主要是為了防止OOM,大概占了存儲(chǔ)區(qū)域中的10%,由參數(shù)spark.storage.safetyFraction控制;可用的存儲(chǔ)區(qū)域:該區(qū)域主要是為了緩存RDD的數(shù)據(jù)和Broadcast數(shù)據(jù),大概占了存儲(chǔ)區(qū)域的90%。另外該區(qū)域中并不是所有的內(nèi)存都用于以上作用,還單獨(dú)拎出來(lái)一部分區(qū)域用于緩存iterator形式的block數(shù)據(jù),我們稱之為Unroll區(qū)域,由參數(shù)spark.storage.unrollFraction控制,大概占了可用的存儲(chǔ)區(qū)域的20%,如下:

private val maxUnrollMemory: Long = {
  (maxOnHeapStorageMemory * conf.getDouble("spark.storage.unrollFraction", 0.2)).toLong
}

execution memory:在執(zhí)行shuffle、join、sort和aggregation時(shí),用于緩存中間數(shù)據(jù)。通過(guò)spark.shuffle.memoryFraction進(jìn)行配置,默認(rèn)為0.2。

private def getMaxExecutionMemory(conf: SparkConf): Long = {
  val systemMaxMemory = conf.getLong("spark.testing.memory", Runtime.getRuntime.maxMemory)

  if (systemMaxMemory < MIN_MEMORY_BYTES) {
    throw new IllegalArgumentException(s"System memory $systemMaxMemory must " +
      s"be at least $MIN_MEMORY_BYTES. Please increase heap size using the --driver-memory " +
      s"option or spark.driver.memory in Spark configuration.")
  }
  if (conf.contains("spark.executor.memory")) {
    val executorMemory = conf.getSizeAsBytes("spark.executor.memory")
    if (executorMemory < MIN_MEMORY_BYTES) {
      throw new IllegalArgumentException(s"Executor memory $executorMemory must be at least " +
        s"$MIN_MEMORY_BYTES. Please increase executor memory using the " +
        s"--executor-memory option or spark.executor.memory in Spark configuration.")
    }
  }
  val memoryFraction = conf.getDouble("spark.shuffle.memoryFraction", 0.2)
  val safetyFraction = conf.getDouble("spark.shuffle.safetyFraction", 0.8)
  (systemMaxMemory * memoryFraction * safetyFraction).toLong
}

從代碼中我們可以看到,可執(zhí)行內(nèi)存也分成了兩個(gè)部分:預(yù)留部分和可用部分,類似存儲(chǔ)內(nèi)存學(xué)習(xí),這里不在贅述。other memory:除了以上兩部分的內(nèi)存,剩下的就是用于其他用作的內(nèi)存,默認(rèn)為0.2。這部分內(nèi)存用于存儲(chǔ)運(yùn)行Spark系統(tǒng)本身需要加載的代碼與元數(shù)據(jù)。因此,關(guān)于SMM的整體分配圖如下

圖片圖片

基于此就會(huì)產(chǎn)生不可逾越的缺點(diǎn):即使存儲(chǔ)內(nèi)存有可用空間,我們也無(wú)法使用它,并且由于執(zhí)行程序內(nèi)存已滿,因此存在磁盤(pán)溢出。(反之亦然)。另外一個(gè)最大的問(wèn)題就是:SMM只支持堆內(nèi)內(nèi)存(On-Heap),不支持對(duì)外內(nèi)存(Off-Heap)

補(bǔ)充知識(shí)1:在Spark的存儲(chǔ)體系中,數(shù)據(jù)的讀寫(xiě)是以塊(Block)為單位,也就是說(shuō)Block是Spark存儲(chǔ)的基本單位,這里的Block和Hdfs的Block是不一樣的,HDFS中是對(duì)大文件進(jìn)行分Block進(jìn)行存儲(chǔ),Block大小是由dfs.blocksize決定的;而Spark中的Block是用戶的操作單位,一個(gè)Block對(duì)應(yīng)一塊有組織的內(nèi)存,一個(gè)完整的文件或文件的區(qū)間端,并沒(méi)有固定每個(gè)Block大小的做法。每個(gè)塊都有唯一的標(biāo)識(shí),Spark把這個(gè)標(biāo)識(shí)抽象為BlockId。BlockId本質(zhì)上是一個(gè)字符串,但是在Spark中將它保證為"一組"case類,這些類的不同本質(zhì)是BlockID這個(gè)命名字符串的不同,從而可以通過(guò)BlockID這個(gè)字符串來(lái)區(qū)別BlockId

補(bǔ)充知識(shí)2:內(nèi)存池是Spark內(nèi)存的抽象,它記錄了總內(nèi)存大小,已使用內(nèi)存大小,剩余內(nèi)存大小,提供給MemoryManager進(jìn)行分配/回收內(nèi)存。它包括兩個(gè)實(shí)現(xiàn)類:ExecutionMemoryPool和StorageMemoryPool,分別對(duì)應(yīng)execution memory和storage memory。當(dāng)需要新的內(nèi)存時(shí),spark通過(guò)memoryPool來(lái)判斷內(nèi)存是否充足。需要注意的是memoryPool以及子類方法只是用來(lái)標(biāo)記內(nèi)存使用情況,而不實(shí)際分配/回收內(nèi)存。 

2.3 統(tǒng)一內(nèi)存管理器(UMM)

從 Spark 1.6.0 開(kāi)始,采用了新的內(nèi)存管理器來(lái)取代靜態(tài)內(nèi)存管理器,并為 Spark 提供動(dòng)態(tài)內(nèi)存分配。它將內(nèi)存區(qū)域分配為由存儲(chǔ)和執(zhí)行共享的統(tǒng)一內(nèi)存容器。當(dāng)未使用執(zhí)行內(nèi)存時(shí),存儲(chǔ)內(nèi)存可以獲取所有可用內(nèi)存,反之亦然。如果任何存儲(chǔ)或執(zhí)行內(nèi)存需要更多空間,則會(huì)調(diào)用acquireMemory方法將擴(kuò)展其中一個(gè)內(nèi)存池并收縮另一個(gè)內(nèi)存池。因此,UMM相比SMM的內(nèi)存管理優(yōu)勢(shì)明顯:存儲(chǔ)內(nèi)存和執(zhí)行內(nèi)存之間的邊界不是靜態(tài)的,在內(nèi)存壓力的情況下,邊界會(huì)移動(dòng),即一個(gè)區(qū)域會(huì)通過(guò)從另一個(gè)區(qū)域借用空間來(lái)增長(zhǎng)。當(dāng)應(yīng)用程序沒(méi)有緩存并且正在進(jìn)行時(shí),執(zhí)行會(huì)使用所有內(nèi)存以避免不必要的磁盤(pán)溢出。當(dāng)應(yīng)用程序有緩存時(shí),它將保留最小存儲(chǔ)內(nèi)存,以便數(shù)據(jù)塊不受影響。此內(nèi)存管理可為各種工作負(fù)載提供合理的開(kāi)箱即用性能,而無(wú)需用戶了解內(nèi)存內(nèi)部劃分方式的專業(yè)知識(shí)。

2.3.1 堆內(nèi)存

默認(rèn)情況下,Spark 僅使用堆內(nèi)存。Spark 應(yīng)用程序啟動(dòng)時(shí),堆內(nèi)存的大小由 --executor-memory 或 spark.executor.memory 參數(shù)配置。在UMM下,spark的堆內(nèi)存結(jié)構(gòu)圖如下:

圖片圖片

我們發(fā)現(xiàn)大體上和SMM沒(méi)有太大的區(qū)別,包括每個(gè)區(qū)域的功能,只是UMM在Storage和Execution可以彈性的變化(這一點(diǎn)也是spark rdd中“彈性”的體現(xiàn)之一)。

備注:在 Spark 1.6 中,spark.memory.fraction 值為 0.75,spark.memory.storageFraction 值為 0.5。從spark 2.x開(kāi)始spark.memory.fraction 值為 0.6。

2.3.1.1 System Reserved:系統(tǒng)預(yù)留

預(yù)留內(nèi)存是為系統(tǒng)預(yù)留的內(nèi)存,用于存儲(chǔ)Spark的內(nèi)部對(duì)象。從 Spark 1.6 開(kāi)始,該值為 300MB。這意味著 300MB 的 RAM 不參與 Spark 內(nèi)存區(qū)域大小計(jì)算。預(yù)留內(nèi)存的大小是硬編碼的,如果不重新編譯 Spark 或設(shè)置 spark.testing.reservedMemory,則無(wú)法以任何方式更改其大小,一般在實(shí)際的生產(chǎn)環(huán)境中不建議修改此值。

private val RESERVED_SYSTEM_MEMORY_BYTES = 300 * 1024 * 1024


val reservedMemory = conf.getLong("spark.testing.reservedMemory",
  if (conf.contains("spark.testing")) 0 else RESERVED_SYSTEM_MEMORY_BYTES)
val minSystemMemory = (reservedMemory * 1.5).ceil.toLong
if (systemMemory < minSystemMemory) {
  throw new IllegalArgumentException(s"System memory $systemMemory must " +
    s"be at least $minSystemMemory. Please increase heap size using the --driver-memory " +
    s"option or spark.driver.memory in Spark configuration.")
}

從源碼中我們可以看出,如果執(zhí)行程序內(nèi)存小于保留內(nèi)存的 1.5 倍(1.5 * 保留內(nèi)存 = 450MB),則 Spark 作業(yè)將失敗,并顯示以下異常消息:

24/03/20 13:55:51 ERROR repl.Main: Failed to initialize Spark session.
java.lang.IllegalArgumentException: Executor memory 314572800 must be at least 471859200. Please increase executor memory using the --executor-memory option or spark.executor.memory in Spark configuration.
        at org.apache.spark.memory.UnifiedMemoryManager$.getMaxMemory(UnifiedMemoryManager.scala:225)
        at org.apache.spark.memory.UnifiedMemoryManager$.apply(UnifiedMemoryManager.scala:199)

2.3.1.2 其他內(nèi)存(或稱用戶內(nèi)存)

其他內(nèi)存是用于存儲(chǔ)用戶定義的數(shù)據(jù)結(jié)構(gòu)、Spark 內(nèi)部元數(shù)據(jù)、用戶創(chuàng)建的任何 UDF 以及 RDD 轉(zhuǎn)換操作所需的數(shù)據(jù)(如 RDD 依賴信息等)的內(nèi)存。例如,我們可以通過(guò)使用 mapPartitions 轉(zhuǎn)換來(lái)重寫(xiě) Spark 聚合,以維護(hù)一個(gè)哈希表以運(yùn)行此聚合,這將消耗所謂的其他內(nèi)存。此內(nèi)存段不受 Spark 管理,計(jì)算公式為:(Java Heap - Reserved Memory) * (1.0 - spark.memory.fraction)。

2.3.1.3 Spark內(nèi)存(或稱統(tǒng)一內(nèi)存)

Spark Memory 是由 Apache Spark 管理的內(nèi)存池。Spark Memory 負(fù)責(zé)在執(zhí)行任務(wù)(如聯(lián)接)或存儲(chǔ)廣播變量時(shí)存儲(chǔ)中間狀態(tài)。計(jì)算公式為:(Java Heap - Reserved Memory) * spark.memory.fraction。

Spark 任務(wù)在兩個(gè)主要內(nèi)存區(qū)域中運(yùn)行:

  • Executor Memory:用于隨機(jī)播放、聯(lián)接、排序和聚合。
  • Storage Memory:用于緩存數(shù)據(jù)分區(qū)。

它們之間的邊界由 spark.memory.storageFraction 參數(shù)設(shè)置,默認(rèn)為 0.5 或 50%。

1)StorageMemory: 存儲(chǔ)內(nèi)存

存儲(chǔ)內(nèi)存用于存儲(chǔ)所有緩存數(shù)據(jù)、廣播變量、unroll數(shù)據(jù)等,“unroll”本質(zhì)上是反序列化序列化數(shù)據(jù)的過(guò)程。任何包含內(nèi)存的持久性選項(xiàng)都會(huì)將該數(shù)據(jù)存儲(chǔ)在此段中。Spark 通過(guò)刪除基于最近最少使用 (LRU) 機(jī)制的舊緩存對(duì)象來(lái)為新緩存請(qǐng)求清除空間。緩存的數(shù)據(jù)從存儲(chǔ)中取出后,將寫(xiě)入磁盤(pán)或根據(jù)配置重新計(jì)算。廣播變量存儲(chǔ)在緩存中,具有MEMORY_AND_DISK持久性級(jí)別。這就是我們存儲(chǔ)緩存數(shù)據(jù)的地方,這些數(shù)據(jù)是長(zhǎng)期存在的。

計(jì)算公式:

(Java Heap - Reserved Memory) * spark.memory.fraction * spark.memory.storageFraction

2)Execution Memory:執(zhí)行內(nèi)存

執(zhí)行內(nèi)存用于存儲(chǔ) Spark 任務(wù)執(zhí)行過(guò)程中所需的對(duì)象。例如,它用于將映射端的shuffle中間緩沖區(qū)存儲(chǔ)在內(nèi)存中。此外,它還用于存儲(chǔ)hash聚合步驟的hash table。如果沒(méi)有足夠的可用內(nèi)存,執(zhí)行內(nèi)存池還支持溢出磁盤(pán),但是其他線程(任務(wù))無(wú)法強(qiáng)制逐出此池中的block。執(zhí)行內(nèi)存往往比存儲(chǔ)內(nèi)存壽命更短。每次操作后都會(huì)立即將其逐出,為下一次操作騰出空間。

計(jì)算公式:

(Java Heap - Reserved Memory) * spark.memory.fraction * (1.0 -  spark.memory.storageFraction)

由于執(zhí)行內(nèi)存的性質(zhì),無(wú)法從此池中強(qiáng)制逐出塊;否則,執(zhí)行將中斷,因?yàn)檎也坏剿玫膲K。但是,當(dāng)涉及到存儲(chǔ)內(nèi)存時(shí),可以根據(jù)需要從內(nèi)存中逐出block并寫(xiě)入磁盤(pán)或重新計(jì)算(如果持久性級(jí)別為MEMORY_ONLY)。

存儲(chǔ)和執(zhí)行池借用規(guī)則:

  • 只有當(dāng)執(zhí)行內(nèi)存中有未使用的塊時(shí),存儲(chǔ)內(nèi)存才能從執(zhí)行內(nèi)存中借用空間。
  • 如果塊未在存儲(chǔ)內(nèi)存中使用,則執(zhí)行內(nèi)存也可以從存儲(chǔ)內(nèi)存中借用空間。
  • 如果存儲(chǔ)內(nèi)存使用執(zhí)行內(nèi)存中的塊,并且執(zhí)行需要更多內(nèi)存,則可以強(qiáng)制逐出存儲(chǔ)內(nèi)存占用的多余塊
  • 如果存儲(chǔ)內(nèi)存中的塊被執(zhí)行內(nèi)存使用,而存儲(chǔ)需要更多的內(nèi)存,則無(wú)法強(qiáng)行逐出執(zhí)行內(nèi)存占用的多余塊;它將具有更少的內(nèi)存區(qū)域。它將等到 Spark 釋放存儲(chǔ)在執(zhí)行內(nèi)存中的多余塊,然后占用它們。

案例:計(jì)算 5 GB 執(zhí)行程序內(nèi)存的內(nèi)存

為了計(jì)算預(yù)留內(nèi)存、用戶內(nèi)存、spark內(nèi)存、存儲(chǔ)內(nèi)存和執(zhí)行內(nèi)存,我們將使用以下參數(shù):

spark.executor.memory=5g
spark.memory.fractinotallow=0.6
spark.memory.storageFractinotallow=0.5

那么會(huì)得到如下結(jié)論:

Java Heap Memory = 5 GB
                               = 5 * 1024 MB
                               = 5120 MB


Reserved Memory      = 300 MB


Usable Memory        = (Java Heap Memory - Reserved Memory)
                                 = 5120 MB - 300 MB
                                 = 4820 MB


User Memory            = Usable Memory * (1.0 * spark.memory.fraction) 
                                 = 4820 MB * (1.0 - 0.6) 
                                 = 4820 MB * 0.4 
                                 = 1928 MB


Spark Memory           = Usable Memory * spark.memory.fraction
                                  = 4820 MB * 0.6 
                                  = 2892 MB


Spark Storage Memory   = Spark Memory * Spark.memory.storageFraction
                                       = 2892 MB * 0.5 
                                       = 1446 MB


Spark Execution Memory = Spark Memory * (1.0 - spark.memory.storageFraction)
                       = 2892 MB * ( 1 - 0.5) 
                       = 2892 MB * 0.5 
                       = 1446 MB

2.3.2 堆外內(nèi)存

堆外內(nèi)存是指將內(nèi)存對(duì)象(序列化為字節(jié)數(shù)組)分配給 JVM堆之外的內(nèi)存,該堆由操作系統(tǒng)(而不是JVM)直接管理,但存儲(chǔ)在進(jìn)程堆之外的本機(jī)內(nèi)存中(因此,它們不會(huì)被垃圾回收器處理)。這樣做的結(jié)果是保留較小的堆,以減少垃圾回收對(duì)應(yīng)用程序的影響。訪問(wèn)此數(shù)據(jù)比訪問(wèn)堆存儲(chǔ)稍慢,但仍比從磁盤(pán)讀取/寫(xiě)入快。缺點(diǎn)是用戶必須手動(dòng)處理管理分配的內(nèi)存。此模型不適用于 JVM 內(nèi)存,而是將 malloc()  中不安全相關(guān)語(yǔ)言(如 C)的 Java API 直接調(diào)用操作系統(tǒng)以獲取內(nèi)存。由于此方法不是對(duì) JVM 內(nèi)存進(jìn)行管理,因此請(qǐng)避免頻繁 GC。此應(yīng)用程序的缺點(diǎn)是內(nèi)存必須寫(xiě)入自己的邏輯和內(nèi)存應(yīng)用程序版本。Spark 1.6+ 開(kāi)始引入堆外內(nèi)存,可以選擇使用堆外內(nèi)存來(lái)分配 Unified Memory Manager。

默認(rèn)情況下,堆外內(nèi)存是禁用的,但我們可以通過(guò) spark.memory.offHeap.enabled(默認(rèn)為 false)參數(shù)啟用它,并通過(guò) spark.memory.offHeap.size(默認(rèn)為 0)參數(shù)設(shè)置內(nèi)存大小。如:

spark-shell \
    --conf spark.memory.offHeap.enabled=true \
    --conf spark.memory.offHeap.size=5g

堆外內(nèi)存支持OFF_HEAP持久性級(jí)別。與堆上內(nèi)存相比,堆外內(nèi)存的模型相對(duì)簡(jiǎn)單,僅包括存儲(chǔ)內(nèi)存和執(zhí)行內(nèi)存。

如果啟用了堆外內(nèi)存,Executor 中的 Execution Memory 是堆內(nèi)的 Execution 內(nèi)存和堆外的 Execution 內(nèi)存之和。存儲(chǔ)內(nèi)存也是如此。

總之,Spark內(nèi)存管理的核心目標(biāo)是在有限的內(nèi)存資源下,實(shí)現(xiàn)數(shù)據(jù)緩存的最大化利用和執(zhí)行計(jì)算的高效進(jìn)行,同時(shí)盡量減少由于內(nèi)存不足導(dǎo)致的數(shù)據(jù)重算或內(nèi)存溢出等問(wèn)題,是整個(gè)spark允許可以穩(wěn)定運(yùn)行的基礎(chǔ)保障。

責(zé)任編輯:武曉燕 來(lái)源: 滌生大數(shù)據(jù)
相關(guān)推薦

2021-10-06 20:23:08

Linux共享內(nèi)存

2024-01-09 08:24:47

JMM核心線程

2017-11-20 16:43:40

高斯混合模型算法K-means

2021-08-31 07:02:34

數(shù)據(jù)響應(yīng)Vue偵測(cè)數(shù)據(jù)變化

2020-03-03 17:47:07

UDP TCP面試題

2021-10-25 16:01:01

Linux設(shè)備樹(shù)字符串

2021-03-28 18:40:02

LinuxWindowsJava

2021-08-13 05:50:01

ContainerdDockerKubernetes

2019-09-23 10:51:14

JavaJava虛擬機(jī)Linux

2018-05-31 20:49:50

Spark堆內(nèi)內(nèi)存優(yōu)化機(jī)制

2021-04-30 19:53:53

HugePages大內(nèi)存頁(yè)物理

2022-08-17 18:25:37

Java分布式搜索引擎

2025-08-08 01:11:00

React組件通信

2021-08-31 07:02:20

Diff算法DOM

2021-09-08 17:42:45

JVM內(nèi)存模型

2018-08-09 11:06:39

Apache Spar內(nèi)存模型

2017-12-01 12:36:54

LDA模型機(jī)器

2018-12-19 10:05:15

LVSNginxHAProxy

2020-09-27 11:55:20

FTPFTPSSFTP

2020-10-29 08:55:04

微服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲视频高清| 国产美女视频免费| 欧美,日韩,国产在线| 久久精品视频1| 激情视频亚洲| 欧美激情综合五月色丁香小说| 欧美大片在线看| 蜜桃麻豆91| 日本高清一二三区| 免费污视频在线一区| 不卡一卡二卡三乱码免费网站| 久久精品成人欧美大片古装| 91av俱乐部| 青青草视频在线免费观看| 国产午夜精品一区在线观看| 国产精品视频麻豆| 日韩av手机在线观看| 人妻换人妻a片爽麻豆| 国产午夜精品久久久久免费视| 亚洲一区日本| 亚洲精品国产精品自产a区红杏吧| 精品视频在线观看一区二区| 国产视频一二三四区| 欧美国产小视频| 欧美性猛交xxxx黑人猛交| 国产一级二级三级精品| 国产一级性生活| 粉嫩精品导航导航| 午夜欧美在线一二页| 国产精品永久入口久久久| 黄色一级视频免费观看| 视频一区日韩精品| 洋洋av久久久久久久一区| 91久色国产| 国产一级免费观看| 久久精品国产68国产精品亚洲| 精品福利视频一区二区三区| 青青在线视频免费观看| yes4444视频在线观看| 麻豆视频一区二区| 久久国产精品久久精品| 亚洲精品一二三四| 久草在线视频网站| www.欧美日韩国产在线| 欧美在线亚洲一区| av网站免费在线看| 97成人资源| 中文字幕乱码日本亚洲一区二区 | 国产福利小视频在线| 麻豆九一精品爱看视频在线观看免费| 国产偷亚洲偷欧美偷精品| www.com毛片| 国家队第一季免费高清在线观看| 久热精品在线| 久久久91精品国产| 少妇视频一区二区| www.豆豆成人网.com| 日韩欧美国产高清91| 日b视频免费观看| 青青草免费观看免费视频在线| 处破女av一区二区| 日韩av电影国产| 国产精品美女久久久久av爽| 欧美精品久久久久久| 欧美一区二区视频在线观看2020| 18禁裸男晨勃露j毛免费观看| 欧美偷拍视频| 日韩电影免费一区| 欧美成人精品一区二区| 国产美女久久久久久| 91精品国产91久久久久久密臀 | 欧美亚洲成人网| 久操视频免费看| 精品久久亚洲| 日韩午夜激情视频| 国语对白做受xxxxx在线中国| 尤物在线视频| aaa欧美日韩| 久久99影院| 国产精品羞羞答答在线| 国产视频一区三区| 久久在线观看视频| 中文字幕一二三四区| 香蕉成人app| 亚洲国产精品999| 在线视频一二区| 国产日韩另类视频一区| 一区二区不卡在线播放| 国产精品入口芒果| 成年人网站在线| 日本一区二区三区久久久久久久久不| 日韩三级电影免费观看| 五月激情六月婷婷| 国产精品亚洲专一区二区三区| 日本欧美一二三区| 亚洲中文字幕在线一区| 老司机亚洲精品| 国产免费久久av| 日本精品入口免费视频| 99伊人成综合| 欧美激情在线观看视频| 久久久久久视频| 欧美私人啪啪vps| 中文字幕视频在线免费欧美日韩综合在线看| www.男人天堂| 国语一区二区三区| 亚洲天堂网在线观看| 亚洲天堂成人av| 91蜜桃臀久久一区二区| 亚洲欧美中文在线视频| 五级黄高潮片90分钟视频| 日韩大片在线观看| 一区二区欧美在线| 亚洲精品91在线| 国产精选一区| 伊人久久免费视频| 久久成人国产精品入口| 欧美a级一区二区| 国产精品欧美亚洲777777| 日韩精选在线观看| 国产黄色精品网站| 高清视频一区二区三区| 成人爽a毛片一区二区| 国产成人午夜精品5599| 日韩欧美一区二区三区四区| 97人人爽人人澡人人精品| 亚洲一区二区四区蜜桃| 国产日本在线播放| 亚洲我射av| 日韩视频123| 少妇的滋味中文字幕bd| 久久人人99| 国产99在线|中文| 性一交一乱一伧老太| 粉嫩av一区二区三区粉嫩| 99视频国产精品免费观看| 午夜精品久久久久久久96蜜桃| 丁香婷婷综合激情五月色| 亚洲图色在线| 香蕉成人app免费看片| 亚洲成年人影院| 哪个网站能看毛片| 久久久久毛片| 日韩精品一区二区三区中文精品| 亚洲啪av永久无码精品放毛片| 图片区亚洲欧美小说区| 九九热精品视频| 日韩黄色三级视频| 日韩av成人高清| 91黄在线观看| 成人免费看片| 91精品久久久久久蜜臀| www.17c.com喷水少妇| 国内精品久久久久久久97牛牛| 91久久国产精品| 天天射天天操天天干| 国产欧美日韩在线| 天天爽天天爽夜夜爽| 日韩成人视屏| 欧美第一黄色网| 亚洲成人一二三区| 亚洲国产成人porn| aa片在线观看视频在线播放| 国产欧美二区| 免费看成人午夜电影| 丝袜美腿一区| 欧美成人video| 人妻精品久久久久中文| 日韩综合小视频| 亚洲日本精品一区| 国产成人免费视频网站视频社区 | 欧美日韩国产欧美日美国产精品| 一级黄色免费毛片| 视频精品在线观看| 欧美激情videoshd| 天堂av在线免费| 欧美性猛交xxxxx水多| 欧美老女人性生活视频| 亚洲日本欧美| 91中文字幕在线| 精品久久av| 欧美日韩一区二区在线视频| 日本五十肥熟交尾| 亚洲一区欧美二区| 亚洲欧洲精品在线| 日韩成人av电影| 中文字幕精品网| 国产高清视频免费观看| 国产精品色噜噜| 中文字幕一区二区在线观看视频| 精品96久久久久久中文字幕无| 国产精品久久久久高潮| 青青视频在线观| 欧美性大战久久久久久久蜜臀 | 久久久国产综合精品女国产盗摄| 91免费国产精品| 美女久久久久| 91网站在线看| 波多视频一区| 欧美精品一区在线播放| 欧美日韩在线中文字幕| 欧美一级二级三级蜜桃| 无码人妻黑人中文字幕| 9i在线看片成人免费| 天天干天天干天天干天天干天天干| 欧美成人一区在线观看| 久久久久久久久久久免费精品| 狠狠色伊人亚洲综合网站l| 欧美不卡一区二区三区| 国产乱码77777777| 亚洲成a人v欧美综合天堂下载 | 高潮一区二区三区乱码| 欧美亚洲日本一区| 国产午夜久久久| 国产精品福利影院| 精品亚洲一区二区三区四区| 日韩欧美网站| 国产午夜精品在线| 国色天香久久精品国产一区| 国产91亚洲精品| 欧美巨大xxxx做受沙滩| 中文字幕在线成人| 国产主播福利在线| 亚洲韩国青草视频| 亚洲国产精品欧美久久| 欧美美女一区二区在线观看| 日本中文在线视频| 久久婷婷色综合| 中文字幕第80页| 99日韩精品| 欧美黄网在线观看| 91精品一区国产高清在线gif| 欧美一区二区在线| 成人国产一区二区三区精品麻豆| 日日噜噜噜夜夜爽亚洲精品| 99国产揄拍国产精品| 欧美视频日韩视频在线观看| 影音先锋在线国产| 欧美日韩国产中文精品字幕自在自线| 熟女少妇一区二区三区| 成人免费不卡视频| 91亚洲精品视频| 林心如三级全黄裸体| 久久久久久久久久久妇女| 国产啪精品视频| 免费a在线观看| 精品福利av导航| 国产高清不卡视频| 日韩三区在线观看| 国产国语亲子伦亲子| 日韩一区二区三区电影在线观看| 一区二区日韩视频| 一区二区三区蜜桃| 国产成人久久久久| 99这里只有久久精品视频| 人妻巨大乳一二三区| 国产一区在线观看麻豆| 欧美午夜性视频| 国产一区清纯| 欧美黑人在线观看| 亚洲黄色影院| 18岁网站在线观看| 欧美丰满日韩| 黑人巨大国产9丨视频| 欧美午夜寂寞| 久久精品国产一区二区三区日韩 | 免费影院在线观看一区| 国产精品片aa在线观看| 天天综合狠狠精品| aaa国产精品视频| 99热国产免费| 日本久久成人网| 欧美亚洲一级二级| 亚洲精品一区二区三区中文字幕| 欧美一级淫片videoshd| av资源亚洲| 99精品视频免费观看视频| 久久视频这里有精品| 久久亚洲风情| 午夜视频在线网站| 夜夜嗨一区二区三区| 久久网站免费视频| 麻豆91在线观看| 色婷婷狠狠18禁久久| 日韩电影免费一区| 中文字幕一区二区在线观看视频 | wwww亚洲| 精品久久久av| 日韩三级免费| 日本高清不卡的在线| 欧美成人免费全部网站| 成人女人免费毛片| 欧美伦理影院| 人人妻人人澡人人爽欧美一区双| 性欧美xxxx大乳国产app| 爱豆国产剧免费观看大全剧苏畅| 视频一区视频二区中文| 超碰在线免费av| 91蝌蚪porny成人天涯| 成人做爰www看视频软件| 国产丝袜美腿一区二区三区| 99久久久久久久久久| 国产精品久久久久久福利一牛影视 | 久久久91麻豆精品国产一区| 蜜桃麻豆www久久国产精品| 91精品高清| av视屏在线播放| 成人黄色在线网站| 性生交大片免费全黄| 久久久久久久久久久久久久久99 | 欧美在线亚洲综合一区| 在线观看成人av电影| 日韩黄色片网站| 色88888久久久久久影院按摩| 久久丫精品久久丫| 一级特黄大欧美久久久| 综合激情网五月| 日韩精品一区二区三区视频在线观看| 午夜国产在线观看| 大量国产精品视频| 欧美日韩大片| 成人h猎奇视频网站| 免费日韩成人| 国产在线欧美日韩| 欧美国产免费| 不卡的av中文字幕| 久久久国产精品麻豆| 日韩欧美大片在线观看| 亚洲一区二区精品久久av| 青娱乐在线免费视频| 亚洲二区在线播放视频| 欧美激情黑人| 色与欲影视天天看综合网| 免费亚洲电影| 91久久国产自产拍夜夜嗨| 天天射综合网视频| 欧洲熟妇精品视频| 久久久777精品电影网影网 | 邻居大乳一区二区三区| 欧美国产中文字幕| 国产一区二区视频在线看| 亚洲国产精品一区二区第四页av | 日韩美女视频一区| 糖心vlog免费在线观看| 色天使色偷偷av一区二区| 少妇喷水在线观看| 97人人模人人爽人人喊中文字| 国产伦精品一区二区三区视频金莲| 国产欧美精品xxxx另类| 国产亚洲精品美女久久久久久久久久| 草草久久久无码国产专区| 97se亚洲国产综合在线| 免费看裸体网站| 欧美日韩在线免费| 美州a亚洲一视本频v色道| 69av在线视频| 成人mm视频在线观看| 欧美日韩一区在线播放| 日韩午夜免费视频| 日韩网站在线播放| 日韩欧美亚洲范冰冰与中字| 青青草视频在线免费观看| 欧美亚洲国产成人精品| 国产欧美日韩免费观看| 国产一级不卡毛片| 成人国产视频在线观看| 亚洲免费黄色网址| 亚洲欧美国产精品va在线观看| 成人在线视频亚洲| 成人激情免费在线| 99免费精品| 极品白嫩少妇无套内谢| 中文字幕日韩精品一区 | 二区三区在线观看| 成人免费视频视频在| 亚洲青色在线| av永久免费观看| 91精品国产aⅴ一区二区| 爱啪视频在线观看视频免费| 国产成人免费av电影| 国产精品第一国产精品| 中文字幕久久一区| 国产电影一区二区三区| 国产乱国产乱老熟| 日韩一级黄色av| 中文成人在线| 阿v天堂2018| 国产色91在线| www黄色在线观看| 55夜色66夜色国产精品视频| 成人免费av| 男人添女人荫蒂国产| 狠狠躁夜夜躁人人爽天天天天97 | 成人午夜视频福利| 91丝袜一区二区三区| 精品国产污污免费网站入口| 春色校园综合激情亚洲| 久久久久久国产精品mv| 日韩电影在线一区二区| 少妇aaaaa|