一:hadoop程序添加三方包: 使用hadoop jar 运行时 抛出 java.lang.NoClassDefFoundError
原因:找不到三方包
解决方案:
1.可以将需要使用的包添加进 $HADOOP_HOME/share/hadoop/common/lib
太麻烦每个节点都必须添加 不过简单粗暴
2.将所需包放入项目的 lib 文件夹 。但包不可以调用别的包,不然也会报错
3.抽取为可执行包。用maven的话使用 mvn assembly:assembly 需要在pom.xml中添加assembly插件
4.使用DistributedCache类提交本地jar包到每一个任务节点上。
二:内存不够问题:执行任务中出现 java.lang.OutOfMemoryError: Java heap space 和 Error:GC overhead limit exceeded
原因分析:出现前者一般就是分配给jvm的内存不够大,而后者是在GC占用大量时间为释放小于2%空间的时候发生的,是一种保护机制。可能是由于程序写得有问题死循环什么的导致。
解决方案:
1.在 mapred-site.xml 中添加 mapred.child.java.opts ,值为 -Xms2048m -XX:-UseGCOverheadLimit
前一项是设置分配给jvm的内存。后一项是取消 gc overhead limit 机制,当然也有可能是程序有问题,需要重写。
三:container内存超过限制:执行任务中出现类似 Container [pid=26783,containerID=container_1389136889967_0009_01_000002] is running beyond physical memory limits. Current usage: 4.2 GB of 4 GB physical memory used; 5.2 GB of 8.4 GB virtual memory used. Killing container.
原因分析:给mapper和reducer的内存不够大
解决方案:
1.
In mapred-site.xml:
mapreduce.map.memory.mb: 4096
mapreduce.reduce.memory.mb: 8192
mapreduce.map.java.opts: -Xmx3072m
mapreduce.reduce.java.opts: -Xmx6144m
以上数值根据实际内存处理。但是java opts 需要小于上面的设置。