写在文章之前。。。。。。
写文章一方面是为了记录在学习和实践的过程中遇到的问题以及对应的解决方法,二是回顾梳理知识,加深理解。初学Hadoop,对其中的很多的设计原理和思想还不甚理解,因此文章中对于Hadoop的知识点表述不正确的地方,还望大神能够予以指正。
===================================华丽的分割线======================================
本文的目的是使用Eclipse搭建Hadoop开发环境
环境说明与准备:
一个已经搭建好的Hadoop集群
32位 Windows 7
jdk 1.7
Eclipse 4.3
hadoop-2.5.2(Windows 7下使用)
hadoop-eclipse-plugin-2.6.0
包含插件hadoop-eclipse-plugin-2.6.0.jar和32位和64位的winutils.exe和hadoop.dll的压缩包的下载地址:http://down.51cto.com/data/2010240
第一步:配置Hadoop环境变量,与jdk环境变量的配置基本类似
把下载的hadoop-2.5.2解压到D盘的根目录下,然后计算机==》属性==》高级系统设置==》环境变量
HADOOP_HOME:D:\hadoop-2.5.2
编辑PATH变量,添加:;%HADOOP_HOME%\bin。
第二步:安装Eclipse插件
把hadoop-eclipse-plugin-2.6.0.jar放到eclipse==》plugins目录下面,重启Eclipse,打开Window==》Preferences,能够看到Hadoop Map/Reduce就是插件安装成功,下面指定Hadoop的安装目录即第一步设定的HADOOP_HOME。
第三步:新建Map/Reduce Project工程
输入工程名称,然后点击Finish按钮
可以看到如下图所示,可以看到有新建的工程还有自动生成的DFS Locations,此时点击DFS Locations什么都不会看到,因为还没有配置其相应的HDFS:
第四步:显示Hadoop的Map/Reduce Locations视图,配置Hadoop Locations
Window==》Show View==》Other,找到Map/Reduce Tools下的Map/Reduce Locations,并点击ok。
可以在下面看到Map/Reduce Locations,并New Hadoop Locations
设置下面几个参数:
Location name:起一个名字,这里是hadoopLocation;
---------------我对hadoop的配置文件还没完全理解,下面是引用自别人的链接------------
Map/Reduce Master 部分相关定义:
Host:JobTracker所在的机器的IP地址
port:JobTracker的端口
两个参数就是 mapred-site.xml中mapred.job.tracker的ip和端口
DFS Master部分:
Host:就是上一节集群搭建中Namenode所在机器IP
Port:就是namenode的端口
这两个参数是在 core-site.xml里fs.default.name里面的ip和端口
---------------------------------------------------------------------------------
下面根据我测试的结果,说说我的理解,不一定对。
端口号一定要与自己的hadoop集群的配置文件一致
Map/Reduce(V2) Master
Host:hadoop集群中的任何一个节点都是可以的,用来做Map/Reduce计算用的;我这里hadoop集群中有4台机器,我在这个配置中,写任何一个节点程序都是可以正常运行的,所以我认为这个可以是hadoop集群中的任何一个节点就可以。但是不建议使用master节点,因为master节点压力过大的话,master一旦挂掉,整个集群都down了,所以不要给master计算的压力。
Port:该节点的对应的JobTracker的端口
DFS Master
Host:只能是hadoop集群的Master节点,即定义在core-site.xml中的fs.default.name中的value来体现的,例如hdfs://192.168.3.57:8020;这里host就是192.168.3.57,队友的port就是8020
Port:上面已做说明
关于User Name的问题,在这里补充说明一下,因为我的Windows账户就是lxy-PC,所以这里它会使用这个名称(lxy)去链接hadoop集群,修改上面的User name好像是不起作用的,而我的hadoop集群中刚好有lxy这个账户,所以我开始没有发现问题。如果hadoop集群中,没有lxy账户的话,好像不能对HDFS进行编辑和操作,只能查看,针对这个问题有两个解决方案:一是修改Windows的账户名称;二是在集群下面新建一个与Windows账户名称对应的账户。
如果上面配置都正确的话,此时可以打开Project Explorer中的DFS Locations,可以查看hdfs中的文件,并对文件进行增加,删除操作。
第五步:编写Map/Reduce程序,测试运行。这里使用hadoop自带的例子WordCount进行测试,直接把代码放到WordCount工程中的src目录下,设置运行参数,Run As==》Run Configuration,设置Arguments, 因为WordCount需要两个参数,一个是统计哪个目录下的文件中出现的词,一个是统计结果存放的地方
此时运行程序,你将看到如下运行结果:
log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Exception in thread "main" java.lang.NullPointerException at java.lang.ProcessBuilder.start(ProcessBuilder.java:1010) at org.apache.hadoop.util.Shell.runCommand(Shell.java:482) at org.apache.hadoop.util.Shell.run(Shell.java:455) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702) at org.apache.hadoop.util.Shell.execCommand(Shell.java:791) at org.apache.hadoop.util.Shell.execCommand(Shell.java:774) at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:646) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:434) at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:281) at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:125) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:348) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1285) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1282) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1282) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1303) at WordCount.main(WordCount.java:70)
上面的提示信息是log4j没有配置导致的。但是出现上面的错误,是因为在Windows下运行Map/Reduce程序需要winutils.exe和hadoop.dll的支持,这两个文件在我上面给出来的下载链接里面都有,需要根据系统位数的不同,选择32位或者64位的,然后拷贝上面两个文件放到HADOOP_HOME/bin目录下,然后拷贝hadoop.dll到C:\Windows\System32目录下,做完上面的工作时候,再次运行WordCount。还是会看到log4j的提示信息,但是没有关系,此时可以查看统计结果。
$ hadoop fs -cat output/* Goodbye 1 Hadoop 1 This 1 file 2 goodbye 1 hadoop 4 hello 1 is 2 test 2 this 1
下面把我的测试的输入文件给贴出来:
test.txt
this is hadoop test file This is hadoop test file Goodbye Hadoop goodbye hadoop
testHadoop.txt
hello hadoop
可以结合测试文件,与统计结果做比较,说明已经可以成功的在Eclipse下运行Hadoop程序。