hadoop—如何在java内存密集型应用程序中避免outofmemory异常?

holgip5t  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(348)

我们开发了一个java应用程序,它的主要目标是读取一个文件(输入文件),处理它并将其转换成一组输出文件。
(为了避免不相关的细节,我对我们的解决方案进行了一般性描述)。
当输入文件为4GB,内存设置为-xms4096m-xmx16384m时,这个程序工作得非常好
现在我们需要用大小为130gb的输入文件运行我们的应用程序。
我们使用了一个内存为250gbram、内存设置为-xms40g-xmx200g(还尝试了其他一些变体)的linux机器来运行应用程序,并遇到了outofmemory异常。
在我们项目的这个阶段,很难考虑重新设计代码以适应hadoop(或其他大型数据处理框架),而且我们目前可以负担的硬件配置是250gb的ram。
您能为我们提供一些避免内存不足异常的方法吗?开发这类应用程序的一般做法是什么。?
提前谢谢

ndh0cuux

ndh0cuux1#

只要尽量少用内存就行了,比如说,不要把整个文件都放在内存里,把它转储到磁盘上。
比如说,hadoophdfs可以为您做到这一点,只需通过一个好的探查器或堆转储分析器检查您是否有任何泄漏。
一个定制的解决方案可以是仍然使用普通文件,但是以类似页面的方式组织访问。e、 java有很好的mappedbytebuffer,它可以让您将文件的某个部分加载到内存中,以便更快地访问(在java7之前,它有一些问题,导致无法预测的取消Map,但据我所知,它已经被修复)。

bsxbgnwa

bsxbgnwa2#

最明显的尝试是不要将整个文件保存在内存中(如果可能的话)。因此,您可以分块处理它,并且随时只在内存中保留一个或几个块(而不是整个文件)。

相关问题