如何看待Hadoop的堆使用情况?



我正在做一项学校作业,分析hadoop中堆的使用。它包括运行两个版本的mapreduce程序来计算论坛评论长度的中位数:第一个版本是"记忆无意识",reduce软件在内存中处理一个包含每条评论长度的列表;第二种是"内存意识",reducer使用非常节省内存的数据结构来处理数据。

目的是使用这两个程序来处理不同大小的数据,并观察第一个程序中内存使用率的增长速度(直到最终耗尽内存)。

我的问题是:如何获得hadoop或reduce任务的堆使用率?

我认为计数器"Total committed heap usage(bytes)"会包含这些数据,但我发现两个版本的程序返回的值几乎相同。

关于程序的正确性,"内存无意识"程序在大量输入的情况下耗尽内存并失败,而另一个程序则没有并能够完成。

提前感谢

我不知道你使用的是什么有内存意识的数据结构(如果你给出哪一个可能会有所帮助),但大多数内存中的数据结构都使用虚拟内存,这意味着数据结构的大小在一定程度上会根据策略增加,额外的数据元素将被转储到虚拟内存中。因此,我们不会导致内存不足错误。但万一记忆无意识不能做到这一点。在这两种情况下,数据结构的大小将保持不变,这就是为什么您得到相同的大小。要通过Reducer获得实际内存使用情况,您可以通过以下方式获得:

添加了新特性的java1.5是Instrumentation接口,通过它可以获得对象内存使用情况(getObjectSize)。关于它的好文章:链接

/* 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()

相关内容

  • 没有找到相关文章

最新更新