在本机windows下,通过eclispe连接到linux虚拟机上安装好的haoop,进行开发调试


linux上装好hadoop之后,可以等陆到linux上通过hadoop的shell命令查看hadoop的 hdfs文件系统,执行写好的mapreduce程序,但是这样会很不方便,我们通常 的做法是在windows下开发程序,调试成功之后,再发布到linux上执行,这一部分就是来分享一下如何配置windows下的eclipse,可以链接到linux下的hadoop。
配置过程如下:

1、在eclipse下安装开发hadoop程序的插件

2、插件安装后,配置一下连接参数

3、写一个wordcount的程序,在eclipse里执行

4、聊聊注意事项

5、一些错误分析


一、在eclipse下安装开发hadoop程序的插件
安装这个插件很简单,在上面提到过下载hadoop0.20.2,这个下载的haoop0.20.2自带一个eclipse的插件,在hadoop目录下的 contrib\eclipse-plugin\hadoop-0.20.2-eclipse-plugin.jar,把这个文件copy到 eclipse的eclipse\plugins目录下,然后重启就算完成安装了,这里说一下,这个hadoop-0.20.2-eclipse-plugin.jar安装在3.2版本上是不行的,笔者亲自试验过,装上之后没反应,要必须安装在3.3以上的版本,笔者是安装到了eclipse-jee-europa-winter-win32(java开发工具).ZIP,europa 版本,这europa版本可以到网上下载,网上还有很多说IBM开发的 MapReduce tools插件,这个和haoop自带的插件用法不一样,笔者没研究那个,只是觉得haoop自带的插件挺好用。

安装成功之后的标志如图:

1、在左边的 project explorer 上头会有一个 DFS locations的标志



 
2、在 windows -> preferences里面会多一个hadoop map/reduce的选项,选中这个选项,然后右边,把下载的hadoop根目录选中
 



 
 

如果能看到以上两点说明安装成功了


二、插件安装后,配置一下连接参数

插件装完了,就可以建一个连接了,就相当于eclipse里配置一个 weblogic的连接

 

第一步 如图所示,打开Map/Reduce Locations 视图,在右上角有个大象的标志点击



 

第二步,在点击大象后弹出的对话框进行进行参数的添加,如下图

 




location name: 这个随便填写,笔者填写的是:hadoop.

 

map/reduce master 这个框里

host:就是jobtracker 所在的集群机器,笔者这里是单机伪分布式,jobtracker就在这个机器上,所以填上这个机器的ip

port:就是jobtracker 的port,这里写的是9001

 

这两个参数就是 mapred-site.xml里面mapred.job.tracker里面的ip和port

 

 

DFS master这个框里

host:就是namenode所在的集群机器,笔者这里是单机伪分布式,namenode就在这个机器上,所以填上这个机器的ip。

port:就是namenode的port,这里写9000

 

这两个参数就是 core-site.xml里fs.default.name里面的ip和port(use M\R master host,这个复选框如果选上,就默认和map\reduce master 这个框里的 host一样,如果不选择,就可以自己定义输入,这里jobtracker 和namenode在一个机器上,所以是一样的,就勾选上)

 

 

username:这个是连接hadoop的用户名,因为笔者是在linux中用root用户安装的hadoop,而且没建立其他的用户,所以就用root。

 

下面的不用填写。

 

然后点击 finish按钮,此时,这个视图中就有多了一条记录,

 

第三步,重启eclipse,然后重启完毕之后,重新编辑刚才建立的那个连接记录,如图,第二步里面我们是填写的General,tab页,现在我们编辑advance parameters tab页。



 

读者可能问,为什么不在第二步里直接把这个tab页 也编辑了,这是因为,新建连接的时候,这个advance paramters  tab页面的一些属性显示不出来,显示不出来也就没法设置,(这个有点 不好哇~~,应该显示出来,免得又重启一次,小小鄙视一下~ 哇咔咔~),必须重启一下eclipse 再进来编辑才能看到。

 

这里大部门属性都已经自动填写上了,读者可以看到,这里其实就是把core-defaulte.xml,hdfs-defaulte.xml,mapred-defaulte.xml里面的一些配置属性展示在这,因为我们安装hadoop的时候,还在site系列配置文件里有改动,所以这里也要弄成一样的设置。主要关注的有以下属性

 

fs.defualt.name:这个在General tab页已经设置了。

mapred.job.tracker:这个在General tab页也设置了。

 

dfs.replication:这个这里默认是3,因为我们再hdfs-site.xml里面设置成了1,所以这里也要设置成1

hadoop.tmp.dir:这个默认是/tmp/hadoop-{user.name},因为我们在ore-defaulte.xml 里hadoop.tmp.dir设置的是/usr/local/hadoop/hadooptmp,所以这里我们也改成/usr/local/hadoop/hadooptmp,其他基于这个目录属性也会自动改

 

hadoop.job.ugi:刚才说看不见的那个,就是这个属性,这里要填写:root,Tardis,逗号前面的是连接的hadoop的用户,逗号后面就写死Tardis。

 

然后点击finish,然后就连接上了,连接上的标志如图:

 



DFS Locations下面会有一只大象,下面会有一个文件夹(2) 这个就是 hdfs的根目录,这里就是展示的分布式文件系统的目录结构。

 

 

 

三、写一个wordcount的程序,在eclipse里执行

在这个eclipse里建一个map\reduce 工程,如图

 



 

叫exam,然后在这个工程下面建个java类如下

 

第一个,MyMap.java

 

Java代码   收藏代码
  1. package org;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.StringTokenizer;  
  5.   
  6. import org.apache.hadoop.io.IntWritable;  
  7. import org.apache.hadoop.io.Text;  
  8. import org.apache.hadoop.mapreduce.Mapper;  
  9.   
  10. public class MyMap extends Mapper<Object, Text, Text, IntWritable> {  
  11.     private final static IntWritable one = new IntWritable(1);  
  12.   
  13.     private Text word;  
  14.   
  15.     public void map(Object key, Text value, Context context)  
  16.             throws IOException, InterruptedException {  
  17.   
  18.         String line = value.toString();  
  19.         StringTokenizer tokenizer = new StringTokenizer(line);  
  20.         while (tokenizer.hasMoreTokens()) {  
  21.             word = new Text();  
  22.             word.set(tokenizer.nextToken());  
  23.             context.write(word, one);  
  24.         }  
  25.     }  
  26. }  

 

第二个,MyReduce.java

 

 

Java代码   收藏代码
  1. package org;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.hadoop.io.IntWritable;  
  6. import org.apache.hadoop.io.Text;  
  7. import org.apache.hadoop.mapreduce.Reducer;  
  8.   
  9. public class MyReduce extends  
  10.         Reducer<Text, IntWritable, Text, IntWritable> {  
  11.     public void reduce(Text key, Iterable<IntWritable> values, Context context)  
  12.             throws IOException, InterruptedException {  
  13.         int sum = 0;  
  14.         for (IntWritable val : values) {  
  15.             sum += val.get();  
  16.         }  
  17.         context.write(key, new IntWritable(sum));  
  18.     }  
  19. }  

 

第三个,MyDriver.java

 

 

Java代码   收藏代码
  1. package org;  
  2.   
  3. import org.apache.hadoop.conf.Configuration;  
  4. import org.apache.hadoop.fs.Path;  
  5. import org.apache.hadoop.io.IntWritable;  
  6. import org.apache.hadoop.io.Text;  
  7. import org.apache.hadoop.mapreduce.Job;  
  8. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  9. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;  
  10. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  11. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;  
  12.   
  13. public class MyDriver {  
  14.   
  15.       
  16.     public static void main(String[] args) throws Exception,InterruptedException {  
  17.         Configuration conf=new Configuration();  
  18.           
  19.        Job job=new Job(conf,"Hello Hadoop");  
  20.          
  21.        job.setJarByClass(MyDriver.class);           
  22.         
  23.        job.setMapOutputKeyClass(Text.class);      
  24.        job.setMapOutputValueClass(IntWritable.class);  
  25.          
  26.        job.setOutputKeyClass(Text.class);  
  27.        job.setOutputValueClass(IntWritable.class);  
  28.          
  29.        job.setMapperClass(MyMap.class);  
  30.         job.setCombinerClass(MyReduce.class);  
  31.         job.setReducerClass(MyReduce.class);  
  32.           
  33.         job.setInputFormatClass(TextInputFormat.class);            
  34.         job.setOutputFormatClass(TextOutputFormat.class);          
  35.           
  36.         FileInputFormat.setInputPaths(job, new Path(args[0]));  
  37.           
  38.         FileOutputFormat.setOutputPath(job, new Path(args[1]));  
  39.       // JobClient.runJob(conf);  
  40.        job.waitForCompletion(true);  
  41.        }  
  42.   
  43. }  
 

这三个类都是基于最新的 hadoop0.20.0的,

 

 

注意了,这一步非常关键,笔者折腾了半天才想明白,是在windows下的一些设置,进入C:\Windows\System32\drivers\etc  目录,打开 hosts文件 加入:192.168.133.128  hadoopName

ip是我linux的机器ip,hadoopName是linux的机器名,这个一定要加,不然,会出错,这里其实就是把master的ip和机器名加上了

 

 

然后设置MyDriver类的 执行参数,也就是输入,输出参数,和在linux下的一样,要指定输入的文件夹,和输出的文件夹

如图:



 

 

 input 就是文件存放路径,outchen就是mapReduce 之后处理的数据 输出文件夹

 

 

然后run on hadoop 如图

 



 

控制台打印如下信息:

 

Java代码   收藏代码
  1. 11/05/14 19:08:07 WARN conf.Configuration: 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  
  2. 11/05/14 19:08:08 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.  
  3. 11/05/14 19:08:08 INFO input.FileInputFormat: Total input paths to process : 4  
  4. 11/05/14 19:08:09 INFO mapred.JobClient: Running job: job_201105140203_0002  
  5. 11/05/14 19:08:10 INFO mapred.JobClient:  map 0% reduce 0%  
  6. 11/05/14 19:08:35 INFO mapred.JobClient:  map 50% reduce 0%  
  7. 11/05/14 19:08:41 INFO mapred.JobClient:  map 100% reduce 0%  
  8. 11/05/14 19:08:53 INFO mapred.JobClient:  map 100% reduce 100%  
  9. 11/05/14 19:08:55 INFO mapred.JobClient: Job complete: job_201105140203_0002  
  10. 11/05/14 19:08:55 INFO mapred.JobClient: Counters: 17  
  11. 11/05/14 19:08:55 INFO mapred.JobClient:   Job Counters   
  12. 11/05/14 19:08:55 INFO mapred.JobClient:     Launched reduce tasks=1  
  13. 11/05/14 19:08:55 INFO mapred.JobClient:     Launched map tasks=4  
  14. 11/05/14 19:08:55 INFO mapred.JobClient:     Data-local map tasks=4  
  15. 11/05/14 19:08:55 INFO mapred.JobClient:   FileSystemCounters  
  16. 11/05/14 19:08:55 INFO mapred.JobClient:     FILE_BYTES_READ=2557  
  17. 11/05/14 19:08:55 INFO mapred.JobClient:     HDFS_BYTES_READ=3361  
  18. 11/05/14 19:08:55 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=5260  
  19. 11/05/14 19:08:55 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=1688  
  20. 11/05/14 19:08:55 INFO mapred.JobClient:   Map-Reduce Framework  
  21. 11/05/14 19:08:55 INFO mapred.JobClient:     Reduce input groups=192  
  22. 11/05/14 19:08:55 INFO mapred.JobClient:     Combine output records=202  
  23. 11/05/14 19:08:55 INFO mapred.JobClient:     Map input records=43  
  24. 11/05/14 19:08:55 INFO mapred.JobClient:     Reduce shuffle bytes=2575  
  25. 11/05/14 19:08:55 INFO mapred.JobClient:     Reduce output records=192  
  26. 11/05/14 19:08:55 INFO mapred.JobClient:     Spilled Records=404  
  27. 11/05/14 19:08:55 INFO mapred.JobClient:     Map output bytes=5070  
  28. 11/05/14 19:08:55 INFO mapred.JobClient:     Combine input records=488  
  29. 11/05/14 19:08:55 INFO mapred.JobClient:     Map output records=488  
  30. 11/05/14 19:08:55 INFO mapred.JobClient:     Reduce input records=202  

 说明执行成功,

 

去看一下,会多一个outchen目录,里面放着执行的结果,和在普通的linux上执行的一样。

 

 

四、聊聊注意事项

      1、在安装hadoop的时候 core-site.xml 和 mapred.site.xml里面的 fs.defulate.name,和 mapred.job.tracker那个一定要写ip地址,不要写localhost,虽然是单机,也不能写localhost,要写本机的ip,不然eclipse连接不到。

 

     2、masters 和 slaves文件里也要写ip,不要写localhost

 

 

五、一些错误分析

1、出现如图所示

 

 




 
或者执行代码的时候,控制台如下信息
Java代码   收藏代码
  1. 11/05/08 21:41:37 WARN conf.Configuration: 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  
  2. job new ֮ǰ-----------------------------------  
  3. 11/05/08 21:41:40 INFO ipc.Client: Retrying connect to server: /192.168.133.128:9001. Already tried 0 time(s).  
  4. 11/05/08 21:41:42 INFO ipc.Client: Retrying connect to server: /192.168.133.128:9001. Already tried 1 time(s).  
  5. 11/05/08 21:41:44 INFO ipc.Client: Retrying connect to server: /192.168.133.128:9001. Already tried 2 time(s).  
  6. 11/05/08 21:41:46 INFO ipc.Client: Retrying connect to server: /192.168.133.128:9001. Already tried 3 time(s).  
  7. 11/05/08 21:41:48 INFO ipc.Client: Retrying connect to server: /192.168.133.128:9001. Already tried 4 time(s).  
  8. 11/05/08 21:41:50 INFO ipc.Client: Retrying connect to server: /192.168.133.128:9001. Already tried 5 time(s).  
  9. 11/05/08 21:41:52 INFO ipc.Client: Retrying connect to server: /192.168.133.128:9001. Already tried 6 time(s).  
  10. 11/05/08 21:41:54 INFO ipc.Client: Retrying connect to server: /192.168.133.128:9001. Already tried 7 time(s).  
  11. 11/05/08 21:41:56 INFO ipc.Client: Retrying connect to server: /192.168.133.128:9001. Already tried 8 time(s).  
  12. 11/05/08 21:41:58 INFO ipc.Client: Retrying connect to server: /192.168.133.128:9001. Already tried 9 time(s).  
  13. Exception in thread "main" java.net.ConnectException: Call to /192.168.133.128:9001 failed on connection exception: java.net.ConnectException: Connection refused: no further information  
  14.     at org.apache.hadoop.ipc.Client.wrapException(Client.java:767)  
  15.     at org.apache.hadoop.ipc.Client.call(Client.java:743)  
  16.     at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:220)  
  17.     at org.apache.hadoop.mapred.$Proxy0.getProtocolVersion(Unknown Source)  
  18.     at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:359)  
  19.     at org.apache.hadoop.mapred.JobClient.createRPCProxy(JobClient.java:429)  
  20.     at org.apache.hadoop.mapred.JobClient.init(JobClient.java:423)  
  21.     at org.apache.hadoop.mapred.JobClient.<init>(JobClient.java:410)  
  22.     at org.apache.hadoop.mapreduce.Job.<init>(Job.java:50)  
  23.     at org.apache.hadoop.mapreduce.Job.<init>(Job.java:54)  
  24.     at org.apache.hadoop.examples.WordCount.main(WordCount.java:59)  
  25. Caused by: java.net.ConnectException: Connection refused: no further information  
  26.     at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)  
  27.     at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)  
  28.     at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)  
  29.     at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:404)  
  30.     at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:304)  
  31.     at org.apache.hadoop.ipc.Client$Connection.access$1700(Client.java:176)  
  32.     at org.apache.hadoop.ipc.Client.getConnection(Client.java:860)  
  33.     at org.apache.hadoop.ipc.Client.call(Client.java:720)  
  34.     ... 9 more  
 
出现以上错误的时候,原因可能有:a、hadoop没起来没有启动导致的,b、就是连接不对,看看core-site.xml 和mapred-site.xml里面的 ip 是否写成 localhost了,写成localhost是连接不到的,必须写成ip。
读者也可以看到如果连接成功 那个文件夹的(2)而不是 文件夹(1)

2、如果出现一下错误
Java代码   收藏代码
  1. 11/05/14 20:08:26 WARN conf.Configuration: 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  
  2. 11/05/14 20:08:46 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.  
  3. Exception in thread "main" java.net.UnknownHostException: unknown host: hadoopName  
  4.     at org.apache.hadoop.ipc.Client$Connection.<init>(Client.java:195)  
  5.     at org.apache.hadoop.ipc.Client.getConnection(Client.java:850)  
  6.     at org.apache.hadoop.ipc.Client.call(Client.java:720)  
  7.     at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:220)  
  8.     at $Proxy1.getProtocolVersion(Unknown Source)  
  9.     at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:359)  
  10.     at org.apache.hadoop.hdfs.DFSClient.createRPCNamenode(DFSClient.java:106)  
  11.     at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:207)  
  12.     at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:170)  
  13.     at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:82)  
  14.     at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1378)  
  15.     at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:66)  
  16.     at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1390)  
  17.     at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:196)  
  18.     at org.apache.hadoop.fs.Path.getFileSystem(Path.java:175)  
  19.     at org.apache.hadoop.mapred.JobClient.getFs(JobClient.java:463)  
  20.     at org.apache.hadoop.mapred.JobClient.configureCommandLineOptions(JobClient.java:567)  
  21.     at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:761)  
  22.     at org.apache.hadoop.mapreduce.Job.submit(Job.java:432)  
  23.     at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:447)  
  24.     at org.MyDriver.main(MyDriver.java:40)  
 就说明刚才那个
C:\Windows\System32\drivers\etc  目录,打开 hosts文件 加入:192.168.133.128  hadoopName,在hosts文件里写入这个就行了,要重启机器才行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值