ubuntu系统下eclipse配置hadoop开发环境并运行wordcount程序
2016-06-15 00:00
881 查看
先列出本机环境:
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,内容如下
[hadoop@localhost~]$ ls
classes Desktop file01 file02 hadoop-0.20.203.0 wordcount.jar WordCount.java
[hadoop@localhost~]$ cat file01
Hello World Bye World
[hadoop@localhost~]$ cat file02
Hello Hadoop Goodbye Hadoop
启动hadoop,在hadoop中创建input文件夹
[hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop dfs -ls
[hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop dfs -mkdir input
[hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop dfs -ls
Found 1 items
把file01、file02上传input中
[hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop fs -put file01 input
[hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop fs -put file02 input
[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
运行成功后控制台显示如下:
然后Disconnect DFS locations后可以看到ouput文件夹
可以将part-r-00000下载到本地查看结果,也可以进入终端用命令查看。
$ hadoop-0.20.203.0/bin/hadoop fs -cat output/part-r-00000
结果如下:
至此,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
本人亲自实践,希望能对初学者有所帮助,大家相互交流,共同进步。
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,内容如下
[hadoop@localhost~]$ ls
classes Desktop file01 file02 hadoop-0.20.203.0 wordcount.jar WordCount.java
[hadoop@localhost~]$ cat file01
Hello World Bye World
[hadoop@localhost~]$ cat file02
Hello Hadoop Goodbye Hadoop
启动hadoop,在hadoop中创建input文件夹
[hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop dfs -ls
[hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop dfs -mkdir input
[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中
[hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop fs -put file01 input
[hadoop@localhost~]$ hadoop-0.20.203.0/bin/hadoop fs -put file02 input
[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
本人亲自实践,希望能对初学者有所帮助,大家相互交流,共同进步。
相关文章推荐
- 25个Java机器学习工具&库
- java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
- 使用JDK开发WebService
- 如何导入MAVEN项目到MyEclipse中
- Hadoop2.2.0 HA + Jdk1.8.0 + Zookeeper3.4.5 + Hbase0.98 集群搭建详细过程(服务器集群)
- Spring JPA经验汇总
- spring对数据库的操作
- Java中Properties类的操作
- Jimoshi_Struts2 框架学习(三)--valueStack和ognl、struts2验证、struts2文件上传和下载
- Spring整合rabbitmq
- Windows配置Java开发环境
- eclipse中某工程的断点进不去问题,折腾了N个小时才找到原因,郁闷
- JSON 在java中的使用Json
- java笔记—多线程编程 Thread
- Eclipse背景颜色修改
- java笔记—封装、继承、多态[面向对象的三大特性]
- Struts2环境配置
- Java web项目开发需要掌握哪些技术?
- Java四种读取和创建XML文档的例子
- java笔记—List、Set、Map集合