5步避免Java堆空间错误
分享到: 本文由 ImportNew - 光光头去打酱油 翻译自 mapr。欢迎加入翻译小组。转载请参见文章末尾的要求。 牢记以下五个步骤可以为你减少很多头痛的问题并且避免Java堆空间错误。 通过计算预期的内存消耗。 检查JVM是否有足够的可用空间。 检查JVM的设置是
分享到:
本文由 ImportNew - 光光头去打酱油 翻译自 mapr。欢迎加入翻译小组。转载请参见文章末尾的要求。
牢记以下五个步骤可以为你减少很多头痛的问题并且避免Java堆空间错误。
- 通过计算预期的内存消耗。
- 检查JVM是否有足够的可用空间。
- 检查JVM的设置是否正确。
- 限制节点使用交换空间和内存分页。
- 设置实例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核心的数量。不过你可以下面两个方法来重载参数:
- 修改mapred-site.xml文件设定一个固定的slots数值。
- 使用自定义规则。
在系统中,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堆空间错误,记住下面这些步骤:
- 估算你的实例需要消耗多少内存。
- 确保TaskTracker?启动你的实例时,JVM内存的限制要大于等于你预计的内存需求。
- 记住,启动这些JVM是有默认设置的,除非你显式的重写过这些设置。在CPU核心数和物理内存已经平衡并运行服务的节点上,默认设置并不适用。
- 不要迫使节点大量的使用交换空间或者频繁的将内存分页读写到磁盘上。
- 将实例slot数量设置为小于JobTracker web GUI计算值。

原文链接: mapr 翻译: ImportNew.com - 光光头去打酱油
译文链接: http://www.importnew.com/14049.html
[ 转载请保留原文出处、译者和译文链接。]

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.
