hadoop使用笔记

时间:2025-02-09 09:06:26

一: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 需要小于上面的设置。