Hive内存溢出常见问题

1 MR作业运行过程中内存溢出错误分类

1.1 Mapper/Reducer阶段JVM内存溢出(一般都是堆)

1.1.1 JVM堆(Heap)内存溢出:堆内存不足时,一般会抛出如下异常:

  • 1)-“java.lang.OutOfMemoryError: ” GC overhead limit exceeded;
  • 2)-"Error: Java heapspace" 异常信息
  • 3)-"running beyondphysical memory limits. Current usage: 2.1 GB of 2.0 GB physical memory used; 3 GB of  8.4 GB virtual memory used. Killing container"

1.1.2 栈内存溢出:抛出异常为 java.lang.StackOverflowError

 常会出现在SQL中(SQL语句中条件组合太多,被解析成为不断的递归调用),或MR代码中有递归调用。这种深度的递归调用在栈中方法调用链条太长导致的。出现这种错误一般说明程序写的有问题。

1.2 MRAppMaster内存不足

如果作业的输入的数据很大,导致产生了大量的Mapper和Reducer数量,致使MRAppMaster(当前作业的管理者)的压力很大,最终导致MRAppMaster内存不足,作业跑了一般出现了OOM信息。

异常信息为:

Exception: java.lang.OutOfMemoryError thrown from theUncaughtExceptionHandler in thread "Socket Reader #1 for port 30703

Halting due to Out Of Memory Error...

Halting due to Out Of Memory Error...

Halting due to Out Of Memory Error...

1.3 非JVM内存溢出

异常信息一般为:java.lang.OutOfMemoryError:Direct buffer memory

自己申请使用操作系统的内存,没有控制好,出现了内存泄露,导致的内存溢出。

2 错误解决参数调优

2.1 Mapper/Reducer阶段JVM堆内存溢出参数调优

目前MapReduce主要通过两个组参数去控制内存:(将如下参数调大)

Mapper:

  • mapreduce.map.java.opts=-Xmx2048m(默认参数,表示jvm堆内存,注意是mapreduce不是mapred)
  • mapreduce.map.memory.mb=2304(container的内存)

Reducer:

  • mapreduce.reduce.java.opts=-Xmx2048m(默认参数,表示jvm堆内存)
  • mapreduce.reduce.memory.mb=2304(container的内存)

2.2 MRAppMaster

  • yarn.app.mapreduce.am.command-opts=-Xmx1024m(默认参数,表示jvm堆内存)

  • yarn.app.mapreduce.am.resource.mb=1536(container的内存)

注意在Hive ETL里面,按照如下方式设置:

set mapreduce.map.child.java.opts="-Xmx3072m"(注:-Xmx设置时一定要用引号,不加引号各种错误)

set mapreduce.map.memory.mb=3288

set mapreduce.reduce.child.java.opts="xxx"

set mapreduce.reduce.memory.mb=xxx

2.3 涉及YARN参数

  • yarn.scheduler.minimum-allocation-mb (最小分配单位1024M)
  • yarn.scheduler.maximum-allocation-mb (8192M)
  • yarn.nodemanager.vmem-pmem-ratio (虚拟内存和物理内存之间的比率默认 2.1)
  • yarn.nodemanager.resource.memory.mb

Yarn的ResourceManger(简称RM)通过逻辑上的队列分配内存,CPU等资源给application,默认情况下RM允许最大AM申请Container资源为8192MB(“yarn.scheduler.maximum-allocation-mb“),默认情况下的最小分配资源为1024M(“yarn.scheduler.minimum-allocation-mb“),AM只能以增量(”yarn.scheduler.minimum-allocation-mb“)和不会超过(“yarn.scheduler.maximum-allocation-mb“)的值去向RM申请资源,AM负责将(“mapreduce.map.memory.mb“)和(“mapreduce.reduce.memory.mb“)的值规整到能被(“yarn.scheduler.minimum-allocation-mb“)整除,RM会拒绝申请内存超过8192MB和不能被1024MB整除的资源请求。(不同配置会有不同)

你可能感兴趣的:(Hive)