2013-06-22 47 views
0

我正在做一個學校的工作來分析hadoop中堆的使用。它涉及運行mapreduce程序的兩個版本來計算論壇評論長度的中位數:第一個是「記憶無意識」,reduce程序在內存中處理每個評論長度的列表;第二個是「內存意識」,reducer使用非常有效的內存數據結構來處理數據。如何看待hadoop的堆使用?

目的是使用這兩個程序來處理不同大小的數據,看內存的使用情況如何更快地上升中的第一個(直到它最終運行內存不足)。

我的問題是:我如何獲得hadoop或reduce任務的堆使用情況?

我thouth計數器「總承諾堆的使用情況(字節)」將cointain這個數據,但我已經找到了程序返回幾乎相同的值的兩個版本。

關於程序的正確性,在「內存無意識」一個內存用完了較大的輸入和失敗,而另一個不和是能夠完成。

在此先感謝

回答

1

我不知道虛擬內存是什麼意思內存意識的數據結構使用的是(如果你給它一個然後可能幫助),但大多數在內存中的數據結構的利用是數據結構大小在一定程度上增加,基於策略的額外數據元素將被轉儲到虛擬內存中。因此,我們不會導致內存不足錯誤。但如果記憶無意識不這樣做。在這兩種情況下,數據結構的大小將保持不變,這就是爲什麼您獲得相同的大小。要獲得Reducer的實際內存使用情況,您可以通過以下方式獲取它:

添加了新功能的Java 1.5是Instrumentation接口,通過它您可以獲取對象的內存使用情況(getObjectSize)。關於它的好文章:LINK

/* Returns the amount of free memory in the Java Virtual Machine. Calling the gc method may result in increasing the value returned by freeMemory.*/ 
long freeMemory = Runtime.getRuntime().freeMemory() 


/* Returns the maximum amount of memory that the Java virtual machine will attempt to use. If there is no inherent limit then the value Long.MAX_VALUE will be returned. */ 
long maximumMemory = Runtime.getRuntime().maxMemory(); 


/* Returns the total amount of memory in the Java virtual machine. The value returned by this method may vary over time, depending on the host environment. 
Note that the amount of memory required to hold an object of any given type may be implementation-dependent. */ 
long totalMemory = Runtime.getRuntime().totalMemory() 
+0

非常感謝。它工作得很好 – user2510940