ubuntu系统下eclipse配置hadoop开发环境并运行wordcount程序

先列出本机环境:

ubuntu 12

eclipse 3.6

hadoop 1.1.2

ubuntu12环境下hadoop1.1.2伪分布式配置成功,然后用Ant编译eclipse hadoop plugin插件,接下来就是eclipse hadoop开发环境配置了。具体的操作如下:

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

将编译好的hadoop-1.1.2-eclipse-plugin.jar拷贝到eclipse的eclipse\plugins目录下,重启eclipse完成安装,安装成功的标志:

1、在Windows->Open Prespective->Other中有Map/Reduce选项,选中它点击OK,在左边的 project explorer 上头会有一个 DFS locations的标志

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

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

点击windows->show view->other选择Map/Reduce Locations

在eclipse下面会看到大象标志,鼠标放在上面显示New Hadoop Location...

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

location name: 这个随便填写,我填写的是:localhost.
Map/Reduce Master 这个框里
Host:就是jobtracker 所在的集群机器,这里写localhost
Port:就是jobtracker 的port,这里写的是9001
这两个参数就是mapred-site.xml里面mapred.job.tracker里面的ip和port  
DFS Master 这个框里
Host:就是namenode所在的集群机器,这里写localhost
Port:就是namenode的port,这里写9000
这两个参数就是core-site.xml里面fs.default.name里面的ip和port
(Use M/R master host,这个复选框如果选上,就默认和Map/Reduce Master这个框里的host一样,如果不选择,就可以自己定义输入,这里jobtracker 和namenode在一个机器上,所以是一样的,就勾选上
 user name:这个是连接hadoop的用户名,因为我是用hadoop用户安装的hadoop,而且没建立其他的用户,所以就用hadoop。
下面的不用填写。
然后点击finish按钮,此时,这个视图中就有多了一条记录。

重启eclipse并重新编辑刚才建立的那个连接记录,如图现在我们编辑advance parameters tab页

(重启编辑advance parameters 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 
然后点击finish,然后就连接上了,连接上的标志如图

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

到这里为止,Eclipse hadoop开发环境配置已经完全搭建完毕。

三、在eclispe中运行wordcount

新建Map/Reduce工程:file->open->othe在对话框选择MapReduce project,然后next...

将hadoop安装包中的wordcount.java拷到src下,暂时离开eclipse。

然后打开终端创建2个文件file01、file02,内容如下

  1. [hadoop@localhost~]$ ls  

classes  Desktop file01  file02  hadoop-0.20.203.0  wordcount.jar WordCount.java


  1. [hadoop@localhost~]$ cat file01  

Hello World Bye World


  1. [hadoop@localhost~]$ cat file02  

Hello Hadoop Goodbye Hadoop

启动hadoop,在hadoop中创建input文件夹

  1. [hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop dfs -ls  
  2.   
  3. [hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop dfs -mkdir input  
  4.   
  5. [hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop dfs -ls  

Found 1 items

drwxr-xr-x   - hadoop supergroup          0 2011-11-23 05:20 /user/hadoop/input

把file01、file02上传input中

  1. [hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop fs -put file01 input  
  2.   
  3. [hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop fs -put file02 input  
  4.   
  5. [hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop fs -ls input  

Found 2 items

-rw-r--r--   1 hadoop supergroup         22 2011-11-23 05:22/user/hadoop/input/file01

-rw-r--r--   1 hadoop supergroup         28 2011-11-23 05:22/user/hadoop/input/file02


转回eclipse界面。选中DFS locations 右击选择Disconnect然后可以看到上传的两个文件


要想wordcount在hadoop上运行,那么必须为wordcount程序指定输入路径和输出路径。输入路径是我们要进行词频统计的文本文件,在这里我们的文件名是file01,file02。而输出路径是词频统计结果存放的路径。如下图所示,是进行参数配置:WordCount.java->右键->Run As->Run Configuration,在argument选项卡中配置wordcount的参数,即测试文件和输出文件夹的位置,中间用空格隔开,本人是配置是hdfs://localhost:9000/user/hadoop/input hdfs://localhost:9000/user/hadoop/output,运行完毕后在output文件夹中查看结果。


完成输入输出路径以后,我们点击Apply,但是这个时候不能点击Run,因为这里的run是指在单机上run,而我们是要在hadoop集群上run,因此我们点击close然后执行以下步骤:WordCount.java->右键->Run as->Run on hadoop


点击finish运行。

使用Eclipse进行hadoop的程序编写,然后Run on hadoop 后,可能出现如下错误org.apache.hadoop.security.AccessControlException:org.apache.hadoop.security.AccessControlException: Permissiondenied: user=mango, access=WRITE,inode="hadoop"/inode="tmp":hadoop:supergroup:rwxr-xr-x

因为Eclipse使用hadoop插件提交作业时,会默认以 mango 身份去将作业写入hdfs文件系统中,对应的也就是 HDFS上的/user/xxx , 我的为/user/zcf ,   由于 mango用户对hadoop目录并没有写入权限,所以导致异常的发生。

提供的解决方法为:放开 hadoop 目录的权限 , 命令如下:

$cd /usr/local/hadoop

$ bin/hadoop fs -chmod 777 /user/hadoop

运行成功后控制台显示如下:

13/06/30 14:17:01 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
13/06/30 14:17:01 INFO input.FileInputFormat: Total input paths to process : 2
13/06/30 14:17:01 WARN snappy.LoadSnappy: Snappy native library not loaded
13/06/30 14:17:01 INFO mapred.JobClient: Running job: job_local_0001
13/06/30 14:17:02 INFO util.ProcessTree: setsid exited with exit code 0
13/06/30 14:17:02 INFO mapred.Task:  Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@1e903d5
13/06/30 14:17:02 INFO mapred.MapTask: io.sort.mb = 100
13/06/30 14:17:02 INFO mapred.MapTask: data buffer = 79691776/99614720
13/06/30 14:17:02 INFO mapred.MapTask: record buffer = 262144/327680
13/06/30 14:17:02 INFO mapred.MapTask: Starting flush of map output
13/06/30 14:17:02 INFO mapred.MapTask: Finished spill 0
13/06/30 14:17:02 INFO mapred.Task: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
13/06/30 14:17:02 INFO mapred.LocalJobRunner: 
13/06/30 14:17:02 INFO mapred.Task: Task 'attempt_local_0001_m_000000_0' done.
13/06/30 14:17:02 INFO mapred.Task:  Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@c01e99
13/06/30 14:17:02 INFO mapred.MapTask: io.sort.mb = 100
13/06/30 14:17:02 INFO mapred.MapTask: data buffer = 79691776/99614720
13/06/30 14:17:02 INFO mapred.MapTask: record buffer = 262144/327680
13/06/30 14:17:02 INFO mapred.MapTask: Starting flush of map output
13/06/30 14:17:02 INFO mapred.MapTask: Finished spill 0
13/06/30 14:17:02 INFO mapred.Task: Task:attempt_local_0001_m_000001_0 is done. And is in the process of commiting
13/06/30 14:17:02 INFO mapred.LocalJobRunner: 
13/06/30 14:17:02 INFO mapred.Task: Task 'attempt_local_0001_m_000001_0' done.
13/06/30 14:17:02 INFO mapred.Task:  Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@31f2a7
13/06/30 14:17:02 INFO mapred.LocalJobRunner: 
13/06/30 14:17:02 INFO mapred.Merger: Merging 2 sorted segments
13/06/30 14:17:02 INFO mapred.Merger: Down to the last merge-pass, with 2 segments left of total size: 73 bytes
13/06/30 14:17:02 INFO mapred.LocalJobRunner: 
13/06/30 14:17:02 INFO mapred.Task: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting
13/06/30 14:17:02 INFO mapred.LocalJobRunner: 
13/06/30 14:17:02 INFO mapred.Task: Task attempt_local_0001_r_000000_0 is allowed to commit now
13/06/30 14:17:02 INFO output.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to hdfs://localhost:9000/user/hadoop/output
13/06/30 14:17:02 INFO mapred.LocalJobRunner: reduce > reduce
13/06/30 14:17:02 INFO mapred.Task: Task 'attempt_local_0001_r_000000_0' done.
13/06/30 14:17:02 INFO mapred.JobClient:  map 100% reduce 100%
13/06/30 14:17:02 INFO mapred.JobClient: Job complete: job_local_0001
13/06/30 14:17:02 INFO mapred.JobClient: Counters: 22
13/06/30 14:17:02 INFO mapred.JobClient:   File Output Format Counters 
13/06/30 14:17:02 INFO mapred.JobClient:     Bytes Written=31
13/06/30 14:17:02 INFO mapred.JobClient:   FileSystemCounters
13/06/30 14:17:02 INFO mapred.JobClient:     FILE_BYTES_READ=18047
13/06/30 14:17:02 INFO mapred.JobClient:     HDFS_BYTES_READ=116
13/06/30 14:17:02 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=214050
13/06/30 14:17:02 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=31
13/06/30 14:17:02 INFO mapred.JobClient:   File Input Format Counters 
13/06/30 14:17:02 INFO mapred.JobClient:     Bytes Read=46
13/06/30 14:17:02 INFO mapred.JobClient:   Map-Reduce Framework
13/06/30 14:17:02 INFO mapred.JobClient:     Map output materialized bytes=81
13/06/30 14:17:02 INFO mapred.JobClient:     Map input records=2
13/06/30 14:17:02 INFO mapred.JobClient:     Reduce shuffle bytes=0
13/06/30 14:17:02 INFO mapred.JobClient:     Spilled Records=12
13/06/30 14:17:02 INFO mapred.JobClient:     Map output bytes=78
13/06/30 14:17:02 INFO mapred.JobClient:     Total committed heap usage (bytes)=681639936
13/06/30 14:17:02 INFO mapred.JobClient:     CPU time spent (ms)=0
13/06/30 14:17:02 INFO mapred.JobClient:     SPLIT_RAW_BYTES=222
13/06/30 14:17:02 INFO mapred.JobClient:     Combine input records=8
13/06/30 14:17:02 INFO mapred.JobClient:     Reduce input records=6
13/06/30 14:17:02 INFO mapred.JobClient:     Reduce input groups=4
13/06/30 14:17:02 INFO mapred.JobClient:     Combine output records=6
13/06/30 14:17:02 INFO mapred.JobClient:     Physical memory (bytes) snapshot=0
13/06/30 14:17:02 INFO mapred.JobClient:     Reduce output records=4
13/06/30 14:17:02 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=0
13/06/30 14:17:02 INFO mapred.JobClient:     Map output records=8

然后Disconnect DFS locations后可以看到ouput文件夹

可以将part-r-00000下载到本地查看结果,也可以进入终端用命令查看。

$ hadoop-0.20.203.0/bin/hadoop fs -cat output/part-r-00000 
结果如下:

Bye    2
Hadoop    2
Hello    2
World    2

至此,eclipse下的WordCount实例运行结束,如果还想重新运行一遍,这需把output文件夹删除或者修改Run Configuration中arguments中的output路径,因为hadoop为了保证结果的正确性,存在输出的文件夹的话,就会报异常,异常如下

Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists


本人亲自实践,希望能对初学者有所帮助,大家相互交流,共同进步。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值