问题排查Hive本地计算模式失败
查看hive.log后发现是java space heap,也就是java内存溢出。
解决方案:
- 配置yarn集群的资源分配。
-
由于是本地计算,因此container一定是申请在本地的,限制AM申请container容器资源的大小很重要。机器节点的资源可用通过配置NodeManager,所以第一步是配该节点的NodeManager资源。
我的服务器是8G2核的,大家可以参考一下。
我的配置如下:
<!-- 不设置nm虚拟cpu核数,使用默认值-1,即8核,注:这里的8核指的是虚拟cpu核数,为了屏蔽物理机器差异,nodemanager所定义的核数指的是虚拟cpu,所以我物理2核也没关系--> <!-- 设置nm分配的物理内存,此值得大于container的最小内存 --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>2048</value> </property>
NodeManager配置完后,需要配置Container,即申请容器的大小。一个job会被ApplicationMaster分成多个task,task再分为task_attampt。而AM和task_attampt都是运行在Container中的,每个Container可申请的资源数可以通过配置约束。
<!-- 分配给container的最小内存 --> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>256</value> </property> <!-- 分配给container的最大内存 --> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>512</value> </property> <!-- 分配给container的最小虚拟cpu核数,使用默认值1 --> <!-- 分配给container的最大虚拟cpu核数 --> <property> <name>yarn.scheduler.maximum-allocation-vcores</name> <value>1</value> </property>
-
调整java堆大小
有两处需要设置
-
在hive-site.xml中写入
<!--This would set your java heap space to 2048 MB (2GB), you may even try it with a lower value first if that works --> <property> <name>mapred.child.java.opts</name> <value>-Xmx2048m</value> </property>
-
在hive-env.sh中写入
export HADOOP_HEAPSIZE=2048
建议:
如果本地跑的任务会被分片很多,建议设置
<property>
<name>hive.exec.mode.local.auto.input.files.max</name>
<value>10</value>
</property>
参考资料:
- https://stackoverflow.com/questions/15609909/error-java-heap-space
- https://developer.aliyun.com/article/1258023