hadoop单机版运行wordcount结果不正确

由官方文档看hadoop的单机与伪分布运行 -
- ITeye技术网站
hadoop众所周知,在单击上运行时,有两种运行模式:直接的单击运行模式,和在单击上使用多个守护线程模拟分布的伪分布运行模式。这两天配了一下hadoop,在此,就他们之间运行时的过程与区别表达一下我的看法。
从官方文档上的配置看起
1.单击模式
单机模式的操作方法,文档如下:
[
默认情况下,Hadoop被配置成以非分布式模式运行的一个独立Java进程。这对调试非常有帮助。
下面的实例将已解压的 conf 目录拷贝作为输入,查找并显示匹配给定正则表达式的条目。输出写入到指定的output目录。
$ mkdir input
$ cp conf/*.xml input
$ bin/hadoop jar hadoop-*-examples.jar grep input output 'dfs[a-z.]+'
$ cat output/*
]
可见,在单击模式中,首先创建了一个input目录($ mkdir input),然后,将原始数据(为hadoop自带的一些xml文件,即conf目录下的文件)拷贝至input目录下($ cp conf/*.xml input),
接着,启动hadoop的 hadoop-*-examples.jar类,当然,这是中文文档对应的0.19.2版的hadoop对应的自带jar包,而我配置时,对应的jar包则为:hadoop-examples-0.20.203.0.jar,因版本而异。在这一句中($ bin/hadoop jar hadoop-*-examples.jar grep input output 'dfs[a-z.]+'),同样给出了四个参数:grep,input,ouput,'dfs[a-.]+',分别依次代表:调用时,对应jar包下调用的类,输入文件目录(第一步已创建),输出文件目录(没有则会自动创建),要求条件的正则表达式,
最后,显示输出结果($ cat output/*),如果成功,这回在output目录下生成结果文件。
那么,这个单机版到底怎么运行的呢?看源码:hadoop-examples-0.20.203.0.jar
打开:src/examples/org/apache/hadoop/examples/grep.java(被调用类),可见:
[
public static void main(String[] args) throws Exception {
&&& int res = ToolRunner.run(new Configuration(), new Grep(), args);
&&& System.exit(res);
& }
]
运行时,直接调用了ToolRunner的方法,同时传入了Config类,与Grep类,与命令行输入参数(args)。这个方法不直观,让我们换个方法来看:同目录下的WordCount.java类
主函数如下:
[
public static void main(String[] args) throws Exception {
&&& Configuration conf = new Configuration();
&&& String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
&&& if (otherArgs.length != 2) {...}
&&&
& Job job = new Job(conf, "word count");
&&& job.setJarByClass(WordCount.class);
&&& job.setMapperClass(TokenizerMapper.class);
&& ...
&&& FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
&&& FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
&&& System.exit(job.waitForCompletion(true) ? 0 : 1);
& }
]
部分内容已省略
可见:在WC类中,首先创建了一个conf类(配置文件目前还没有配置,我们在伪分布时在分析),接着得到传入参数(otherArgs,对应的是原始数据和输出数据目录),然后,创建一个Job,Job中设置一个Mapper,一个Reducer(大名鼎鼎的MR模型的两部分),在然后,执行Job。而在Job中设置的Mapper和Reducer都是WC类的内部静态类,执行时,相当与调用了Mapper与Reducer中的map与reduce方法,进行了数据处理。
也是先看官方文档,在官方文档中,给出的伪分布定义如下:

Hadoop可以在单节点上以所谓的伪分布式模式运行,此时每一个Hadoop守护进程都作为一个独立的Java进程运行。

而进行伪分布时,首先要做的:配置XML

Configuration
Use the following:
conf/core-site.xml:
&configuration&
&&&& &property&
&&&&&&&& &name&fs.default.name&/name&
&&&&&&&& &value&hdfs://localhost:9000&/value&
&&&& &/property&
&/configuration&
conf/hdfs-site.xml:
&configuration&
&&&& &property&
&&&&&&&& &name&dfs.replication&/name&
&&&&&&&& &value&1&/value&
&&&& &/property&
&/configuration&
conf/mapred-site.xml:
&configuration&
&&&& &property&
&&&&&&&& &name&mapred.job.tracker&/name&
&&&&&&&& &value&localhost:9001&/value&
&&&& &/property&
&/configuration&
配置的这些有什么用呢?什么参数有什们用的(这么多localhost。。。)?其实,我目前也不时很懂,凭自己感觉分析一下吧。
然后设置ssh,能够登录本机。
执行,启动start-all.sh
来,那就看一下start-all.sh中的内容
有这么几句

. "$bin"/hadoop-config.sh
# start dfs daemons
"$bin"/start-dfs.sh --config $HADOOP_CONF_DIR
# start mapred daemons
"$bin"/start-mapred.sh --config $HADOOP_CONF_DIR

可见,又启动了hadoop-config.sh,start-dfs.sh ,start-mapred.sh
总之,在start-all的启动过程中,启动了namenode,datanode,jobtracker,tasktracker等守护线程。
那么这些守护线程又是如何与我们的WD类交互的呢?
再回去看一下WD。。。我们开始时,好像跳过了什么。。对了就是config类。
发现如下静态块

static{
&&& //print deprecation warning if hadoop-site.xml is found in classpath
&&& ClassLoader cL = Thread.currentThread().getContextClassLoader();
&&& if (cL == null) {
&&&&& cL = Configuration.class.getClassLoader();
&&& }
&&& if(cL.getResource("hadoop-site.xml")!=null) {
&&&&& LOG.warn("DEPRECATED: hadoop-site.xml found in the classpath. " +
&&&&&&&&& "Usage of hadoop-site.xml is deprecated. Instead use core-site.xml, "
&&&&&&&&& + "mapred-site.xml and hdfs-site.xml to override properties of " +
&&&&&&&&& "core-default.xml, mapred-default.xml and hdfs-default.xml " +
&&&&&&&&& "respectively");
&&& }
&&& addDefaultResource("core-default.xml");
&&& addDefaultResource("core-site.xml");
& }

可见,config类中,首先就加载了hadoop-site.xml,当其为空时,加载core-site.xml,mapred-site.xml,hdfs-site.xml这三个xml文件(虽然我愣是没找到他加载的时的源码在那。。。。。),没错,就是我们在开始伪分布时,配置的那三个xml文件。然后,WD
类就能够根据config类,在实行job时,调用对应的守护进程,恩..在伪分布时,就是配置在localhost上的进程,当然,如果将其修改为对应服务器的IP,那不就时真正的分布式了么?
xiaoluobo6666
浏览: 5791 次
来自: 湖南
这种解决方法是不可能完全消除乱码的。因为客户端发送的是UTF- ...
“不发表就没有留存, 没有留存就没有记忆,没有记忆就没有历史, ...Linux单机运行hadoop平台 - 轻剑寂寥 - ITeye技术网站
博客分类:
Hadoop-0.19.2的代码可以到Apache上下载,使用的Linux机器是RHEL 5,Linux上安装的Java版本为1.6.0_16,并且JAVA_HOME=/usr/java/jdk1.6.0_16实践过程
1、ssh无密码验证登陆localhost保证Linux系统的ssh服务已经启动,并保证能够通过无密码验证登陆本机Linux系统。如果不能保证,可以按照如下的步骤去做:
(1)启动命令行窗口,执行命令行:$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa$ cat ~/.ssh/id_dsa.pub && ~/.ssh/authorized_keys(2)ssh登陆localhost,执行命令行:$ ssh localhost第一次登录,会提示你无法建立到127.0.0.1的连接,是否要建立,输入yes即可,下面是能够通过无密码验证登陆的信息:[root@localhost hadoop-0.19.2]# ssh localhostLast login: Sun Aug
1 18:35:37 2010 from 192.168.0.104[root@localhost ~]#
2、Hadoop-0.19.0配置下载hadoop-0.19.0.tar.gz,大约是40.3M,解压缩到Linux系统指定目录,这里我的是/root/hadoop-0.19.2目录下。下面按照有序的步骤来说明配置过程:(1)修改hadoop-env.sh配置将Java环境的配置进行修改后,并取消注释“#”,修改后的行为:export JAVA_HOME=/usr/java/jdk1.6.0_16(2)修改hadoop-site.xml配置在&configuration&与&/configuration&加上3个属性的配置,修改后的配置文件内容为:&?xml version="1.0"?&&?xml-stylesheet type="text/xsl" href="configuration.xsl"?&&!-- Put site-specific property overrides in this file. --&&configuration&
&property&
&name&fs.default.name&/name&
&value&hdfs://localhost:9000&/value&
&/property&
&property&
&name&mapred.job.tracker&/name&
&value&localhost:9001&/value&
&/property&
&property&
&name&dfs.replication&/name&
&value&1&/value&
&/property&&/configuration&
3运行wordcount实例wordcount例子是hadoop发行包中自带的实例,通过运行实例可以感受并尝试理解hadoop在执行MapReduce任务时的执行过程。按照官方的“Hadoop Quick Start”教程基本可以容易地实现,下面简单说一下我的练习过程。导航到hadoop目录下面,我的是/root/hadoop-0.19.0。(1)格式化HDFS执行格式化HDFS的命令行:[root@localhost hadoop-0.19.2]# bin/hadoop namenode -format格式化执行信息如下所示:10/08/01 19:04:02 INFO namenode.NameNode: STARTUP_MSG:
Re-format filesystem in /tmp/hadoop-root/dfs/name ? (Y or N) yFormat aborted in /tmp/hadoop-root/dfs/name10/08/01 19:04:05 INFO namenode.NameNode: SHUTDOWN_MSG:
(2)启动Hadoop相关后台进程执行命令行:[root@localhost hadoop-0.19.2]# bin/start-all.sh启动执行信息如下所示:starting namenode, logging to /root/hadoop-0.19.0/bin/../logs/hadoop-root-namenode-localhost.outlocalhost: starting datanode, logging to /root/hadoop-0.19.0/bin/../logs/hadoop-root-datanode-localhost.outlocalhost: starting secondarynamenode, logging to /root/hadoop-0.19.0/bin/../logs/hadoop-root-secondarynamenode-localhost.outstarting jobtracker, logging to /root/hadoop-0.19.0/bin/../logs/hadoop-root-jobtracker-localhost.outlocalhost: starting tasktracker, logging to /root/hadoop-0.19.0/bin/../logs/hadoop-root-tasktracker-localhost.out(3)准备执行wordcount任务的数据首先,这里在本地创建了一个数据目录input,并拷贝一些文件到该目录下面,如下所示:[root@localhost hadoop-0.19.2]# mkdir input[root@localhost hadoop-0.19.2]# cp CHANGES.txt LICENSE.txt NOTICE.txt README.txt input/然后,将本地目录input上传到HDFS文件系统上,执行如下命令:[root@localhost hadoop-0.19.2]# bin/hadoop fs -put input/ input(4)启动wordcount任务执行如下命令行:[root@localhost hadoop-0.19.2]# bin/hadoop jar hadoop-0.19.2-examples.jar wordcount input output元数据目录为input,输出数据目录为output。任务执行信息如下所示:10/08/01 19:06:15 INFO mapred.FileInputFormat: Total input paths to process : 410/08/01 19:06:15 INFO mapred.JobClient: Running job: job__000210/08/01 19:06:16 INFO mapred.JobClient:
map 0% reduce 0%10/08/01 19:06:22 INFO mapred.JobClient:
map 20% reduce 0%10/08/01 19:06:24 INFO mapred.JobClient:
map 40% reduce 0%10/08/01 19:06:25 INFO mapred.JobClient:
map 60% reduce 0%10/08/01 19:06:27 INFO mapred.JobClient:
map 80% reduce 0%10/08/01 19:06:28 INFO mapred.JobClient:
map 100% reduce 0%10/08/01 19:06:38 INFO mapred.JobClient:
map 100% reduce 26%10/08/01 19:06:40 INFO mapred.JobClient:
map 100% reduce 100%10/08/01 19:06:41 INFO mapred.JobClient: Job complete: job__000210/08/01 19:06:41 INFO mapred.JobClient: Counters: 1610/08/01 19:06:41 INFO mapred.JobClient:
File Systems10/08/01 19:06:41 INFO mapred.JobClient:
HDFS bytes read=30148910/08/01 19:06:41 INFO mapred.JobClient:
HDFS bytes written=11309810/08/01 19:06:41 INFO mapred.JobClient:
Local bytes read=17400410/08/01 19:06:41 INFO mapred.JobClient:
Local bytes written=34817210/08/01 19:06:41 INFO mapred.JobClient:
Job Counters10/08/01 19:06:41 INFO mapred.JobClient:
Launched reduce tasks=110/08/01 19:06:41 INFO mapred.JobClient:
Launched map tasks=510/08/01 19:06:41 INFO mapred.JobClient:
Data-local map tasks=510/08/01 19:06:41 INFO mapred.JobClient:
Map-Reduce Framework10/08/01 19:06:41 INFO mapred.JobClient:
Reduce input groups=899710/08/01 19:06:41 INFO mapred.JobClient:
Combine output records=1086010/08/01 19:06:41 INFO mapred.JobClient:
Map input records=736310/08/01 19:06:41 INFO mapred.JobClient:
Reduce output records=899710/08/01 19:06:41 INFO mapred.JobClient:
Map output bytes=43407710/08/01 19:06:41 INFO mapred.JobClient:
Map input bytes=29987110/08/01 19:06:41 INFO mapred.JobClient:
Combine input records=3919310/08/01 19:06:41 INFO mapred.JobClient:
Map output records=3919310/08/01 19:06:41 INFO mapred.JobClient:
Reduce input records=10860(5)查看任务执行结果可以通过如下命令行:bin/hadoop fs -cat output/*执行结果,截取部分显示如下所示:vijayarenu
20violations.
1virtual 3vis-a-vis
1visible 1visit
1volume, 1volumes 2volumes.
9waiting 6waiting.
1warning 7warning,
12warnings.
3warranties
1warranty,
1(6)终止Hadoop相关后台进程执行如下命令行:[root@localhost hadoop-0.19.2]# bin/stop-all.sh执行信息如下所示:stopping jobtrackerlocalhost: stopping tasktrackerstopping namenodelocalhost: stopping datanodelocalhost: stopping secondarynamenode已经将上面列出的5个进程jobtracker、tasktracker、namenode、datanode、secondarynamenode异常分析在进行上述实践过程中,可能会遇到某种异常情况,大致分析如下:1、Call to localhost/127.0.0.1:9000 failed on local exception异常(1)异常描述可能你会在执行如下命令行的时候出现:[root@localhost hadoop-0.19.2]# bin/hadoop jar hadoop-0.19.0-examples.jar wordcount input output出错异常信息如下所示:10/08/01 19:50:55 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 0 time(s).10/08/01 19:50:56 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 1 time(s).10/08/01 19:50:57 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 2 time(s).10/08/01 19:50:58 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 3 time(s).10/08/01 19:50:59 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 4 time(s).10/08/01 19:51:00 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 5 time(s).10/08/01 19:51:01 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 6 time(s).10/08/01 19:51:02 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 7 time(s).10/08/01 19:51:03 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 8 time(s).10/08/01 19:51:04 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 9 time(s).java.lang.RuntimeException: java.io.IOException: Call to localhost/127.0.0.1:9000 failed on local exception: Connection refused
at org.apache.hadoop.mapred.JobConf.getWorkingDirectory(JobConf.java:323)
at org.apache.hadoop.mapred.FileInputFormat.setInputPaths(FileInputFormat.java:295)
at org.apache.hadoop.mapred.FileInputFormat.setInputPaths(FileInputFormat.java:268)
at org.apache.hadoop.examples.WordCount.run(WordCount.java:146)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.hadoop.examples.WordCount.main(WordCount.java:155)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:68)
at org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:141)
at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.RunJar.main(RunJar.java:165)
at org.apache.hadoop.mapred.JobShell.run(JobShell.java:54)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
at org.apache.hadoop.mapred.JobShell.main(JobShell.java:68)Caused by: java.io.IOException: Call to localhost/127.0.0.1:9000 failed on local exception: Connection refused
at org.apache.hadoop.ipc.Client.call(Client.java:699)
at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:216)
at $Proxy0.getProtocolVersion(Unknown Source)
at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:319)
at org.apache.hadoop.hdfs.DFSClient.createRPCNamenode(DFSClient.java:104)
at org.apache.hadoop.hdfs.DFSClient.&init&(DFSClient.java:177)
at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:74)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1367)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:56)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1379)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:215)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:120)
at org.apache.hadoop.mapred.JobConf.getWorkingDirectory(JobConf.java:319)
... 21 moreCaused by: java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:574)
at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:100)
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:299)
at org.apache.hadoop.ipc.Client$Connection.access$1700(Client.java:176)
at org.apache.hadoop.ipc.Client.getConnection(Client.java:772)
at org.apache.hadoop.ipc.Client.call(Client.java:685)
... 33 more(2)异常分析从上述异常信息分析,这句是关键:Retrying connect to server: localhost/127.0.0.1:9000.是说在尝试10次连接到“server”时都无法成功,这就说明到server的通信链路是不通的。我们已经在hadoop-site.xml中配置了namenode结点的值,如下所示:
&property&
&name&fs.default.name&/name&
&value&hdfs://localhost:9000&/value&
&/property&所以,很可能namenode进程根本就没有启动,更不必谈要执行任务了。上述异常,过程是:格式化了HDFS,但是没有执行bin/start-all.sh,直接启动wordcount任务,就出现上述异常。所以,应该执行bin/start-all.sh以后再启动wordcount任务。2、Input path does not exist异常(1)异常描述当你在当前hadoop目录下面创建一个input目录,并cp某些文件到里面,开始执行:[root@localhost hadoop-0.19.2]# bin/hadoop namenode -format[root@localhost hadoop-0.19.2]# bin/start-all.sh
这时候,你认为input已经存在,应该可以执行wordcount任务了:[root@localhost hadoop-0.19.2]# bin/hadoop jar hadoop-0.19.0-examples.jar wordcount input output结果抛出一堆异常,信息如下:org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://localhost:9000/user/root/input
at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:179)
at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:190)
at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:782)
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1127)
at org.apache.hadoop.examples.WordCount.run(WordCount.java:149)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.hadoop.examples.WordCount.main(WordCount.java:155)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:68)
at org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:141)
at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.RunJar.main(RunJar.java:165)
at org.apache.hadoop.mapred.JobShell.run(JobShell.java:54)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
at org.apache.hadoop.mapred.JobShell.main(JobShell.java:68)上述异常,我模拟的过程是:[root@localhost hadoop-0.19.2]# bin/hadoop fs -rmr inputDeleted hdfs://localhost:9000/user/root/input[root@localhost hadoop-0.19.2]# bin/hadoop fs -rmr outputDeleted hdfs://localhost:9000/user/root/output(2)异常分析本地的input目录并没有上传到HDFS上,所出现org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://localhost:9000/user/root/input只需要执行上传的命令即可:[root@localhost hadoop-0.19.2]# bin/hadoop fs -put input/ input
浏览: 494500 次
来自: 北京
endpoint=&/Hello/messagebr ...
rsrsdgrfdh坎坎坷坷
谢谢。不过说得有点太罗嗦了。
高!!!这叫看人说人话,看鬼讲鬼语,哈哈
技不足恃啊1、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
下载地址:
备注:下面是网上收集的收集的"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"。
2、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分布式文件上,可以互相对比意见文件是否已经上传成功。
3、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.
import java.io.IOE
import java.util.StringT
import org.apache.hadoop.conf.C
import org.apache.hadoop.fs.P
import org.apache.hadoop.io.IntW
import org.apache.hadoop.io.T
import org.apache.hadoop.mapreduce.J
import org.apache.hadoop.mapreduce.M
import org.apache.hadoop.mapreduce.R
import org.apache.hadoop.mapreduce.lib.input.FileInputF
import org.apache.hadoop.mapreduce.lib.output.FileOutputF
import org.apache.hadoop.util.GenericOptionsP
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之旅。
4、常见问题FAQ
4.1 "error: failure to login"问题
下面以网上找的"hadoop-0.20.203.0"为例,我在使用"V1.0"时也出现这样的情况,原因就是那个"hadoop-eclipse-plugin-1.0.0_V1.0.jar",是直接把源码编译而成,故而缺少相应的Jar包。具体情况如下
详细地址:
在我实践尝试中,发现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:
&&&&&&& 地址2:
&& 错误类型: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"问题
参考文献:
错误信息如下:
ERROR security.UserGroupInformation: PriviledgedActionException as: hadoop cause:java.io.IOException Failed to set permissions of path:\usr\hadoop\tmp\mapred\staging\hadoop\.staging to 0700 Exception in thread "main" java.io.IOException: Failed to set permissions of path: \usr\hadoop\tmp \mapred\staging\hadoop\.staging to 0700
解决方法:
Configuration conf = new Configuration();
conf.set("mapred.job.tracker", "[server]:9001");
& "[server]:9001"中的"[server]"为Hadoop集群Master的IP地址。
4.4 "hadoop mapred执行目录文件权"限问题
参考文献:
错误信息如下:
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------)
修改权限:
这样就能解决问题。
文章下载地址:
阅读(...) 评论()}

我要回帖

更多关于 hadoop 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信