大数据BigData之Hive查询时报错 Outofmemory

1,152 阅读2分钟

文章目录
  1.什么时候可能会发生这样的错误?
  2.如何解决这个Outofmemory的错误呢?
    2.1 先分析问题,然后确定大概的解决方向:
    2.2 具体的解决方法如下(修改hive-env.sh文件):
      2.2.1 增加JVM内存大小
      2.2.2 增加hadoop的溢出大小Hadoop_HeapSize
      2.2.3 在 HADOOP_OPTS 行中添加垃圾收集器
  3.结果


1. 什么时候可能会发生这样的错误?

  1. 数据量很大
  2. 多STRING模糊匹配
  3. 使用limit offset,count 进行数据截取,当请求的offset+count数大于实际所拥有的数据时

2. 如何解决这个Outofmemory的错误呢?


2.1 先分析问题,然后确定大概的解决方向:

  1. 查看JVM的运行内存空间,适当的提高运行内存空间
  2. 检查项目中的代码是否存在死循环,如果存在检查是否做好了资源的清理
  3. 检查项目中是否存在一次性提取大量数据到内存的地方
  4. 检查是否是因为条件匹配的问题
  5. 寻找优化的查询方式


2.2 具体的解决方法如下(修改hive-env.sh文件):

2.2.1 增加JVM内存大小

<property>
   <name>hive.tez.java.opts</name>
   <value>-Xmx2048m</value>
</property>

2.2.2 增加hadoop的溢出大小Hadoop_HeapSize

对Hadoop、元数据库、hiveserver2服务都起效

export HADOOP_HEAPSIZE=1024

2.2.3 在 HADOOP_OPTS 行中添加垃圾收集器

-XX:+UseParNewGC(新并行垃圾收集器)或 -XX:+UseConcMarkSweepGC (并发标记清除垃圾收集器)

if [ "$SERVICE" = "cli" ]; then
  if [ -z "$DEBUG" ]; then
    export HADOOP_OPTS="$HADOOP_OPTS -XX:NewRatio=12 -Xmx12288m -Xms10m -XX:MaxHeapFreeRatio=40 -XX:MinHeapFreeRatio=15 -XX:+UseParNewGC -XX:-UseGCOverheadLimit"
  else
    export HADOOP_OPTS="$HADOOP_OPTS -XX:NewRatio=12 -Xmx12288m -Xms10m -XX:MaxHeapFreeRatio=40 -XX:MinHeapFreeRatio=15 -XX:-UseGCOverheadLimit"
  fi
fi


3. 结果

在JVM内存 与 HeapSize 加大的前提下,再配置-XX:+UseParNewGC(新并行垃圾收集器)或 -XX:+UseConcMarkSweepGC (并发标记清除垃圾收集器)清理JVM的垃圾,从而避免了JVM的 outofmemory 错误的产生。


参考:亚马逊文档https://aws.amazon.com/cn/premiumsupport/knowledge-center/emr-hive-outofmemoryerror-heap-space/