默认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增大。