在此处指的Hadoop开发主要是指MapReduce方面,通过Hadoop的Eclipse插件及在Eclipse中配置,就可以达到在本地连接远程服务器进行MapReduce的开发、运行。
在搭建之前,必须先下载一个Hadoop版本,在这里我们使用Hadoop-1.0.0,官方网址为:
http://hadoop.apache.org/
下载hadoop-1.0.0.tar.gz然后解压开来为hadoop-1.0.0,这个根目录也是在之后的配置中需要用到的。
插件hadoop-eclipse-plugin-1.0.0.jar是从网上找的一款,另外也可以编译
hadoop-1.0.0\src\contrib\eclipse-plugin工程得到,插件下载地址为:
http://u.zihou.me/viewfile.php?file_id=38
将下载的插件放入\MyEclipse 9\dropins目录,然后重启MyEclipse即可,启动MyEclipse后,如果安装成功,选择Windows->Open Perspective,会弹出如下图,可以见到Map/Reduce项(注:Eclipse也是如此)。
新创建一个工程,选择File->New->Project…,弹出如下图:
选中“Map/Reduce Project”,然后下一步:
输入工程名称,点“Configure Hadoop install directory”链接,弹出窗口:
在这里的Hadoop installation directory的目录为我们解压开来的Hadoop根目录,点确定完成。
在Eclipse中会出现刚才新创建的工程:
工程会自动将Hadoop-1.0.0根目录下的Jar包导入进来。
有两个类User org.apache.hadoop.security.User、org.apache.hadoop.fs.FileUtil需要修改一下,主要是为了取消Windows环境下不必要的权限验证和远程服务器和本地用户名不一致的问题。
将org.apache.hadoop.fs.FileUtil中的方法private static void checkReturnValue中的代码注释掉,在public User(String name, AuthenticationMethod authMethod, LoginContext login)中,直接将变量name的值设为远程服务器创建hadoop服务的用户名,如果你本地的用户名和远程服务器的用户名不一致的话,如name = “root”;
工程中的src/examples/WordCount.java是Hadoop自带的一个MapReduce例子,我们可以通过运行这个例子来看我们本地开发环境是否搭建正确。
运行WordCount,选择Run as -> Run on Hadoop,弹出一个窗口,如果是初次运行,需要先定义一个新的Hadoop服务,如果是已经配置过了的,则从下面的列表中选择即可。点下一步:
其中,Map/Reduce Master的地址和端口和远程服务器上Hadoop配置文件mapred-site.xml里的mapred.job.tracker配置一致,在这里为21.24.108.84(也就是master的地址)和9001.
DFS Master的地址和端口需要和远程服务器上Hadoop配置文件core-site.xml里的fs.default.name一致,在这里为21.24.108.84和9000.
然后点Advanced parameters标签,修改如下属性:
mapred.task.tracker.http.address改为:21.24.108.84:50060
mapred.job.tracker.http.address改为:21.24.108.84:50030
然后点完成,结束配置。
运行后,如果报错:
Exception in thread “main” org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory output already exists
那是因为MapReduce的输出目录已经存在,MapReduce的机制为了保证正在运行中的数据不被覆盖,所以在运行时只能是新创建一个输出目录,如果已经存在的话会不让执行。
进入远程Hadoop/bin目录,通过命令./hadoop fs -rmr output删除存在的目录,然后再次运行WordCount.java,在控制端会打印出运行信息,如:
12/05/15 16:03:36 INFO mapred.JobClient: map 100% reduce 0%
12/05/15 16:03:38 INFO mapred.LocalJobRunner:
12/05/15 16:03:38 INFO mapred.Task: Task ‘attempt_local_0001_m_000001_0′ done.
12/05/15 16:03:38 INFO mapred.Task: Using ResourceCalculatorPlugin : null
12/05/15 16:03:38 INFO mapred.LocalJobRunner:
12/05/15 16:03:38 INFO mapred.Merger: Merging 2 sorted segments
12/05/15 16:03:38 INFO mapred.Merger: Down to the last merge-pass, with 2 segments left of total size: 77 bytes
12/05/15 16:03:38 INFO mapred.LocalJobRunner:
12/05/15 16:03:38 INFO mapred.Task: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting
12/05/15 16:03:38 INFO mapred.LocalJobRunner:
12/05/15 16:03:38 INFO mapred.Task: Task attempt_local_0001_r_000000_0 is allowed to commit now
12/05/15 16:03:39 INFO output.FileOutputCommitter: Saved output of task ‘attempt_local_0001_r_000000_0′ to output
12/05/15 16:03:41 INFO mapred.LocalJobRunner: reduce > reduce
12/05/15 16:03:41 INFO mapred.Task: Task ‘attempt_local_0001_r_000000_0′ done.
12/05/15 16:03:42 INFO mapred.JobClient: map 100% reduce 100%
表示运行完成。
该WordCount是对HDFS中的两个文件进行分析,分别是:
/user/root/wordcount/file01,内容为:
Hello World Bye World
/user/root/wordcount/file02
Hello Hadoop Goodbye Hadoop
然后看输出的结果:
[root@master bin]# ./hadoop fs -cat output/part-r-00000
Bye 1
Goodbye 1
Hadoop 2
Hello 2
World 2
结果正确无误,至此,Hadoop的本地开发环境搭建正确无误。