首頁 資料庫 mysql教程 5步避免Java堆空间错误

5步避免Java堆空间错误

Jun 07, 2016 pm 04:41 PM
java 分享 空間 避免 錯誤

分享到: 本文由 ImportNew - 光光头去打酱油 翻译自 mapr。欢迎加入翻译小组。转载请参见文章末尾的要求。 牢记以下五个步骤可以为你减少很多头痛的问题并且避免Java堆空间错误。 通过计算预期的内存消耗。 检查JVM是否有足够的可用空间。 检查JVM的设置是

分享到:



本文由 ImportNew - 光光头去打酱油 翻译自 mapr。欢迎加入翻译小组。转载请参见文章末尾的要求。

牢记以下五个步骤可以为你减少很多头痛的问题并且避免Java堆空间错误。

  1. 通过计算预期的内存消耗。
  2. 检查JVM是否有足够的可用空间。
  3. 检查JVM的设置是否正确。
  4. 限制节点使用交换空间和内存分页。
  5. 设置实例slot数量小于JobTracker web GUI计算的数值。

译者注:slot ?:slot不是CPU的Core,也不是memory chip,它是一个逻辑概念,一个节点的slot的数量用来表示某个节点的资源的容量或者说是能力的大小,因而slot是 Hadoop的资源单位。详见这里

在这篇博文里,我将详细讲解每个步骤,帮助大家更好地理解并正确管理实例(task attempt)内存。

译者注:实例(task attempt) :这个词在官方文档中找到了解释: “Each task attempt is one particular instance of a Map or Reduce Task identified by its TaskID”。

理解怎样管理实例内存是很重要的,这样可以避免Java堆空间错误。当运行 map/reduce 作业(Job)时,你可能会看到实例出现这样的错误:

13/09/20 08:50:56 INFO mapred.JobClient: Task Id : attempt_201309200652_0003_m_000000_0, Status : FAILED on node node1
Error: Java heap space
登入後複製

当试图申请一个超过Java虚拟机(JVM)设置的最大内存限制时就会发生这个错误。

避免Java堆空间错误的第一步是了解你的map和reduce任务的内存需求,以便于你启动一个JVM时设置了适当内存限制。

例如,hadoop-0.20.2-dev-examples.jar中的wordcount 功能。 不管处理什么数据,map 任务都不需要很多内存。唯一需要很多内存的就是在加载运行所需的函数库的时候。当使用默认附带MapR包的wordcount功能时,512MB的内存对于实例JVM是绰绰有余了。如果你打算运行我们提供的Hadoop示例,可以尝试将map实例JVM的内存限制设为512MB。

如果你知道自己的map实例需要多少内存(在本例中是512MB), 那么下一步启动设置好JVM内存。该实例在JVM中的内存是由TaskTracker为Map/Reduce作业处理数据而设定的。 TaskTracker设定的限制可能有两个来源:要么是用户提交作业时指定了内存大小作为该作业配置对象的一部分,或者是TaskTracker产生了 默认内存大小的JVM。

mapred.map.child.java.opts属性被用来为TaskTracker?启动JVM和执行map任务的参数(在reduce任务中也有个类似的属性)。如果mapred.map.child.java.opts属性被设置成“-Xmx512m”,那么map实例JVMs会有512MB的内存限制。相反的,如果-Xmx没有通过配置属性去指定一个数值的话,那么 每个TaskTracker将会为启动JVM计算一个默认的内存限制。该限制是基于TaskTracker为map/reduce task slot分配的数量所决定的,并且TaskTracker分配给Map/Reduce总内存不能超过系统限制。

TaskTracker为map/reduce实例分配的slot数量在TaskTracker启动时就设定好了。通过每个节点上mapred-site.xml文件中两个参数进行控制的:

mapred.tasktracker.map.tasks.maximum
mapred.tasktracker.reduce.tasks.maximum
登入後複製

设置这些默认值的规则是基于节点上CPU核心的数量。不过你可以下面两个方法来重载参数:

  1. 修改mapred-site.xml文件设定一个固定的slots数值。
  2. 使用自定义规则。

在系统中,TaskTracker? map/reduce实例内存限制是在TaskTracker进程启动时设定的。有两个地方可以设置内存限制。首先在Hadoop conf目录下的hadoop-env.sh脚本中可以显式的设置,你可以添加下面这行来指定内存限制:

export HADOOP_HEAPSIZE=2000
登入後複製

这行命令限制了节点上的所有实例JVM总共可以使用2000MB的内存。如果没有在hadoop-env.sh文件中指定 HADOOP_HEAPSIZE这个参数,那么当MapR warden service启动TaskTracker时会对内存进行限制。?warden service会基于节点上物理内存的数量减去服务运行中已经占用的内存数量得出限制的大小。如果你去看看warden.conf你会看到像这样的一些属性:

service.command.mfs.heapsize.percent=20
service.command.mfs.heapsize.min=512
登入後複製

这个例子表示,warden占用分配给MFS服务节点的20%物理内存或最低512MB(512MB

例如,假设你在一个节点上安装运行ZooKeeper、CLDB、MFS、JobTracker、TaskTracker、NFS、the GUI、HBase Master 和HBase RegionServer。这么多的服务运行在一个节点上,而且每个服务都需要内存,所以warden会将内存按照百分比分配给每个服务,剩下的将会分配 给节点上的map/reduce 实例。如果你分配给这些服务总共60%还有5%为系统预留,那么就还有35%分给节点上的map/reduce实例。如果这个节点有10G的内存,将会有3.5G分给 map/reduce 任务。如果你有 6个map slot和4个reduce slot。如果内存是平均分配的,最终每个JVM的内存限制为350MB。如果你需要512MB内存来运行你的map任务,那么默认设置的情况下是不会运行的,你会遇到Java堆空间错误。

当管理实例内存的时候会意识到还有其它问题。不要强制节点去使用大量的交换空间(swap space)或者触发频繁内存分页读写磁盘。如果你通过显式的在mapred.map.child.java.opts设置“-Xmx500m”来改变提交的作业,将会重写安全的内存限制。但实际上你并没有额外的物理内存。虽然 map/reduce 实例仍能启动,但是会强制使用大量的交换空间,而且无法依赖内核的OOM killer或者其他的方法来防止这种情况发生。如果真的发生这种情况,无法指望节点启动大量分页来迅速恢复。如果只是增加了实例的JVM内存,同时继续在节点上启动相同数量的实例。你会申请更多的内存,需要注意不要超额申请。如果超额申请太多的话,会导致大量的分页,这样节点可能会被挂 起再也无法恢复。除非重启电源。

所以如果你给每个实例JVM增加内存的话,需要通过TaskTrackers来减少分配给map/reduce task slot数量。

这是一个很复杂的情况,因为如果你在集群上并发执行不同的作业,可能来自一个作业(JobA)的实例需要大量的内存,来自另外一个作业(JobB)的实例只需要很少的内存。因此,如果你减少map/reduce slot的数量,会发现会有足够的内存来运行来自JobB任务(task)。但是却没有足够的内存提供给JobA。所以关键就是找到一个平衡点,一个可以允许进行一些超额申请却不会导致节点被挂起的平衡点。

为了协助这个任务,TaskTracker?将会着眼于当前所有在运行的 map/reduce tasks 所使用的内存数量。不是只看这些任务的最大内存限制,而是所有运行中的实例实际利用的内存总数。当消耗的内存达到一定级别,TaskTracker 会杀死一些运行的实例来释放内存,以便其他的实例能正常执行完并且不会造成节点上的分页过多。

举个例子,如果你想在一个小型的集群或者单一节点上运行wordcount示例,碰到“Java堆空间”错误,最简单最快的解决方法就是通过编辑/opt/mapr/hadoop/hadoop-0.20.2/conf/mapred-site.xml中的设置来减少?map/reduce 实例 slot的数量:

mapred.tasktracker.map.tasks.maximum 
mapred.tasktracker.reduce.tasks.maximum
登入後複製

将实例的slot的数量设置为小于当前计算结果是非常重要的。当前计算的数量可以通过进入JobTracker web界面来确定。例如,如果你有一个TaskTracker?,显示它有6个mpa slot和4个 reduce slot,那么你应该设置 3个map slot、2个 reduce slot。然后通过下面这行命令重启节点上的TaskTracker进程:

maprcli node services -nodes -tasktracker restart
登入後複製

减少slot的数量重新启动后,重新提交wordcount作业。如果没有额外内存申请,每个实例、JVM都会分配到更多的内存。这是一个安全的解决方法,节点不会产生大量分页。这是一种简单的解决方案,不需要大量计算内存。这也是快速的方法,只需要编辑下配置文件并重启下服务就好了。

为了避免Java堆空间错误,记住下面这些步骤:

  1. 估算你的实例需要消耗多少内存。
  2. 确保TaskTracker?启动你的实例时,JVM内存的限制要大于等于你预计的内存需求。
  3. 记住,启动这些JVM是有默认设置的,除非你显式的重写过这些设置。在CPU核心数和物理内存已经平衡并运行服务的节点上,默认设置并不适用。
  4. 不要迫使节点大量的使用交换空间或者频繁的将内存分页读写到磁盘上。
  5. 将实例slot数量设置为小于JobTracker web GUI计算值。
5步避免Java堆空间错误
原文链接: mapr 翻译: ImportNew.com - 光光头去打酱油
译文链接: http://www.importnew.com/14049.html
[ 转载请保留原文出处、译者和译文链接。]



本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP與Python:核心功能 PHP與Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

See all articles