http://blog.csdn.net/caoshichaocaoshichao/article/details/15493819
1、安装Hadoop开发插件
hadoop安装包contrib/目录下有个插件hadoop-1.2.1-eclipse-plugin.jar,拷贝到eclipse根目录下/dropins目录下。
2、 启动eclipse,打开Perspective:
【Window】->【Open Perspective】->【Other...】->【Map/Reduce】->【OK】
3、 打开一个View:
【Window】->【Show View】->【Other...】->【MapReduce Tools】->【Map/Reduce Locations】->【OK】
4、 添加Hadoop location:
location name: 我填写的是:amber-hadoop.
Map/Reduce Master 这个框里
Host:就是jobtracker 所在的集群机器,这里写192.168.1.121
Hort:就是jobtracker 的port,这里写的是9001
这两个参数就是mapred-site.xml里面mapred.job.tracker里面的ip和port
DFS Master 这个框里
Host:就是namenode所在的集群机器,这里写192.168.1.121
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的用户名,因为我是用grid用户安装的hadoop,而且没建立其他的用户,所以就用grid。
然后点击finish按钮,此时,这个视图中就有多了一条记录。
重启myeclipse并重新编辑刚才建立的那个连接记录,现在我们编辑advance parameters tab页(这里要根据hadoop环境conf目录下文件里面配置一致)
(重启编辑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,然后就连接上了(先要启动sshd服务,启动hadoop进程),连接上的标志如图:
5、新建Map/Reduce Project:
【File】->【New】->【Project...】->【Map/Reduce】->【Map/Reduce Project】->【Project name: WordCount】->【Configure Hadoop install directory...】->【Hadoop installation directory: F:\hadoop-1.2.1】->【Apply】->【OK】->【Next】->【Allow output folders for source folders】->【Finish】
6、新建WordCount类:
第一个错误
13/11/04 20:42:53 INFO file.FileUtile: Read File :F:\Workspaces\MyEclipse 10\FileTest\src\tf.txt
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890abcdefghijklmnopqrst1234567890
13/11/04 20:42:53 INFO file.FileUtile: Read Contetn size 130
Exception in thread "main" org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create /user/grid/in/hw.txt. Name node is in safe mode.
The reported blocks is only 5 but the threshold is 0.9990 and the total blocks 8. Safe mode will be turned off automatically.
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInternal(FSNamesystem.java:1561)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:1527)
at org.apache.hadoop.hdfs.server.namenode.NameNode.create(NameNode.java:710)
at org.apache.hadoop.hdfs.server.namenode.NameNode.create(NameNode.java:689)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
在主节点处,关闭掉安全模式,当然你等待下一些时间等备份复制完毕,这个错误也会消失的
#bin/hadoop dfsadmin –safemode leav
第二个错误:
org.apache.hadoop.security.AccessControlException:Permission denied:user=SEVEN,access=WRITE,inode="tmp":root:supergroup:rwxr-xr-x 。
问题原因:本地用户SEVEN(本机windows用户)想要远程操作hadoop系统,没有权限引起的。
解决办法:
a、如果是测试环境,可以取消hadoop hdfs的用户权限检查。打开conf/hdfs-site.xml,找到dfs.permissions属性修改为false(默认为true)OK了。
<property>
<name>dfs.permissions</name>
<value>false</value>
<description>
If "true", enable permission checking in HDFS.
If "false", permission checking is turned off,
but all other behavior is unchanged.
Switching from one parameter value to the other does not change the mode,
owner or group of files or directories.
</description>
</property>
b、修改hadoop location参数,在advanced parameter选项卡中,找到hadoop.job.ugi项,将此项改为启动hadoop的用户名即可。(注意第一次设置的时候可能没有hadoop.job.ugi参数,报错后在去看就有了,或者关闭重启之后。)
c、因为Eclipse使用hadoop插件提交作业时,会默认以 DrWho 身份去将作业写入hdfs文件系统中,对应的也就是 HDFS 上的/user/hadoop , 由于 DrWho 用户对hadoop目录并没有写入权限,所以导致异常的发生。解决方法为:放开 hadoop 目录的权限 , 命令如下 :$ hadoop fs -chmod 777
我是用直接把windows用户改成grid用户
运行成功后的结果如下所示:
第三个错误
13/11/04 21:33:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
13/11/04 21:33:34 ERROR security.UserGroupInformation: PriviledgedActionException as:grid cause:java.io.IOException: Failed to set permissions of path: \home\grid\hadoop-1.2.1\tmp\mapred\staging\grid1670184777\.staging to 0700
Exception in thread "main" java.io.IOException: Failed to set permissions of path: \home\grid\hadoop-1.2.1\tmp\mapred\staging\grid1670184777\.staging to 0700
at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:691)
at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:664)
at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:514)
at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:349)
at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:193)
at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:126)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:942)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:936)
出现不能在HDFS里面创建文件.权限问题
修改了
F:\hadoop-1.2.1\src\core\org\apache\hadoop\fs
中的FileUtil.java,checkReturnValue 里面内容注释掉
重新编译打包hadoop-core-1.2.1.jar,替换掉hadoop-1.2.1根目录下的hadoop-core-1.2.1.jar即可。
当然也和我一样小白,编译打包不成功的,直接下载个免权限的hadoop-core-1.2.1.jar即可.我会放附件上
第四个错误
13/11/05 18:25:53 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
13/11/05 18:25:53 INFO mapred.JobClient: Cleaning up the staging area file:/home/grid/hadoop-1.2.1/tmp/mapred/staging/grid489274882/.staging/job_local489274882_0001
13/11/05 18:25:53 ERROR security.UserGroupInformation: PriviledgedActionException as:grid causerg.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://h1:9000/user/grid/out already exists
Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://h1:9000/user/grid/out already exists
at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:137)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:973)
这个只要在hdfs里的目录指定新的目录,或者删除原有目录就ok
第五问题 ,上修改完毕之后再次运行结果又出错了
13/11/05 18:36:41 INFO mapred.MapTask: Processing split: hdfs://h1:9000/user/grid/in/test1.txt:0+12
13/11/05 18:36:41 INFO mapred.MapTask: io.sort.mb = 100
13/11/05 18:36:41 INFO mapred.LocalJobRunner: Map task executor complete.
13/11/05 18:36:41 WARN mapred.LocalJobRunner: job_local1365353611_0001
java.lang.Exception: java.lang.OutOfMemoryError: Java heap space
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:354)
Caused by: java.lang.OutOfMemoryError: Java heap space
1、在D:/apache-tomcat-6.0.18/bin/catalina.bat最前面加入:set JAVA_OPTS=-Xms384m -Xmx384m
注意:只有startup.bat启动tomcat,设置才能生效,如果利用windows的系统服务启动tomcat服务,上面的设置就不生效了,
就是说set JAVA_OPTS=-Xms384m -Xmx384m没起作用
2、在Eclilpse中修改启动参数,在VM arguments 加入了-Xms384m -Xmx384m,设置如下图所示
3. 单独为某个程序设置内存大小.eclipse里默认的一个程序的jvm配置为:-Xms8m -Xmx128m,所以我们的处理耗内存比较大时需要手动调整一下,以便不会内存溢出。具体的设置方法为:
选中被运行的类,点击菜单‘Run as ->Open Run Dialog...’,选择(x)=Argument标签页下的vm arguments框里输入 -Xmx512m, 保存运行就ok了
我是用了第三种方法
运行结果通过
13/11/05 18:48:02 INFO mapred.JobClient: SPLIT_RAW_BYTES=508
13/11/05 18:48:02 INFO mapred.JobClient: Reduce input records=12
13/11/05 18:48:02 INFO mapred.JobClient: Reduce input groups=11
13/11/05 18:48:02 INFO mapred.JobClient: Combine output records=12
13/11/05 18:48:02 INFO mapred.JobClient: Reduce output records=11
13/11/05 18:48:02 INFO mapred.JobClient: Map output records=12