先列出本机环境:
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,内容如下
classes Desktop file01 file02 hadoop-0.20.203.0 wordcount.jar WordCount.java
Hello World Bye World
Hello Hadoop Goodbye Hadoop
启动hadoop,在hadoop中创建input文件夹
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2011-11-23 05:20 /user/hadoop/input
把file01、file02上传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
要想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
本人亲自实践,希望能对初学者有所帮助,大家相互交流,共同进步。