由一个HADOOP_HOME and hadoop.home.dir are unset报错引起的window环境连接调试远程hadoop的一系列问题,hadoop版本 2.8

本文对应的安装过程请点击此处


结论

先说结论。最后问题解决了。终于能在windows的eclipse上通过执行wordcount类,然后将某个文档内容处理后,将结果传到远程服务器的hadoop的某个文件夹下了。

当时的环境

我已经在linux服务器上安装了分布式的hadoop环境,一namenode两datanode。而且已经在linux服务器上测试过hadoop2.8自带的wordcount的jar的运行。可以正常运行并得到结果

eclipse中已添加hadoop-eclipse-plugin-2.7.jar(不是2.8的插件jar包,请注意)。并且在eclipse中配置了map/reduce对应的hadoop的一些基本配置信息。如下面两张图

由一个HADOOP_HOME and hadoop.home.dir are unset报错引起的window环境连接调试远程hadoop的一系列问题,hadoop版本 2.8_第1张图片

由一个HADOOP_HOME and hadoop.home.dir are unset报错引起的window环境连接调试远程hadoop的一系列问题,hadoop版本 2.8_第2张图片

上图中的advanced parameters中仅修改了hadoop.tmp.dir属性,改为我在linux中的/usr/local/hadoop/tmp的路径而已。其他属性都是默认值。

将hadoop自带的wordcount.class反编译后放到一个新建立的mapreduce工程中。工程里面用到的jar包来源于hadoop2.8自带的所有jar包。代码仅有一个wordcount.java,没有其他辅助配置性信息和java文件。代码关键部位如下图所示

由一个HADOOP_HOME and hadoop.home.dir are unset报错引起的window环境连接调试远程hadoop的一系列问题,hadoop版本 2.8_第3张图片

其中入参和出参都在名为ars的字符串数组中定义了。而且那个入参要在linux服务器上真实存在,出参应该是个空的路径,否则会报路径已存在的错误。

问题的产生

当我运行这个java文件的时候,报错“HADOOP_HOME and hadoop.home.dir are unset”。然后我就懵逼了。

解决步骤

题外话:我一直认为,我本地的eclipse就是个调用远程hadoop的作用,所以本地的windows操作系统中不需要安装hadoop了。所以我看到这个HADOOP_HOME的时候一直不明白,难道我还需要在我本地安装一个hadoop吗????

其实答案是:是的。我倒霉就倒霉在没有在本地放一个hadoop。这个hadoop不需要安装,不需要像网上说的得先安装一个什么Cygwin(说个题外话,我始终认为,这个东西就是在windows上模拟一个类似linux的环境出来。然并卵。)。只需要找一个hadoop2.8的二进制包(官网上这个东西大概400多兆),解压放到你windows下的某处即可。

然后重点在这里,仅仅解压缩了这个hadoop的包还不够,还需要这俩东西:hadoop.dll和winutils.exe及其附属(hadoop.exp、hadoop.lib、hadoop.pdb、libwinutils.lib、winutils.pdb)。缺少会报错,我在报错前已经把这俩及其相关的东西都放上了,所以不知会报啥错。

有点扯远了,还说在本地放hadoop程序包的问题。只要解压了程序包,同时在你的环境变量中的系统变量中配置了HADOOP_HOME并且指向hadoop程序包的本目录即可(如我本机就是F:\work\software\linux\hadoop-2.8.0),并且在系统变量的path中附加了%HADOOP_HOME%/bin(这里一定要指向到bin这一级才行)就能在你的windows上运行wordcount程序了。

有的人仅仅配置了上一步还不够,还需要重启一下电脑才行。我就属于这部分的。。。

然后后面可能还会出一些其他jar包找不到的错误,从网上找一下放上就全都ok了。

感想

本地的hadoop其实真的真的没有参与干活儿。因为我连启动都没启动过本地的hadoop。但是在本地的hadoop所属盘符的根目录下生成了一系列的目录。虽然不知是啥原因,但我瞎想可能主要起到一个临时缓存的目的。

生成这个缓存路径的原因应该是hadoop本身系统的相关设置。或者准确来说,是mapreduce本身的设置决定的。要有一个缓存路径。所以在windows上设置hadoop_home的目的就是为了给这个缓存用的。

而且如果是在linux系统上执行wordcount的jar包的时候,应该会在服务器上生成这么一个缓存路径。

你可能感兴趣的:(由一个HADOOP_HOME and hadoop.home.dir are unset报错引起的window环境连接调试远程hadoop的一系列问题,hadoop版本 2.8)