一、准备
首先需要下载安装JDK,并且配置好环境变量;然后安装Eclipse、Cygwin;下载Hadoop包,将其释放到指定的位置;此外,为了更方便的访问节点,还需要安装SecureCRT和FlashFXP。具体软件版本如下所示:
JDK 1.7.0_15
Eclipse 4.2.1
Cygwin
Hadoop 1.0.4
SecureCRT 6.2.0
FlashFXP 4.2.6
现在,都下载好后,就可以开始搭建开发环境了,注意:安装过程也需要网络。(说到这里我不得不吐槽一下,以前的Sun现在的Oracle也太不够意思了,为了写个Java程序我容易吗?这么大的公司,敢问能做个一步到位的IDE吗!学学人家MS,看人家VS做的!都已经做到近乎智能到不能再智能的水平了,可人家还一个劲地推陈出新呢!Java倒好,上个世纪啥样,现在基本还是啥样,记事本,javac。呵呵~~)
1、安装JDK。
双击运行JDK的安装包,记住安装的路径,一路Next好了。
安装完成后,右键单击“我的电脑”,选择“属性”→“高级”→“环境变量”。
在“系统变量”新建一些环境变量。首先JAVA_HOME,变量值就是JDK的安装文件夹。
然后在Path变量中添加%JAVA_HOME%in;。
新建CLASSPATH变量,变量值是
%CLASSPATH%;.;%JAVA_HOME%libdt.jar; %JAVA_HOME%lib ools.jar。
这样就可以了,也许需要重启电脑,也许不需要,自便吧。在cmd中输入java –version,如果出现正确的JDK版本,则说明上述配置成功了。
2、安装Eclipse
解压到指定位置就行了,就是个普通的软件。
在他的插件包中可以找到Ant组件,如果没有那么还需要另外下载。
再次进入到环境变量对话框,新建ANT_HOME变量,变量值就是包含ant的那个文件夹,一般就是Eclipse插件包中的第一个文件夹。
例如:D:Program Fileseclipsepluginsorg.apache.ant_1.8.3.v20120321-1730。
再在Path中加上%ANT_HOME%/bin;。
3、安装Cygwin
这是一个能在Windows环境下模拟Unix的软件,据说没有它就不能在Windows下开发Hadoop程序。不过,我貌似就没有正常安装它,后来也确实没能像网上说的那样运行Hadoop程序,但它似乎并不影响程序的编译。再此就不详细描述了,网上有很多教程,百度一下比着装就行。核心就是装好openssh、openssl还有sed。
4、安装Hadoop
它实际上是一个库,并不是什么软件,所以把它解压到指定的文件夹里就可以了,例如D:hadoop-1.0.4。
5、SecureCRT和FlashFXP
它们只是辅助的工具,只要能用即可,并不需要特别的配置,也与开发Hadoop程序无关,如果你有其他的远程访问工具,可以不需使用它们。下面介绍一下它们连接集群中节点的方法。
FlashFXP是图形化的访问工具,比较直观。打开它后选择“快速链接(F8)”,在弹出的对话框中填入节点的地址即可。
如果连接成功,主窗口的界面右侧就会显示出节点上的目录,Hadoop的根目录一般会是/usr/hadoop/。
SecureCRT则是命令行的模式,打开程序后同样是选择快速连接,输入端口地址连接即可。
连接成功后,进入/usr/hadoop/bin文件夹,运行hadoop的守护进程start-all.sh。
打开浏览器就可以访问节点了(和书上画的一样,很激动吧!)。
至此,需要安装和配置的软件都准备好了,现在你就可以在Eclipse上编写普通的Java程序,生成jar包;用SecureCRT或FlashFXP访问远程节点。如果你已经感到些许不适了,那么我劝你马上关上此文档吧,下面的内容将更加令人反感。(也许Java就是为UNIX所生的,在Windows上开发Java程序从一开始就是个错误!)
二、编译Hadoop的Eclipse插件
貌似在以前的Hadoop版本里是包含编译好的Eclipse插件的,《Hadoop权威指南》里也有介绍,但是1.0.4里面没有,但是提供了源文件,可以自己编译。好吧,这就是开源的好处,像我等用惯了盗版的草民真的不适应。原来,开源的世界就是一个“自己动手丰衣足食”的地方。那么,我们开始吧!
1、找到Eclipse插件包源代码的位置,例如D:hadoop-1.0.4srccontribeclipse-plugin。
2、安全起见,把它复制到另外一个地方,例如D:hadoopplugin。(这里把这个路径记作PLUGIN)
3、把D:hadoop-1.0.4srccontribuild-contrib.xml复制到PLUGIN中,然后打开它,做以下修改。
name="hadoop.root" location="D:/hadoop-1.0.4"/>
并在其下面添加:
name="eclipse.home" location="D:/Program Files/eclipse"/> Eclipse的实际位置
name="version" value="1.0.4"/> hadoop的实际版本
在下面找到build.dir,修改到当前路径。
name="build.dir" location="build/${name}"/>
4、修改PLUGIN中的build.xml。
找到,
改为。
在下面,
添加 location="${hadoop.root}/hadoop-core-1.0.4.jar"/>。
查找并替换以下内容:
name="jar" depends="compile" unless="skip.contrib">
5、
Bundle-ClassPath: classes/,
注意:每个路径之前必须要添加一个空格,否则编译会出错。
6、
注意:编译过程需要网络。

7、

在这个View中,右键→New Hadoop Location。在弹出的对话框中你需要配置节点。这里面的Host、Port分别为你在节点上的/usr/hadoop/conf/mapred-site.xml、/usr/hadoop/conf/core-site.xml中配置的地址及端口。(此处就用到了FlashFXP)Location name是随便取的。Map/Reduce Master里的Host就是需要访问的节点IP,Port就是mapred-site.xml中tracker的值(只是冒号后面的数字啊)。DFS Master里的Port是core-site.xml里fs.default.name的值(也只是冒号后面的数字啊)。下面的User name则是mapred-site.xml文件里面冒号前面的字母。(很直白了吧~)
现在,Eclipse左边的Project Explorer里就有DFS Location了。注意,记得要用SecureCRT启动守护进程才行,否则访问不了。
9、
三、测试第一个Map/Reduce程序
在Eclipse里新建一个Map/Reduce工程,File→New→Other→Map/Reduce Project。
然后,右键单击工程名,导入hadoop文件夹下的WordCount范例。D:hadoop-1.0.4srcexamplesorgapachehadoopexamplesWordCount.java,导入时选择复制到本地即可。
接下来,直接运行即可。此时,控制台会输出“Usage: wordcount ”,这就说明程序已经编译成功了。下面右键单击工程名,选择Export,将其导出成jar包。一路Next之后,在最后一个对话框里,选择Main class后Finish。
现在,在你刚才选择的jar包生成路径处就可以看到已经生成的jar包。打开FlashFXP,将jar包复制到Hadoop的根目录下;再在SecureCRT中进入到根目录中,执行下述命令:
hadoop jar wordcount.jar user ootinput est.txt user ootoutput
回车后,WordCount程序就开始运行了。注意,只有当Hadoop集群工作正常的时候,程序才能得到正确的结果,否则可能出现始终停在某处没有任何反应的现象。
如果一切正常,在user ootoutput文件夹中会有part-r-00000文件,这里面就是对test.txt文件内的单词进行的统计结果。
四、直接使用Eclipse运行WordCount
按照上述步骤,已经可以正常编译Map/Reduce程序了,但是,它的运行较为繁琐,无法实现在Eclipse里直接运行。因为每次直接运行的时候,总是弹出如下异常:
13/03/11 13:38:10 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
13/03/11 13:38:10 ERROR
security.UserGroupInformation: PriviledgedActionExcepti
Exception in thread "main" java.io.IOException: Failed to set permissions of path: mphadoop-AdministratormapredstagingAdministrator948434723.staging to 0700
从网上得知,这一异常的产生是由于Hadoop库与Windows的兼容问题(或者说文件权限问题)。如果想修改,则需要对
%HADOOP_HOME%srccoreorgapachehadoopfsFileUtil.java
文件做下述修改:
之后,cmd进入到HADOOP_HOME目录中,运行ant命令重新编译Hadoop库。(这里网上有详细的教程,只需要搜索异常的名字即可。)但是,按照网上的编译步骤,我始终没有编译成功。经过漫长的下载等待之后,出现了Cannot run program “autoreconf”(in directory “D:hadoop-1.0.4src ative”): CreateProcess error=2, ???。大意应该就是没有找到autoreconf这个程序,究其原因可能还是和Cygwin没有安装好有关。如果是在Unix系统下,应该是可以正常编译的(即使也出现类似问题,网上也提供了解决方案)。看来编译整个Hadoop库是不可能了,那么就只编译这个文件好了。
现在,在Eclipse里新建一个Map/Reduce的工程,目的是能包含编译所需的包。如刚才导入WordCount.java那样,把FileUtil.java导入后编译出两个class文件,然后直接把它们拖进hadoop-core-1.0.4.jar的相应位置,替换原先的那两个类。记得,还要把修改好hadoop-core-1.0.4.jar复制一个,重命名为hadoop-core.jar,把它添加到Eclipseplugins的Hadoop插件包的lib里。
接下来,就是见证奇迹的时刻!
重启Eclipse,用SecureCRT启动守护进程,设置好wordcount的运行参数,Run on Hadoop。
如果一切正常,控制台会输出一长串信息:
13/03/11 15:20:20 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
13/03/11
15:20:20 WARN mapred.JobClient: No job jar file
set.
13/03/11 15:20:20 INFO input.FileInputFormat: Total input paths to process : 1
13/03/11 15:20:20 WARN snappy.LoadSnappy: Snappy native library not loaded
13/03/11 15:20:20 INFO mapred.JobClient: Running job: job_local_0001
13/03/11
15:20:20 INFO mapred.Task:
13/03/11 15:20:20 INFO mapred.MapTask: io.sort.mb = 100
13/03/11 15:20:20 INFO mapred.MapTask: data buffer = 79691776/99614720
13/03/11 15:20:20 INFO mapred.MapTask: record buffer = 262144/327680
13/03/11 15:20:20 INFO mapred.MapTask: Starting flush of map output
13/03/11 15:20:20 INFO mapred.MapTask: Finished spill 0
13/03/11 15:20:20 INFO mapred.Task: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
13/03/11
15:20:21 INFO mapred.JobClient:
13/03/11 15:20:23 INFO mapred.LocalJobRunner:
13/03/11 15:20:23 INFO mapred.Task: Task 'attempt_local_0001_m_000000_0' done.
13/03/11
15:20:23 INFO mapred.Task:
13/03/11 15:20:23 INFO mapred.LocalJobRunner:
13/03/11 15:20:23 INFO mapred.Merger: Merging 1 sorted segments
13/03/11 15:20:23 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 38 bytes
13/03/11 15:20:23 INFO mapred.LocalJobRunner:
13/03/11 15:20:23 INFO mapred.Task: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting
13/03/11 15:20:23 INFO mapred.LocalJobRunner:
13/03/11 15:20:23 INFO mapred.Task: Task attempt_local_0001_r_000000_0 is allowed to commit now
13/03/11 15:20:23 INFO output.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to hdfs://10.110.1.31:9000/user/root/output/log1
13/03/11
15:20:24 INFO mapred.JobClient:
13/03/11 15:20:26 INFO mapred.LocalJobRunner: reduce > reduce
13/03/11 15:20:26 INFO mapred.Task: Task 'attempt_local_0001_r_000000_0' done.
13/03/11
15:20:27 INFO mapred.JobClient:
13/03/11 15:20:27 INFO mapred.JobClient: Job complete: job_local_0001
13/03/11 15:20:27 INFO mapred.JobClient: Counters: 19
13/03/11
15:20:27 INFO mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO mapred.JobClient:
13/03/11
15:20:27 INFO mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
13/03/11
15:20:27 INFO
mapred.JobClient:
这就说明运行成功了,右键刷新Project Explorer里的Hadoop文件夹就可以看到输出的文件了。
当然,有些事情并不是一帆风顺的。我就遇到了“当前namenode正处于safe mode”异常。这时,可以用SecureCRT关闭安全模式:hadoop dfsadmin –safemode leave。
好吧,整个过程就是这个样子,前前后后反复研究了两个星期的时间,总算弄好了,截个屏留个纪念吧。^_^
最后,总结一下可以得出一个结论:在Windows下开发与Java有关的程序,纯属没事儿找事儿。







