Spark如何判斷內存消耗

內存都消耗在了哪個地方

1、在創建的每個java對象中,都會有一個對象頭,會佔用16個字節,主要是包括了一些的一些對象的元信息,比如指向它的類的指針。如果一個對象本身很小,比如就包括了一個int類型的field,那麼它的對象頭實際上比對象自己還要大。

2、Java的String對象,會比它內部的原始數據,要多出40個字節。因爲它內部使用char數組來保存內部的字符序列的,並且還得保存諸如數組長度之類的信息。而且因爲String使用的是UTF-16編碼,所以每個字符會佔用2個字節。比如,包含10個字符的String,會佔用60個字節。

3、Java中的集合類型,比如HashMap和LinkedList,內部使用的是鏈表數據結構,所以對鏈表中的每一個數據,都使用了Entry對象來包裝。Entry對象不光有對象頭,還有指向下一個Entry的指針,通常佔用8個字節。

4、元素類型爲原始數據類型(比如int)的集合,內部通常會使用原始數據類型的包裝類型,比如Integer,來存儲元素。

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

1、首先,自己設置RDD的並行度,有兩種方式:要不然,在parallelize()、textFile()等方法中,傳入第二個參數,設置RDD的task / partition的數量;要不然,用SparkConf.set()方法,設置一個參數,spark.default.parallelism,可以統一設置這個application所有RDD的partition數量。

2、其次,在程序中將RDD cache到內存中,調用RDD.cache()方法即可。

3、最後,觀察Driver的log,你會發現類似於:“INFO BlockManagerMasterActor: Added rdd_0_1 in memory on mbk.local:50311 (size: 717.5 KB, free: 332.3 MB)”的日誌信息。這就顯示了每個partition佔用了多少內存,將這個內存信息乘以partition數量,即可得出RDD的內存佔用量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章