|
本帖最后由 Zeng 于 2015-5-11 18:48 编辑
java.lang.OutOfMemoryError: Java heap space
参考:OOM occurs when query spans to a large number of partitions
原因:
实际上分区数越多查询越慢,应控制分区数在5000以下。
1、hive会在执行查询时先将元数据中的分区信息加载到内存中,包括PARTITIONS、PARTITION_KEY_VALS、PARTITION_PARAMS等表的数据,如果分区数过多,这些表中的数据量也越大,hiveserver2默认的堆内存只有256M,因此heap不足。
2、如果hive-site.xml配置mapred.reduce.tasks数目较多(默认为-1,即slave个数),会导致每个查询job产生更多的map过程,同时分区数较多,加大了单个mapred加载的分区数据量。而在mapred-site.xml中的配置占用内存过低也会导致查询执行过程中报错,可适当调整:mapred.child.java.opts=-Xmx512m -XX:+UseConcMarkSweepGC
解决方案:
按照其他规则分区,降低目标表分区数,修改hive-env.sh,加入配置:export HADOOP_HEAPSIZE=2048
[1] Hive问题记录:http://my.oschina.net/cwalet/blog/266493
|
|