您的位置:首页 > 大数据

大数据学习--使用Hadoop2.6.0遇到的相关问题

2015-08-27 17:38 519 查看
学习和使用Hadoop Yarn已有半年多,其中遇到了一些常见问题,在网上搜索基本可以找到答案,出处已找不到,我只是对自己遇到的问题做个总结,也感谢解决这些问题的大神们,原谅我已经忘记到底从哪里获得的答案o(╯□╰)o。我目前使用的Hadoop版本是2.6.0。下面是我遇到的问题,以后会不定期更新:

配置了HDFS的federation,eclipse插件配置连接Hadoop2.6.0后无法查看远程文件目录结构

使用Maven开发MapReduce时,无法下载Hadoop2.6.0相关包

MapReduce工程报错Missing artifact jdk.tools:jdk.tools:jar:1.7

Container … is running beyond virtual memory limits

Container … is running beyond physical memory limits

java.lang.OutOfMemoryError: Java heap space

不关闭防火墙的情况下提交作业失败

containner日志报错找不到类方法

提交作业指定-D、-libjars等常规选项失败

配置了HDFS的federation,eclipse插件配置连接Hadoop2.6.0后无法查看远程文件目录结构

如图所示,在Edit Hadoop location中,切换到Advanced parameters标签,修改fs.defaultFS为hdfs://192.168.0.14:9000/tmp。其中/tmp就是我在配置文件中配置的其中一个HDFS相对路径。



使用Maven开发MapReduce时,无法下载Hadoop2.6.0相关包

在pom.xml中增加如下配置:

<repositories>
<repository>
<id>maven.oschina.net</id>
<url>http://maven.oschina.net/content/groups/public/</url>
</repository>
</repositories>


MapReduce工程报错Missing artifact jdk.tools:jdk.tools:jar:1.7

在pom.xml文件中增加如下配置:

<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.7</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>


Container … is running beyond virtual memory limits

具体报错如下:

Container … is running beyond virtual memory limits. Current usage:498.0MB od 1GB physical memory used;2.7GB of 2.1GB virtual memory used.Killing container.

意思是虚拟内存不足,有几种解决办法,下面我说两种:

1、修改yarn-site.xml配置文件,可以增加yarn.nodemanager.vmem-pmem-ratio物理内存和虚拟内存的比例,但这种修改方法不好,需要重新启动集群才可以生效,而且出现需要更多虚拟内存的作业还需要修改配置,这样的方式不灵活;

2、在作业启动时动态配置mapreduce.map.memory.mb或 mapreduce.reduce.memory.mb的大小,Map和Reduce的虚拟内存大小是根据这两个配置进行取值的。或者修改mapred-site.xml配置文件中这两个值,如果没有增加即可。具体Hadoop2作业的相关内存参数要如何配置,可以参考:http://blog.chinaunix.net/uid-28311809-id-4383551.htmlhttp://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-configurations-resourcemanager-nodemanager/

Container … is running beyond physical memory limits

具体报错如下:

Container … is running beyond physical memory limits. Current usage: 2.5 GB of 2.5 GB physical memory used; 3.1 GB of 12.5 GB virtual memory used. Killing container.

意思是物理内存不足,修改方法与上一个错误第2个解决方式类似,增加mapreduce.map.memory.mb或 mapreduce.reduce.memory.mb的大小。

java.lang.OutOfMemoryError: Java heap space

具体报错如下:

org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.OutOfMemoryError: Java heap space

这个错误可能是MapReduce的算法不当,导致的OOM,首先先检查算法是否可以优化。如果无法优化,则根据具体情况修改配置或在提交作业时动态指定相应配置,有如下三种方法:

1、修改mapred-site.xml配置文件,修改mapreduce.map.java.opts或mapreduce.reduce.java.opts,增加map或reduce的JVM最大可用内存;

2、在程序中设置

configuration.set("mapreduce.map.java.opts", "-Xmx1024m")


这里1024只是例子;

以上两种方式不推荐,灵活性不好。

3、在提交作业时动态指定mapreduce.map.java.opts或mapreduce.reduce.java.opts的值。

推荐第三种解决方式。

不关闭防火墙的情况下提交作业失败

由于Hadoop Yarn把资源管理功能和作业调度功能分离开了,例如MapReduce的作业调度由MRApplicationMaster进行管理,而MRApplicationMaster的启动是在从机器上进行的,如果防火墙没有关闭,MRApplicationMaster启动就会失败(通信端口没有开启)。但MRApplicationMaster启动的端口是随机的,因此我目前的解决办法是开启一个范围端口,如下所示:

-A INPUT -p tcp -m tcp –dport 10000:65535 -j ACCEPT

目前没有找到太好的解决办法,但总觉得比关闭防火墙好一些。如果有哪位大神解决了这个问题,希望能告知我,不甚感激。

containner日志报错找不到类方法

有些情况下, 我们编写的MapReduce使用的jar包与Hadoop本身依赖的jar包版本不一致,导致使用某些方法时报错找不到该方法。原因是MapReduce作业会直接使用Hadoop本身依赖的jar包。如果想使用自己的jar包,

在configuration中设置:

conf.setBoolean(MRJobConfig.MAPREDUCE_JOB_USER_CLASSPATH_FIRST, true); // 设置mapreduce优先使用用户classpath


提交作业指定-D、-libjars等常规选项失败

我在提交MapReduce作业时,设置了如下配置 -D mapreduce.map.java.opts=-Xmx2560m,但在作业执行时读取该配置确实Hadoop默认的配置,也就是说我设置失败了。在网上查找答案未果。于是对源码进行了Debug,发现需要满足以下两个条件,才能动态配置成功:

1、需要main函数所在的类继承Configured类并实现Tool接口,或者使用如下代码获取Configuration:

Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();


这条是我通过看官方文档和一个同学的博客看到的(忘记出处了。。对不起)

2、需要将配置的常规选项放在全部参数的前面,例如:

hadoop jar hadoop-addCeilingFloor-1.0.0.jar -D mapreduce.map.java.opts=-Xmx2560m -D mapreduce.map.memory.mb=3072 -input …… -output ……

只有同时满足上述两个条件,才能动态配置成功。

以后如果有新的问题会再继续更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息