大数据

标题: Hive单表分区数过多执行查询报错 [打印本页]

作者: Zeng    时间: 2015-5-11 18:46
标题: Hive单表分区数过多执行查询报错
本帖最后由 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







欢迎光临 大数据 (http://www.bigbase.cn/) Powered by Discuz! X3.2