(分割線前的都是廢話)
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內存分配看下面的帖子