Win7下通过eclipse远程连接CDH集群来执行相应的程序以及错误说明

时间:2022-10-20 07:05:55

  最近尝试这用用eclipse连接CDH的集群,由于之前尝试过很多次都没连上,有一次发现Cloudera Manager是将连接的端口修改了,所以才导致连接不上CDH的集群,之前Apache hadoop采用的端口是9000和9001,而Cloudera Manager采用的端口是8020端口,于是通过eclipse中的MapReduce选项卡,edit一个选项连接,发现连上了。这给我带来了一些意外。

  在这里有一个问题需要说明一下,这个eclipse的插件我还是用的Apache hadoop的hadoop2.5.2时编译的插件,而我上面能够连上的集群是CDH5.4.4,它采用的Apache hadoop是hadoop2.6.0的版本。这说明什么?说明eclipse的插件与hadoop的版本没多大关系,但是这里需要注意一个问题,我在创建MapReduce工程的时候,是没有加载hadoop2.5.2的jar包,所以我们需要在创建的工程下面手动添加你的CDH版本的jar包。这是由于我将MapReduce的的hadoop的安装目录设置成我的CDH5.4.4的路径(具体:Window--->Preferences---->Hadoop Map/Reduce)。通常情况下,如果版本相同的话,创建一个工程是会自动加载对应的jar包的。

  好了,现在我们可以创建我们想要的版本的MapReduce的工程了,那么接下来就是是否能正常的运行呢?答案当然是否定的。那么怎么办呢?请继续耐心的看完下面内容。

  当我按照上面创建好工程后,添加了WordCount的例子,运行发现出现了错误,错误一次列举如下:

错误1:Exceptionin thread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArray(II[BI[BIILjava/lang/String;JZ)V

  这个错误,网上也有很多人遇到过,开始以为我们有在C:/Windows/System32/和Hadoop—Home/bin目录下添加hadoop.dll文件,但是我进去查看发现我添加了,再认为是我的hadoop_home的环境变量没有配置,再次检查发现我配置了环境变量啊。于是继续在网上查找该问题的解决方案。后来发现有人说是hadoop.dll的版本的问题,hadoop2.4之前和之后对hadoop.dll的要求不一样。因此需要在网上下载对应的hadoop.dll文件即可。(在这里我没有提供下载的连接,需要的可以留言)

错误2:Exception in thread "main"java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

  错误2是紧接着错误1的,网上说目前错误的解决办法还没有解决,采用一种临时的方式来解决,解决的办法是:通过下载你的CDH的版本的源码(hadoop2.6.0-cdh5.4.4-src.zip),在对应的文件下,hadoop2.6.0-cdh5.4.4-src\hadoop-common-project\hadoop- common\src\main\java\org\apache\hadoop\io\nativeio下NativeIO.java 复制到对应的Eclipse的project(复制的过程中需要注意一点,就是在当前的工程下创建相同的包路径,这里的包路径org.apache.hadoop.io.nativeio,再将对应NativeIO.java文件复制到对应的包路径下即可。)

  最后修改NativeIO.java文件中的557行的代码,如下所示:

  源代码如下:

    public static boolean access(String path, AccessRight desiredAccess)
throws IOException {
return access0(path, desiredAccess.accessRight());
}

  修改后的代码如下:

    public static boolean access(String path, AccessRight desiredAccess)
throws IOException {
return true;
//return access0(path, desiredAccess.accessRight());
}

再次执行,发现ok了。

  前面几篇文章介绍了如何通过eclipse来调试mapreduce程序,其中一篇文章是介绍调试技巧:http://www.cnblogs.com/ljy2013/p/4686005.html   通过这篇文章现在可以直接写对应版本的CDH的MapReduce的工程了。并且可以调试。