原来设置的是单机的一个节点的window本地的hadoop。当时跑成功了之后,就再也没进行开发测试。今天对其再使用,不知怎么eclipse链接一直不成功。后来索性在别人搭建的ubuntu上分布式的hadoop上进行测试开发。一步步如下所示:
首先进行对hadoop所在集群的链接的设置,主要包括hdfs的设置与mapreduce的设置,具体设置示例如下图所示:
其中Map/Reduce Master为mapred-site.xm中的配置,DFS Master为core-site.xml中的配置。对于截图底部的User Name是我部署hadoop的用户。你使用哪个用户部署的hadoop,在这里就使用那个用户名。
而我的hdfs上的文件目录如图所示:
可以看出,在点击运行的时候输入的参数和hdfs上的文件路径必须一致,否则就会出错。在你运行程序之前,/user/root下不能有output文件。因为你在运行程序的时候指定了输出文件/user/root/output,如果在你跑程序之前存在该目录则会报错File exist
下面是我运行遇到的错误:
其实这些错误都能在网上找到。不过一般都是一个人碰到一个错误,但是不知为何,我从头开始全部碰到了。
第一个错误,对文件无权限:
12/04/24 15:32:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 12/04/24 15:32:44 ERROR security.UserGroupInformation: PriviledgedActionException as:Administrator cause:java.io.IOException: Failed to set permissions of path: \tmp\hadoop-Administrator\mapred\staging\Administrator-519341271\.staging to 0700 Exception in thread "main" java.io.IOException: Failed to set permissions of path: \tmp\hadoop-Administrator\mapred\staging\Administrator-519341271\.staging to 0700 |
这是window下运行jar不对,hadoop在运行的时候会对文件系统进行检查。如果不满足的话就会抛出异常。解决办法就是对hadoop-core进行重新编译,修改其中的/hadoop-X-X-X/src/core/org/apache/hadoop/fs/FileUtil.java里面的checkReturnValue,把方法体全部注释掉即可。然后重新编译hadoop-core.1.X.X.jar。其实这个版本要求并不是很严格,我hadoop是1.0.3,但是我使用是别人重新编译的hadoop-core.1.0.0.jar,依旧可以。因为每个版本的升级,不一定都会升级所有类,所以版本有点不同步,也有可能使用。下载地址请点击点击下载
第二个错误Input path does not exist,你的路径找不到 :
security.UserGroupInformation: PriviledgedActionException as:Administrator cause:org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist:
其实这个错误很二,分下面两种情况,每个都很二:
1:你是否把你的文件上传到hdfs上去提前,如果不能,则必须提前上传上去,上传的路径必须和上面eclipse中输入的参数是相同的;
2:你是否在run as 的时候是run on hadoop而不是按照普通的java程序运行方式。
在这里补充一点错误
就是当运行的时候,运行结果的输出路径必须是不存在。因为在提交job的时候有一个步骤是要判断你的设置中的输出路径是否存在,如果存在的话就要抛出异样。所以每次在跑你的程序的时候必须要把输出路径删除,让程序自己重新建立。或者你在你的程序代码中判断一下是否存在当前路径,如果存在的话就删除。
再补充一点错误
在本地eclipse连接hdfs一直无法连接。这是你配置文件的错误,在core-site.xml中有配置<name>fs.default.name</name>在这里的value配置不要配置成localhost或者127.0.0.1,要真的配置成本机ip地址
<name>fs.default.name</name>
<value>hdfs://192.168.124.102:9000</value>
继续补充
windouw下连接远程虚拟机进行开发hadoop程序的时候在提交job的时候是以你本机windouw下操作系统的用户名体积的,但是当对虚拟机上的hadoop系统进行读写操作的时候需要相应的权限,这个时候就会导致权限问题的出现Permission denied: user=(windouw下用户名),这时候解决可以在hdfs-site.xml中配置:<property>
<name>dfs.permissions</name>
<value>false</value>
对权限检查进行暂时的关闭
第三个错误 压缩编码错误:
是因为在初始化配置中,声明了压缩格式中存在SnappyCodec格式,但是我hadoop所在主机没有安装这种格式的压缩工具,所以在初始化整个配置的时候导致找不到该压缩格式的具体实现,抛出异常。
两种方法,在hadoop所在主机安装并配置好,然后再重启hadoop。Snappy与LZO压缩的安装方式请点击。另外还要查看,hadoop在eclipse端的Edit Hadoop Location中的高级配置中是否有该编码格式。
而安装SnappyCodec之后配置如下,记得要重启hadoop:
. Add the following key/value pairs into core-site.xml
<property> <name>io.compression.codecs</name> <value> org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.DefaultCodec, org.apache.hadoop.io.compress.BZip2Codec, org.apache.hadoop.io.compress.SnappyCodec </value> </property>另一种是把该压缩方法给注释掉,这样初始化的时候就不会去寻找该压缩方式的,没有SnappyCodec编码格式的。
另外你还可能遇到堆栈溢出,我当时跑的是遇到了,后来设置了-Xmx1024m堆栈参数,可以跑成功了。
详细配置有个不错的教程,可以去看看: http://www.cnblogs.com/shitouer/archive/2012/05/29/2522860.html
而如果有多个job想接连顺序执行的话,可以利用包org.apache.hadoop.mapred.jobcontrol.JobControl。该类下面有可以添加工作链
更多的错误请查看另外一个连接:http://blog.csdn.net/zwan0518/article/details/9164449