hadoop实践路上异常问题以及相关解决方法记录 | AiTi修炼|重剑无锋,拈花微笑
Header
Header

hadoop实践路上异常问题以及相关解决方法记录

在hadoop的实践路上,或多或少都会遇到些许问题,或者是环境问题、或者版本差异问题、也或者是由于低级配置错误导致等等,本文将记录一下在hadoop实践过程中遇到的问题以及相关的解决方法,以便自己备忘和遇到相类似问题的人员借鉴。

1.1、错误信息描述

Wrong FS: hdfs://localhost:9000/user/…  expected: file:///

1.1、问题定位分析

在本地运行hadoop Map/Reduce程序时,在涉及到hdfs文件操作的时候,往往会出现上面提到的错误,例如,程序中出现下面这段代码:

Path clear_path = new Path(args[1]);

FileSystem fs = FileSystem.get(conf);

fs.delete(clear_path);

通过试验发现,在分布式hadoop集群上运行这段代码是不会出现错误的,然而在本机伪分布式环境下运行这段代码就会出现前面提到的错误信息。有两种方法来解决这个问题。

1.1、问题解决方法

解决方法1:

将上述代码稍作修改,利用clear_path来获取FileSystem,改为如下代码片段:

Path clear_path = new Path(args[1]);

FileSystem fs = clear_path.getFileSystem(conf);

fs.delete(clear_path);

这样运行起来就不会报错。

解决方案2:

更为彻底的解决方法需要将hadoop目录中的conf文件夹中的hdfs-site.xml与core-site.xml复制到你的项目的目录之下,这样就不会再报这种错误。

【1.2、错误信息描述

上传本地文件到HDFS上时出现如下错误:

WARN hdfs.DFSClient: DataStreamer Exception: org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /user/root/input01/file01 could only be replicated to 0 nodes, instead of 1……

1.2、问题定位分析

这是由于没有添加节点的原因,即需要先启动namenode,再启动datanode,然后自动jobtracker和tasktracker,如下即可。

1.2、问题解决方法

(1)重启namenode:

#hadoop-daemon.sh start namenode

(2)重启datanode

#hadoop-daemon.sh start datanode

【1.3、错误信息描述

Run on Hadoop编译程序时,出现如下错误:   WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String);

1.3、问题定位分析

出现该问题的原因是因为job.setJarByClass使用了xxx.class的类加载器来寻找包含该类的Jar包,然后设置该Jar包为作业所用的Jar包。但是我们的作业Jar包是在程序运行时才打包的,而xxx.class的类加载器是AppClassLoader,运行后我们无法改变它的搜索路径,所以使用setJarByClass是无法设置作业Jar包的。

1.3、问题解决方法

将本工程导出的jar包放到工程根目录下面,并在提交程序前添加下面的设置:     conf.set(“mapred.jar”, “xxx.jar”); //其中,xxx.jar是你导出的jar文件名,注意第一个参数不要拼写错了,即可解决。

1.4、错误信息描述

Run on Hadoop编译程序时,出现如下错误:        org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security .AccessControlException: Permission denied: user=xxx, access=WRITE, inode=”hadoop”: hadoop:supergroup:rwxr-xr-x

1.4、问题定位分析

该问题是因为Eclipse使用Hadoop插件提交作业时,会默认以xxx身份去将作业写入hdfs文件系统中,对应的也就是HDFS上的/user/xxx,我的为/user/root,由于xxx用户对hadoop目录并没有写入权限,所以导致异常的发生。

1.4、问题解决方法

解决方法为:放开 hadoop目录的权限 , 方法有二:

(1)执行如下命令

$ hadoop fs -chmod 777 /user/root

(2)修改Hadoop配置

修改hadoop的配置文件:conf/hdfs-core.xml,找到dfs.permissions的配置项,将value值改为false,具体如下:

<property>

<name>dfs.permissions</name>

<value>false</value>

<description>

If “true”, enable permission checking in HDFS.

If “false”, permission checking is turned off, but all other behavior is unchanged.

Switching from one parameter value to the other does not change the mode, owner or group of files or directories.

</description>

</property>

修改完后重启下hadoop的进程使之生效即可。

1.5、错误信息描述

MapReduce操作HBase出现如下错误:        Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration        Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/zookeeper/KeeperException

1.5、问题定位分析

这是因为Hadoop在调用HBase包时找不到相应jar包导致;

1.5、问题解决方法

将HBase目录下的hbase-0.90.4.jar和lib目录下的zookeeper-3.3.2.jar包拷贝到hadoop/lib下即可,其它这类问题可以类似方法解决;

1.6、错误信息描述

MapReduce操作HBase出现如下错误:        org.apache.hadoop.hbase.TableNotFoundException: Cannot find row in .META. for table

1.6、问题定位分析

这是因为HBase中不存在要插入数据的表导致。

1.6、问题解决方法

在hbase shell中手工创建表格create ‘xxx’, ‘xxx’即可解决问题。

1.7、错误信息描述

MapReduce跑job时如果出现如下错误:        java.lang.RuntimeException: java.lang.ClassNotFoundException:

1.7、问题定位分析

这是因为Hadoop在找class时没有从jar包中找而出错导致。

1.7、问题解决方法

删除除开jar和.java文件外的所有目录和文件即可解决问题。

rscala.com版权所有,本文hadoop实践路上异常问题以及相关解决方法记录转载请注明出处:http://rscala.com/index.php/38.html

该文章归档分类于 hadoop实践, 大数据基础

One Response



Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

*

code