hadoop的mapreduce作业中经常出现Java heap space解决方案

我在进行两个大表的join时,任务显示成功,但Hadoop出现以下异常:

报出错误如下:

 java.lang.RuntimeException:java.lang.reflect.InvocationTargetException

      at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:81)

      at org.apache.hadoop.io.WritableUtils.clone(WritableUtils.java:231)

      at com.***.***.ajoin.Exception.regroup(ExecReducer.java:239)

      at com.***.***.ajoin.Exception.reduce(ExecReducer.java:263)

      at com.***.***.ajoin.Exception.regroup(ExecReducer.java:1)

      at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:430)

      at org.apache.hadoop.mapred.child.main(Child.java:155)

Caused by:java.lang.reflect.InvocationTargetException

      at sun.reflect.GeneratedConstructorAccessor6.newInstance(Unknow Source)

      at sun.reflect.DelegationConstructorAccessorImp1.newInstance(DelegatingConstructorA

      at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

      at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:79)

      ... 6 more

Caused by:java.lang.OutOfMemoryError:java heap space

     at java.nio.ByteBuffer.allocate(ByteBuffer.java:312)

     at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:760)

     at org.apache.hadoop.io.Text.encode(Text.java:388)

     at org.apache.hadoop.io.Text.set(Text.java:178)

     at org.apache.hadoop.io.Text.(Text.java:81)

     at org.apache.hadoop.contrib.utils.join.TaggedMapOutput.(TaggedMapOut.java:37)

     at com.***.***.ajoin.AjoinTaggedMapOutput.(AjoinTaggedMapOutput.java:15)

     ... 10 more

 

以及exception: java.lang.OutOfMemoryError: GC overhead limit exceeded
hadoop给每一个进程的空间默认是200M以上(具体不清楚,就是很小),可将这个参数调整以下,调整方法如下:

进入hadoop安装目录,conf文件下,编辑hadoop-site.xml文件,添加或修改

  mapred.child.java.opts
  -Xmx1024m

该参数设置了任务进程的jvm的使用内存,我设置为1G,可视个人情况来定。
Java has a couple of settings that help control how much memory it uses:

  • -Xmx sets the maximum memory heap size
  • -Xms sets the minimum memory heap size

这个参数只能使从修改过的服务器提交的任务占有1G空间,其他服务器提交的保持各自的状态。

修改整个机群:
我首先修改hadoop集群的配置hadoop-release/conf/hadoop-default.xml,将该配置修改为-Xmx2048m
任何同步所有节点的该配置,然后重启这个集群。
然后运行任务发现,那个task的java进程仍然是运行-Xmx200m参数下,为什么?

    原来-Xmx200m参数来至与提交job的客户端参数,因为offer提交job的机器在44.1上,在44.1上的hadoop客户端配置是-Xmx200m,这样提交的job会使用该配置。

后面将hadoop客户端配置修改为-Xmx1048m,重新运行一个job,查看hadoop集群的task进程,
已经发现进程已经运行在-Xmx1048m参数下。

你可能感兴趣的:(Hive)