一、Hadoop开发环境简介 html
1.1 Hadoop集群简介 java
Java版本:jdk-6u31-linux-i586.bin node
Linux系统:CentOS6.0 linux
Hadoop版本:hadoop-1.0.0.tar.gz ios
1.2 Windows开发简介 apache
Java版本:jdk-6u31-windows-i586.exe 编程
Win系统:Windows 7 旗舰版 windows
Eclipse软件:eclipse-jee-indigo-SR1-win32.zip | eclipse-jee-helios-SR2-win32.zip api
Hadoop软件:hadoop-1.0.0.tar.gz 服务器
Hadoop Eclipse 插件:hadoop-eclipse-plugin-1.0.0.jar
下载地址:http://downloa
一、Hadoop开发环境简介
1.1 Hadoop集群简介
Java版本:jdk-6u31-linux-i586.bin
Linux系统:CentOS6.0
Hadoop版本:hadoop-1.0.0.tar.gz
1.2 Windows开发简介
Java版本:jdk-6u31-windows-i586.exe
Win系统:Windows 7 旗舰版
Eclipse软件:eclipse-jee-indigo-SR1-win32.zip | eclipse-jee-helios-SR2-win32.zip
Hadoop软件:hadoop-1.0.0.tar.gz
Hadoop Eclipse 插件:hadoop-eclipse-plugin-1.0.0.jar
下载地址:http://download.csdn.net/detail/xia520pi/4113746
备注:下面是网上收集的收集的"hadoop-eclipse-plugin-1.0.0.jar",除"版本2.0"是根据"V1.0"按照"常见问题FAQ_1"改的以外,剩余的"V3.0"、"V4.0"和"V5.0"和"V2.0"同样是别人已经弄好的,并且我已经都测试过,没有任何问题,能够放心使用。咱们这里选择第"V5.0"使用。记得在使用时从新命名为"hadoop-eclipse-plugin-1.0.0.jar"。
二、Hadoop Eclipse简介和使用
2.1 Eclipse插件介绍
Hadoop是一个强大的并行框架,它容许任务在其分布式集群上并行处理。可是编写、调试Hadoop程序都有很大难度。正由于如此,Hadoop的开发者开发出了Hadoop Eclipse插件,它在Hadoop的开发环境中嵌入了Eclipse,从而实现了开发环境的图形化,下降了编程难度。在安装插件,配置Hadoop的相关信息以后,若是用户建立Hadoop程序,插件会自动导入Hadoop编程接口的JAR文件,这样用户就能够在Eclipse的图形化界面中编写、调试、运行Hadoop程序(包括单机程序和分布式程序),也能够在其中查看本身程序的实时状态、错误信息和运行结果,还能够查看、管理HDFS以及文件。总地来讲,Hadoop Eclipse插件安装简单,使用方便,功能强大,尤为是在Hadoop编程方面,是Hadoop入门和Hadoop编程必不可少的工具。
2.2 Hadoop工做目录简介
为了之后方便开发,咱们按照下面把开发中用到的软件安装在此目录中,JDK安装除外,我这里把JDK安装在C盘的默认安装路径下,下面是个人工做目录:
系统磁盘(E:)
|---HadoopWorkPlat
|--- eclipse
|--- hadoop-1.0.0
|--- workplace
|---……
按照上面目录把Eclipse和Hadoop解压到"E:\HadoopWorkPlat"下面,并建立"workplace"做为Eclipse的工做空间。
备注:你们能够按照本身的状况,不必定按照个人结构来设计。
2.3 修改系统管理员名字
通过两天屡次探索,为了使Eclipse能正常对Hadoop集群的HDFS上的文件能进行修改和删除,因此修改你工做时所用的Win7系统管理员名字,默认通常为"Administrator",把它修改成"hadoop",此用户名与Hadoop集群普通用户一致,你们应该记得咱们Hadoop集群中全部的机器都有一个普通用户——hadoop,并且Hadoop运行也是用这个用户进行的。为了避免至于为权限苦恼,咱们能够修改Win7上系统管理员的姓名,这样就避免出现该用户在Hadoop集群上没有权限等都疼问题,会致使在Eclipse中对Hadoop集群的HDFS建立和删除文件受影响。
你能够作一下实验,查看Master.Hadoop机器上"/usr/hadoop/logs"下面的日志。发现权限不够,不能进行"Write"操做,网上有几种解决方案,可是对Hadoop1.0不起做用,详情见"常见问题FAQ_2"。下面咱们进行修改管理员名字。
首先"右击"桌面上图标"个人电脑",选择"管理",弹出界面以下:
接着选择"本地用户和组",展开"用户",找到系统管理员"Administrator",修改其为"hadoop",操做结果以下图:
最后,把电脑进行"注销"或者"重启电脑",这样才能使管理员才能用这个名字。
2.4 Eclipse插件开发配置
第一步:把咱们的"hadoop-eclipse-plugin-1.0.0.jar"放到Eclipse的目录的"plugins"中,而后从新Eclipse便可生效。
系统磁盘(E:)
|---HadoopWorkPlat
|--- eclipse
|--- plugins
|--- hadoop-eclipse-plugin-1.0.0.jar
上面是个人"hadoop-eclipse-plugin"插件放置的地方。重启Eclipse以下图:
细心的你从上图中左侧"Project Explorer"下面发现"DFS Locations",说明Eclipse已经识别刚才放入的Hadoop Eclipse插件了。
第二步:选择"Window"菜单下的"Preference",而后弹出一个窗体,在窗体的左侧,有一列选项,里面会多出"Hadoop Map/Reduce"选项,点击此选项,选择Hadoop的安装目录(如个人Hadoop目录:E:\HadoopWorkPlat\hadoop-1.0.0)。结果以下图:
第三步:切换"Map/Reduce"工做目录,有两种方法:
1)选择"Window"菜单下选择"Open Perspective",弹出一个窗体,从中选择"Map/Reduce"选项便可进行切换。
2)在Eclipse软件的右上角,点击图标""中的"
",点击"Other"选项,也能够弹出上图,从中选择"Map/Reduce",而后点击"OK"便可肯定。
切换到"Map/Reduce"工做目录下的界面以下图所示。
第四步:创建与Hadoop集群的链接,在Eclipse软件下面的"Map/Reduce Locations"进行右击,弹出一个选项,选择"New Hadoop Location",而后弹出一个窗体。
注意上图中的红色标注的地方,是须要咱们关注的地方。
Location Name:能够任意其,标识一个"Map/Reduce Location"
Map/Reduce Master
Host:192.168.1.2(Master.Hadoop的IP地址)
Port:9001
DFS Master
Use M/R Master host:前面的勾上。(由于咱们的NameNode和JobTracker都在一个机器上。)
Port:9000
User name:hadoop(默认为Win系统管理员名字,由于咱们以前改了因此这里就变成了hadoop。)
备注:这里面的Host、Port分别为你在mapred-site.xml、core-site.xml中配置的地址及端口。不清楚的能够参考"Hadoop集群_第5期_Hadoop安装配置_V1.0"进行查看。
接着点击"Advanced parameters"从中找见"hadoop.tmp.dir",修改为为咱们Hadoop集群中设置的地址,咱们的Hadoop集群是"/usr/hadoop/tmp",这个参数在"core-site.xml"进行了配置。
点击"finish"以后,会发现Eclipse软件下面的"Map/Reduce Locations"出现一条信息,就是咱们刚才创建的"Map/Reduce Location"。
第五步:查看HDFS文件系统,并尝试创建文件夹和上传文件。点击Eclipse软件左侧的"DFS Locations"下面的"Win7ToHadoop",就会展现出HDFS上的文件结构。
右击"Win7ToHadoopàuseràhadoop"能够尝试创建一个"文件夹--xiapi",而后右击刷新就能查看咱们刚才创建的文件夹。
建立完以后,并刷新,显示结果以下:
用SecureCRT远程登陆"Master.Hadoop"服务器,用下面命令查看是否已经创建一个"xiapi"的文件夹。
hadoop fs -ls
到此为止,咱们的Hadoop Eclipse开发环境已经配置完毕,不尽兴的同窗能够上传点本地文件到HDFS分布式文件上,能够互相对比意见文件是否已经上传成功。
三、Eclipse运行WordCount程序
3.1 配置Eclipse的JDK
若是电脑上不只仅安装的JDK6.0,那么要肯定一下Eclipse的平台的默认JDK是否6.0。从"Window"菜单下选择"Preference",弹出一个窗体,从窗体的左侧找见"Java",选择"Installed JREs",而后添加JDK6.0。下面是个人默认选择JRE。
下面是没有添加以前的设置以下:
下面是添加完JDK6.0以后结果以下:
接着设置Complier。
3.2 设置Eclipse的编码为UTF-8
3.3 建立MapReduce项目
从"File"菜单,选择"Other",找到"Map/Reduce Project",而后选择它。
接着,填写MapReduce工程的名字为"WordCountProject",点击"finish"完成。
目前为止咱们已经成功建立了MapReduce项目,咱们发如今Eclipse软件的左侧多了咱们的刚才创建的项目。
3.4 建立WordCount类
选择"WordCountProject"工程,右击弹出菜单,而后选择"New",接着选择"Class",而后填写以下信息:
由于咱们直接用Hadoop1.0.0自带的WordCount程序,因此报名须要和代码中的一致为"org.apache.hadoop.examples",类名也必须一致为"WordCount"。这个代码放在以下的结构中。
hadoop-1.0.0
|---src
|---examples
|---org
|---apache
|---hadoop
|---examples
从上面目录中找见"WordCount.java"文件,用记事本打开,而后把代码复制到刚才创建的java文件中。固然源码有些变更,变更的红色已经标记出。
package org.apache.hadoop.examples; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; public class WordCount { public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable values, Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.set("mapred.job.tracker", "192.168.1.2:9001"); String[] ars=new String[]{"input","newout"}; String[] otherArgs = new GenericOptionsParser(conf, ars).getRemainingArgs(); if (otherArgs.length != 2) { System.err.println("Usage: wordcount "); System.exit(2); } Job job = new Job(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }
备注:若是不加"conf.set("mapred.job.tracker", "192.168.1.2:9001");",将提示你的权限不够,其实照成这样的缘由是刚才设置的"Map/Reduce Location"其中的配置不是彻底起做用,而是在本地的磁盘上创建了文件,并尝试运行,显然是不行的。咱们要让Eclipse提交做业到Hadoop集群上,因此咱们这里手动添加Job运行地址。详细参考"常见问题FAQ_3"。
3.5 运行WordCount程序
选择"Wordcount.java"程序,右击一次按照"Run ASàRun on Hadoop"运行。而后会弹出以下图,按照下图进行操做。
运行结果以下:
从上图中咱们得知咱们的程序已经运行成功了。
3.6 查看WordCount运行结果
查看Eclipse软件左侧,右击"DFS LocationsàWin7ToHadoopàuseràhadoop",点击刷新按钮"Refresh",咱们刚才出现的文件夹"newoutput"会出现。记得"newoutput"文件夹是运行程序时自动建立的,若是已经存在相同的的文件夹,要么程序换个新的输出文件夹,要么删除HDFS上的那个重名文件夹,否则会出错。
打开"newoutput"文件夹,打开"part-r-00000"文件,能够看见执行后的结果。
到此为止,Eclipse开发环境设置已经完毕,而且成功运行Wordcount程序,下一步咱们真正开始Hadoop之旅。
四、常见问题FAQ
4.1 "error: failure to login"问题
下面以网上找的"hadoop-0.20.203.0"为例,我在使用"V1.0"时也出现这样的状况,缘由就是那个"hadoop-eclipse-plugin-1.0.0_V1.0.jar",是直接把源码编译而成,故而缺乏相应的Jar包。具体状况以下
详细地址:http://blog.csdn.net/chengfei112233/article/details/7252404
在我实践尝试中,发现hadoop-0.20.203.0版本的该包若是直接复制到eclipse的插件目录中,在链接DFS时会出现错误,提示信息为: "error: failure to login"。
弹出的错误提示框内容为"An internal error occurred during: "Connecting to DFS hadoop".org/apache/commons/configuration/Configuration". 通过察看Eclipse的log,发现是缺乏jar包致使的。进一步查找资料后,发现直接复制hadoop-eclipse-plugin-0.20.203.0.jar,该包中lib目录下缺乏了jar包。
通过网上资料搜集,此处给出正确的安装方法:
首先要对hadoop-eclipse-plugin-0.20.203.0.jar进行修改。用归档管理器打开该包,发现只有commons-cli-1.2.jar 和hadoop-core.jar两个包。将hadoop/lib目录下的:
commons-configuration-1.6.jar ,
commons-httpclient-3.0.1.jar ,
commons-lang-2.4.jar ,
jackson-core-asl-1.0.1.jar
jackson-mapper-asl-1.0.1.jar
一共5个包复制到hadoop-eclipse-plugin-0.20.203.0.jar的lib目录下,以下图:
而后,修改该包META-INF目录下的MANIFEST.MF,将classpath修改成一下内容:
Bundle-ClassPath:classes/,lib/hadoop-core.jar,lib/commons-cli-1.2.jar,lib/commons-httpclient-3.0.1.jar,lib/jackson-core-asl-1.0.1.jar,lib/jackson-mapper-asl-1.0.1.jar,lib/commons-configuration-1.6.jar,lib/commons-lang-2.4.jar
这样就完成了对hadoop-eclipse-plugin-0.20.203.0.jar的修改。
最后,将hadoop-eclipse-plugin-0.20.203.0.jar复制到Eclipse的plugins目录下。
备注:上面的操做对"hadoop-1.0.0"同样适用。
4.2 "Permission denied"问题
网上试了不少,有提到"hadoop fs -chmod 777 /user/hadoop ",有提到"dfs.permissions 的配置项,将value值改成 false",有提到"hadoop.job.ugi",可是统统没有效果。
参考文献:
地址1:http://www.cnblogs.com/acmy/archive/2011/10/28/2227901.html
地址2:http://sunjun041640.blog.163.com/blog/static/25626832201061751825292/
错误类型:org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security .AccessControlException: Permission denied: user=*********, access=WRITE, inode="hadoop": hadoop:supergroup:rwxr-xr-x
解决方案:
个人解决方案直接把系统管理员的名字改为你的Hadoop集群运行hadoop的那个用户。
4.3 "Failed to set permissions of path"问题
参考文献:https://issues.apache.org/jira/browse/HADOOP-8089
错误信息以下:
ERROR security.UserGroupInformation: PriviledgedActionException as: hadoop cause:java.io.IOException Failed to set permissions of path:\usr\hadoop\tmp\mapred\staging\hadoop753422487\.staging to 0700 Exception in thread "main" java.io.IOException: Failed to set permissions of path: \usr\hadoop\tmp \mapred\staging\hadoop753422487\.staging to 0700
解决方法:
Configuration conf = new Configuration();
conf.set("mapred.job.tracker", "[server]:9001");
"[server]:9001"中的"[server]"为Hadoop集群Master的IP地址。
4.4 "hadoop mapred执行目录文件权"限问题
参考文献:http://blog.csdn.net/azhao_dn/article/details/6921398
错误信息以下:
job Submission failed with exception 'java.io.IOException(The ownership/permissions on the staging directory /tmp/hadoop-hadoop-user1/mapred/staging/hadoop-user1/.staging is not as expected. It is owned by hadoop-user1 and permissions are rwxrwxrwx. The directory must be owned by the submitter hadoop-user1 or by hadoop-user1 and permissions must be rwx------)
修改权限: