當 時spark.memory.offheap.enabled=true,Spark 可以利用堆外記憶體進行混洗和快取 ( StorageLevel.OFF_HEAP)。可以使用堆外記憶體來存盤廣播變數嗎?如何?
uj5u.com熱心網友回復:
簡而言之,不,您不能StorageLevel.OFF_HEAP用于廣播變數。
要了解原因,讓我們查看該方法的源代碼SparkContext.broadcast(...)。
/**
* Broadcast a read-only variable to the cluster, returning a
* [[org.apache.spark.broadcast.Broadcast]] object for reading it in distributed functions ...
*/
def broadcast[T: ClassTag](value: T): Broadcast[T] = {
:
val bc = env.broadcastManager.newBroadcast[T](value, isLocal)
:
bc
}
上面的代碼中,broadcastManager.newBroadcast(...)就是創建Broadcast物件的,也就是這個方法的回傳型別。
現在,讓我們深入挖掘并檢查newBroadcast()。
def newBroadcast(value_ : T, isLocal: Boolean): Broadcast[T] = {
broadcastFactory.newBroadcast[T](value_, isLocal, nextBroadcastId.getAndIncrement())
}
在上面的代碼中,broadcastManager有一個組件被呼叫broadcastFactory,并使用抽象工廠設計模式將廣播變數的創建委托給其相關工廠。
另請注意,BroadcastManager跟蹤id每個broadcast變數的唯一值,每個新廣播變數都會增加該變數。
目前,BroadcastFactoryspark中可以初始化的只有一種,就是TorrentBroadcastFactory. 這被認為是在初始化代碼的BroadcastManager。
// Called by SparkContext or Executor before using Broadcast
private def initialize() {
:
broadcastFactory = new TorrentBroadcastFactory
:
}
引述的源代碼的TorrentBroadcastFactory
使用類似 BitTorrent 的協議將廣播資料分布式傳輸到執行器的廣播實作
這個特定的工廠使用TorrentBroadcast。這個類的描述非常有用。
驅動程式將序列化的物件分成小塊并將這些塊存盤在驅動程式的 BlockManager 中。
在每個執行器上,執行器首先嘗試從其 BlockManager 中獲取物件。如果它不存在,則使用遠程提取從驅動程式和/或其他可用的執行程式中提取小塊。一旦它獲得了塊,它就會將這些塊放在自己的 BlockManager 中,以供其他執行程式從中獲取。這可以防止驅動程式成為發送廣播資料的多個副本(每個執行程式一個)的瓶頸。
讀取類的writeBlock函式TorrentBroadcast,我們可以看到StorageLevel.MEMORY_AND_DISK_SER這個廣播的硬編碼選項。
/**
* Divide the object into multiple blocks and put those blocks in the block manager.
*
* @param value the object to divide
* @return number of blocks this broadcast variable is divided into
*/
private def writeBlocks(value: T): Int = {
import StorageLevel._
:
:
if (!blockManager.putBytes(pieceId, bytes, MEMORY_AND_DISK_SER, tellMaster = true)) {
throw new SparkException(s"Failed to store $pieceId of $broadcastId " s"in local BlockManager")
}
:
:
因此,由于此代碼使用 的硬編碼值StorageLevel.MEMORY_AND_DISK_SER,我們不能StorageLevel.OFF_HEAP用于廣播變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/319104.html
標籤:阿帕奇火花
上一篇:如何在C#中將服務主體身份驗證與Azure機器學習管道終結點一起使用?
下一篇:將天數添加到時間戳并獲取時間戳
