11.14 Spark——診斷內存消耗

Spark——診斷內存消耗

內存都花費在哪裡?

  1. (1)每個JAVA對象,。都有一個對象頭,會佔用16個字節,主要包括一些對象的元信息,。比如 指向它的類的指針;。如果一個對象本身很小,比如 就包括一個int類型的field,那麼它的對象頭實際上比對象自己還要大 。
  2. (2)java的String對象,。會比它內部的原始數據,多出40個字節,,因為它內部使用char數組來保存內部的字符序列的,並且還得保存諸如數組長度之類的信息。 而且,因為String使用的是UTF-8編碼,所以每個字符會佔用2個字節,。比如:包含10個字符的String,會佔用60個字節。
  3. (3)java的集合類型,比如HashMap和LinkedList,內部使用的是鏈表數據結構,所以對鏈表中的每一個數據,都使用了Entry 對象來包裝。 Entry對象不光有對象頭,還有指向下一個Entry的指針,通常佔用8個字節。
  4. (4)元素類型為原始數據類型(如 int)的集合,內部通常會使用原始數據類型的包裝類型。比如integer 來存儲元素 。

如何判斷你的程序消耗了多少內存?

  1. 1、首先,自己設置RDD的並行度,有兩種方式:(1)在parallelize(),textFile()等方法中,傳入第二個參數,設置RDD的task/partition的數量;(2)第二種方式,用SparkConf.set()方法,設置一個參數,spark.default.parallelism , 可以統一設置這個application所有RDD的partition數量。(簡單說,就是指定partition的數量)
  2. 2、其次,在程序中,將RDD cache 到內存中,調用RDD.cache()方法即可
  3. 3、最後,觀察Driver的 log,你會發現類似於:"INFO BlockManagerMasterActor......(size:171.5KB,free:332 MB)"的日誌信息,這就顯示了每個partition 佔用了多少內存。
  4. 4、將這個內存信息乘以partition 的數量,即可得出RDD的內存佔用量。

設置日誌級別:

 Logger.getLogger("org.apache.spark").setLevel(Level.INFO);
Spark——診斷內存消耗


分享到:


相關文章: