文章目录
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. 什么时候可能会发生这样的错误?
- 数据量很大
- 多STRING模糊匹配
- 使用limit offset,count 进行数据截取,当请求的offset+count数大于实际所拥有的数据时
2. 如何解决这个Outofmemory的错误呢?
2.1 先分析问题,然后确定大概的解决方向:
- 查看JVM的运行内存空间,适当的提高运行内存空间
- 检查项目中的代码是否存在死循环,如果存在检查是否做好了资源的清理
- 检查项目中是否存在一次性提取大量数据到内存的地方
- 检查是否是因为条件匹配的问题
- 寻找优化的查询方式
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/