hive执行HQL提示出错Error: Java heap space

来源:互联网 发布:js 下载图片到本地 编辑:程序博客网 时间:2024/05/20 23:34

默认io.sort.mb为100.但是在hql执行的时候hive log提示Java heap space.

找了很久的原因,尝试如下:

1.在mapred-site.xml中增加mapreduce.task.io.sort.mb参数

<property>
        <name>mapreduce.task.io.sort.mb</name>
        <value>10</value>
</property>

结果:无效


2.在core-site.xml中增加io.sort.mb参数,并设置为1

<property> 
  <name>io.sort.mb</name>  #指定了排序使用的内存,大的内存可以加快 job 的处理速度。
  <value>1</value>  
</property>

结果:无效


3.在hive 命令行中手动设置io.sort.mb参数

hive> set io.sort.mb=10;

结果:成功(后来尝试发现<=80均不会报错,即使设置为100看虚拟内存也应该够用,很奇怪)


后来尝试在系统参数设置中直接把 io.sort.mb改掉,发现不管是该core-site.xml还是mapred-site.xml都没用,应该是在某一个默认参数设置中修改,但是还么有找到。

补充一点:我的hadoop是2.0.0-cdh4.2.1,mapreduce是hadoop2.0.0-mr1-cdh4.2.1(MRv1)

---------------------

追加一下调查结果:

HADOOP_HOME=/home/hadoop/hadoop-2.0.0-cdh4.2.1

HADOOP_MR1_HOME=/home/hadoop/hadoop-2.0.0-mr1-cdh4.2.1

在hadoop dfs配置(HADOOP_HOME/etc/hadoop)中修改io.sort.mb参数无效,但是在同一个目录的mapred-site.xml修改后,hive查看io.sort.mb生效了。也就是说,即使hadoop2.0采用MR1的时候,虽然mapreduce在启动的时候不是在这个目录,但在start-dfs.sh执行的时候也会从这个目录去读取mapreduce的参数。


解决方法:把HADOOP_HOME/etc/hadoop/mapred-site.xml mv成其他名称如 mapred-site.xml.bak。然后在HIVE_CONF_DIR中修改mapred-site.xml中对应的io.sort.mb参数即可。

相应的,在hadoop-env.sh中,把HADOOP_HEAP增大。