內存模型學習-- Container Executor task之間的關系


(分割線前的都是廢話)

java8內存模型:

http://www.cnblogs.com/paddix/p/5309550.html

http://www.cnblogs.com/dingyingsi/p/3760447.html

帖子里提到

5、方法區:

方法區也是所有線程共享。主要用於存儲類的信息、常量池、方法數據、方法代碼等。

方法區邏輯上屬於堆的一部分,但是為了與堆進行區分,通常又叫“非堆”。 

1.7和1.8后這個方法區 沒有了,被原空間取代了

不過元空間與永久代之間最大的區別在於:

元空間並不在虛擬機中,而是使用本地內存。因此,默認情況下,元空間的大小僅受本地內存限制,但可以通過以下參數來指定元空間的大小:

--------------分割線---------------------------------------------------------------------------------

那么這些jvm在yarn 和spark的內存模型上是怎么工作的?

其實我是想知道:

spark on yarn下
一個yarn的Container 可以包含幾個spark Executor?
還是一個Executor 下可以有多個Container ?

是一個Container 起了一個jvm,在這個jvm下執行多個task?

一篇帖子spark架構中提到

傳送門: http://www.cnblogs.com/gaoxing/p/5041806.html

任何Spark的進程都是一個JVM進程

 

 

把其中一部分摘出來:

1.當運行在yarn集群上時,Yarn的ResourceMananger用來管理集群資源,集群上每個節點上的NodeManager用來管控所在節點的資源,從yarn的角度來看,每個節點看做可分配的資源池,當向ResourceManager請求資源時,它返回一些NodeManager信息,這些NodeManager將會提供execution container給你每個execution container就是滿足請求的堆大小的JVM進程,JVM進程的位置是由ResourceMananger管理的,不能自己控制,如果一個節點有64GB的內存被yarn管理(通過yarn.nodemanager.resource.memory-mb配置),當請求10個4G內存的executors時,這些executors可能運行在同一個節點上。

2.當在集群上執行應用時,job會被切分成stages,每個stage切分成task,每個task單獨調度,可以把executor的jvm進程看做task執行池,每個executor有 spark.executor.cores / spark.task.cpus execution 個執行槽

3.task基本上就是spark的一個工作單元,作為exector的jvm進程中的一個線程執行,這也是為什么spark的job啟動時間快的原因,在jvm中啟動一個線程比啟動一個單獨的jvm進程塊(在hadoop中執行mapreduce應用會啟動多個jvm進程) 

 

總結:所以就是一個container對應一個JVM進程(也就是一個executor

具體的每個節點下container和executor內存分配看下面的帖子

http://www.tuicool.com/articles/YVFVRf3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM