如何使用eclipse调试hadoop远程调试作业

posts - 42,&
comments - 2,&
trackbacks - 0
  环境需求:  系统:window 10  eclipse版本:Mars  Hadoop版本:2.6.0
  资源需求:解压后的Hadoop-2.6.0,原压缩包自行下载:
  丑话前头说:
  以下的操作中,eclipse的启动均需要右键&管理员运行&!
  在创建MapReduce的Project那块需要配置log4j(级别是debug),否则打印不出一些调试的信息,从而不好找出错的原因。配置这个log4j很简单,大家可以在网上搜索一下,应该可以找得到相关的配置。
  1)首先需要利用ant编译自己的Hadoop-eclipse-plugin插件,你也可以自己网上搜索下载,我不喜欢用别人的东西,所以自己编译了一把,你们也可以参考我的另一篇博文,学着自己编译&&《》
  2)把编译好的Hadoop插件放到eclipse目录下的plugins下,然后重启eclipse
  3)打开window--&Preferences--&Hadoop Map/Reduce设置里面的Hadoop安装目录
  4)打开window--&Show View找到MapReduce Tools下的Map/Reduce Location,确定
  5)然后在eclipse的主界面就可以看到Map/Reduce Location的对话框了
  6)新建一个Hadoop Location,修改HDFS和yarn的主节点和端口,finish。
  7)这时,在eclipse的Project Explorer中会看到HDFS的目录结构&&DFS Locations
  注意:可能你打开这个目录结构的时候回存在权限问题(Premission),这是因为你在Hadoop的HDFS的配置文件hdfs-site.xml中没有配置权限(默认是true,意思是不能被集群外的节点访问HDFS文件目录),我们需要在这儿配置为false,重启hdfs服务,然后刷新上述dfs目录即可:
&property&
&name&dfs.permissions.enabled&/name&
&value&false&/value&
&/property&
  8)然后我们创建一个Map/Reduce Project,创建一个wordcount程序,我把Hadoop的README.txt传到/tmp/mrchor/目录下并改名为readme,输出路径为/tmp/mrchor/out。
package com.mrchor.HadoopDev.hadoopD
import java.io.IOE
import org.apache.hadoop.conf.C
import org.apache.hadoop.fs.P
import org.apache.hadoop.io.LongW
import org.apache.hadoop.io.T
import org.apache.hadoop.mapreduce.J
import org.apache.hadoop.mapreduce.M
import org.apache.hadoop.mapreduce.R
import org.apache.hadoop.mapreduce.lib.input.FileInputF
import org.apache.hadoop.mapreduce.lib.output.FileOutputF
public class WordCountApp {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, WordCountApp.class.getSimpleName());
job.setJarByClass(com.mrchor.HadoopDev.hadoopDev.WordCountApp.class);
// TODO: specify a mapper
job.setMapperClass(MyMapper.class);
// TODO: specify a reducer
job.setReducerClass(MyReducer.class);
// TODO: specify output types
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
// TODO: specify input and output DIRECTORIES (not files)
FileInputFormat.setInputPaths(job, new Path("hdfs://master:8020/tmp/mrchor/readme"));
FileOutputFormat.setOutputPath(job, new Path("hdfs://master:8020/tmp/mrchor/out"));
if (!job.waitForCompletion(true))
public static class MyMapper extends Mapper&LongWritable, Text, Text, LongWritable&{
Text k2 = new Text();
LongWritable v2 = new LongWritable();
protected void map(LongWritable key, Text value, Mapper&LongWritable, Text, Text, LongWritable&.Context context)
throws IOException, InterruptedException {
String[] split = value.toString().split(" ");
for (String word : split) {
k2.set(word);
v2.set(1);
context.write(k2, v2);
static class MyReducer extends Reducer&Text, LongWritable, Text, LongWritable&{
long sum = 0;
protected void reduce(Text k2, Iterable&LongWritable& v2s,
Reducer&Text, LongWritable, Text, LongWritable&.Context context) throws IOException, InterruptedException {
for (LongWritable one : v2s) {
sum+=one.get();
context.write(k2, new LongWritable(sum));
  9)右键Run As--&Run on Hadoop:
   A)注意:这边可能报错:
java.io.IOException: HADOOP_HOME or hadoop.home.dir are not set.
    这是因为你在安装eclipse的这台机子上没有配置Hadoop的环境变量,需要配置一下:
    一)右键&我的电脑&或者&此电脑&选择属性:进入到高级系统设置--&高级--&环境变量配置--&系统变量
      新建一个HADOOP_HOME,配置解压后的Hadoop-2.6.0的目录
    二)重启eclipse(管理员运行)
  10)继续运行wordcount程序,Run on Hadoop,可能会报如下错:
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/SI)Z
at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method)
at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:557)
at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:977)
at org.apache.hadoop.util.DiskChecker.checkAccessByFileMethods(DiskChecker.java:187)
at org.apache.hadoop.util.DiskChecker.checkDirAccess(DiskChecker.java:174)
at org.apache.hadoop.util.DiskChecker.checkDir(DiskChecker.java:108)
at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.confChanged(LocalDirAllocator.java:285)
at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:344)
at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:150)
at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:131)
at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:115)
at org.apache.hadoop.mapred.LocalDistributedCacheManager.setup(LocalDistributedCacheManager.java:131)
at org.apache.hadoop.mapred.LocalJobRunner$Job.&init&(LocalJobRunner.java:163)
at org.apache.hadoop.mapred.LocalJobRunner.submitJob(LocalJobRunner.java:731)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:536)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1296)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1293)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1293)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1314)
at com.mrchor.HadoopDev.hadoopDev.WordCountApp.main(WordCountApp.java:34)
  通过源码查看,发现在NativeIO.java有说明&&还是权限问题,可能是需要将当前电脑加入到HDFS授权的用户组:
* Checks whether the current process has desired access rights on
* the given path.
* Longer term this native function can be substituted with JDK7
* function Files#isReadable, isWritable, isExecutable.
* @param path input path
* @param desiredAccess ACCESS_READ, ACCESS_WRITE or ACCESS_EXECUTE
* @return true if access is allowed
* @throws IOException I/O exception on error
  但是,我们这边有一个更加巧妙的办法解决这个问题&&将源码中的这个文件复制到你的MapReduce的Project中,这个意思是程序在执行的时候回优先找你Project下的class作为程序的引用,而不会去引入的外部jar包中找:
  11)继续运行wordcount程序,这次应该程序可以执行了,结果为:
  如果得到上面这个结果,说明程序运行正确,打印出来的是MapReduce程序运行结果。我们再刷新目录,可以看到/tmp/mrchor/out目录下有两个文件&&_SUCCESS和part-r-00000:
  说明程序运行结果正确,此时,我们的eclipse远程调试Hadoop宣告成功!!!大家鼓掌O(&_&)O
阅读(...) 评论()7735人阅读
1)下载Eclipse
http://www.eclipse.org/downloads/
Eclipse Standard 4.3.2 64位
2) 下载hadoop版本对应的eclipse插件
我的hadoop是1.0.4,因此下载hadoop-eclipse-plugin-1.0.4.jar
下载地址:http://download.csdn.net/detail/m_star_jy_sy/7376169
3)安装hadoop插件
将hadoop-eclipse-plugin-1.0.4.jar拷贝到eclipse的plugins目录下即可
4)重启eclipse,检查hadoop插件是否加载成功
单击菜单:Window/Open Perspective/Others…弹出Open Perspective对话框,出现Map/Reduce即表示安装成功,见下图:
5)设置hadoop安装路径
选择菜单:Window/Preferences,弹出Preferences对话框,如下图所示:
选择Hadoop Map/Reduce ,设置Hadoop Install directory(Hadoop安装路径)。Hadoop的安装路径就是hadoop安装包hadoop-1.0.4.tar.gz解压缩后的路径
5)配置hadoop
选择菜单:Window/Show View/Other…,弹出Show View对话框。
在对话框中选择MapReduce Tools下的Map/Reduce Locations,打开Map/Reduce Locations视图。如下图所示:
在Map/Reduce Locations视图中,右键选择New Hadoop Location…菜单,弹出New Hadoop Location对话框,如下图所示:
在弹出的对话框中你需要配置Location name,如Hadoop,还有Map/Reduce Master和DFS Master。这里面的Host、Port分别为你在mapred-site.xml、core-site.xml中配置的地址及端口。UserName设置为运行hadoop的账号名,例如:hadoop。
配置完后退出。点击DFS Locations--&Hadoop如果能显示文件夹(2)说明配置正确,如果显示&拒绝连接&,请检查你的配置。
至此,环境基本搭建好了。下面就通过经典的WordCount例子来试验下了。
6)准备测试数据
在本地新建word.txt,内容如下:
java c++ python c
java c++ javascript
helloworld hadoop
mapreduce java hadoop hbase
通过copyFromLocal命令把本地的word.txt复制到HDFS上,命令如下:
$:hadoop fs -copyFromLocal /usr/hadoop/word.txt word.txt
本例假设word.txt存放在/usr/hadoop/目录下
7)新建hadoop项目
File--&New--&Other--&Map/Reduce Project
项目名可以随便取,如WordCount。 复制 hadoop安装目录src/example/org/apache/hadoop/example/WordCount.java到刚才新建的项目下面。
8)运行程序
右键单击WordCount项目,选择Run As--&RunConfigurations…,弹出Run Configurations对话框。如下图所示:
右键单击左边的Java Application,选择New菜单新建一个配置项,取名为Wordcount。在Arguments选项卡中设置Program arguments:为:
hdfs://192.168.0.19:9000/user/hadoop/word.txt
hdfs://192.168.0.19:9000/user/hadoop/out
第一行为输入文件,第二行为输出结果文件。
如果运行时报java.lang.OutOfMemoryError: Java heap space 配置VM arguments参数:
-Xms512m -Xmx1024m -XX:MaxPermSize=256m
设置完后,单击Run。
ERROR security.UserGroupInformation:
PriviledgedActionExceptionas:zhuming
cause:java.io.IOException: Failed to set permissions of path:\tmp\hadoop-zhuming\mapred\staging\zhuming\.staging to 0700
Exceptionin thread &main& java.io.IOException: Failed toset permissions of path:\tmp\hadoop-zhuming\mapred\staging\zhuming\.staging to 0700
解决方案:
下载hadoop-core-1.0.4-modified.jar替换到hadoop安装目录下的hadoop-core-1.0.4.jar文件
下载地址:http://download.csdn.net/detail/m_star_jy_sy/7376283
org.apache.hadoop.security.AccessControlException:org.apache.hadoop.security.AccessControlException: Permission denied:user=zhuming, access=WRITE,inode=&hadoop&:hadoop:supergroup:rwxr-xr-x
atsun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
因为Eclipse使用hadoop插件提交作业时,会默认以zhuming身份(windows当前用户)去将作业写入hdfs文件系统中,对应的也就是 HDFS上的/user/xxx , 我的为/user/hadoop,由于zhuming用户对user/hadoop目录并没有写入权限,所以导致异常的发生。
解决方法:
放开/user/hadoop目录的权限,命令如下:$ hadoop fs -chmod 777 /user/hadoop
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:164626次
积分:2313
积分:2313
排名:第12908名
原创:69篇
评论:28条
(2)(1)(2)(1)(1)(2)(1)(4)(1)(2)(1)(1)(1)(2)(3)(1)(2)(2)(3)(3)(1)(1)(2)(1)(1)(1)(1)(3)(2)(4)(13)(1)(1)(1)(2)(1)(1)(2)win7下Eclipse开发Hadoop应用程序环境搭建 -
- ITeye技术网站
博客分类:
写这篇文章只是大概记录一下,安装的步骤以及问题
安装hadoop步骤
1、实现linux的ssh无密码验证配置.(如果不是分布式模式,这一步其实可以不那么强求)
2、在linux下安装jdk,并配好环境变量
3、修改linux的机器名,并配置 /etc/hosts
4、在windows下下载hadoop 1.0.4(其他版本也行,但是这个版本是一个稳定版本),并修改hadoop-env.sh,core-site.xml,hdfs-site.xml,
mapred-site.xml,masters,slaves文件的配置
5、把修改好的hadoop整个文件夹传到linux下
6、把hadoop的bin加入到环境变量
7、格式化hadoop,启动hadoop
8、验证是否启动,并执行wordcount
9、eclipse 连接Linux下的Hadoop
这个顺序并不是一个写死的顺序,就得按照这个来,如果你知道原理,可以打乱顺序来操作,总之一句话,咱们的目的是为了将环境打起来,至于是你怎么搭的无所谓的了
现在一步步介绍
1、实现linux的ssh无密码验证配置
在我的 “Hadoop环境搭建(Eclipse+Linux)问题总结”一文中已有介绍,不再介绍
2、在linux下安装jdk,并配好环境变量
先在linux下面建一个目录用来安装jdk,我建的目录是 /usr/program,就是以后jdk安装到这个目录下面。
去下载一个linux下面的jdk版本,我的是jdk-6u6-linux-i586.bin, 也有-rpm.bin 结尾的,这种结尾的安装不如直接.bin的简单,这个怎么下,就不说了,网上一大堆的,下载1.6包括1.6以上的哦~~,然后用工具传到linux的 /usr/program这个目录下,就是刚才我新建的那个,上传工具好多,ftp也行,ssh 客户端也行.我用的是vmware tools.他支持Windows与虚拟机中的Linux系统相互拖拽,很是方便
登录到linux下,进入 /usr/program 目录下,发现多了一个文件,就是jdk-6u6-linux-i586.bin,
然后开始安装。
去 下载一个Linux Platform的JDK,建议下载RPM自解压格式的(RPM in self-extracting file,j2sdk-1_4_2_06-linux-i586-rpm.bin);
上载到Linux服务器上,在shell下执行命令:
[root@LinuxServer rpm]# chmod 755 j2sdk-1_4_2_06-linux-i586-rpm.bin[root@LinuxServer rpm]# ./j2sdk-1_4_2_06-linux-i586-rpm.bin
这时会有一段Sun的协议,敲几次空格键,当询问是否同意的时候,敲yes就可以了。
Sun Microsystems, Inc.
Binary Code License Agreement
for theJAVATM 2 SOFTWARE DEVELOPMENT KIT (J2SDK), STANDARDEDITION, VERSION 1.4.2_X…Do you agree to the above license terms? [yes or no]yesUnpacking...Checksumming...00Extracting...UnZipSFX 5.40 of 28 November 1998, by Info-ZIP (Zip-Bugs@lists.wku.edu).
inflating: j2sdk-1_4_2_06-linux-i586.rpm
程序会自动生成一个j2sdk-1_4_2_06-linux-i586.rpm文件,这是主程序包,下面来安装;
[root@LinuxServer rpm]#rpm –ivh j2sdk-1_4_2_06-linux-i586.rpmPreparing...
########################################### [100%]
########################################### [100%]
设置环境变量
开始配置环境变量
1)、执行 cd /etc, 进入/etc 目录下。
2)、执行 vi profile, 修改profile文件
在里面加入以下四行
export JAVA_HOME=/usr/program/jdk1.6.0_06
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib(后续也需要将hadoop的路径补上)
3)、执行 chmod +x profile ,把profile变成可执行文件
4)、执行 source profile,把profile里的内容执行生效
5)、执行,java、javac、java -version 查看是否安装成功.
3. 修改linux机器名
个人单机情况觉得这一步也不是必要的,反正我在这一部被弄得 很迷糊,最好放弃修改了
下面说说怎么修改redhat linux下的机器名,下面的方法只适合修改redhat的,别的版本改机器名不是这样的
1)、执行 cd /etc/sysconfig,进入/etc/sysconfig 目录下
2)、执行 vi network,修改network文件,
NETWORKING=yes
HOSTNAME=hadoopName
把HOSTNAME改成你想要的机器名,我改成了hadoopName,然后保存
3)、执行 cd
/etc,进入/etc 目录下
4)、执行vi hosts,修改hosts文件
# Do not remove the following line, or various programs
# that require network functionality will fail.
192.168.133.128
hadoopName hadoopName
localhost.localdomain localhost
默认是只有黑色字体内容,然后加上红色字体内容,第一个是自身ip,第二个network里的hostname名字,第三个一样。网上很多资料说hadoop安装要在 hosts里面加入 所有的集群机器的 ip
hostname 对,嗯,没错,因为笔者这是单机,所以就只加自己就行了。
5)、修改完后,执行hostname 就能看到自己新改的机器名了
4.在windows下下载hadoop 1.0.4,并修改hadoop-env.sh,core-site.xml,hdfs-site.xml,
mapred-site.xml,masters,slaves文件的配置(当然在linux下配置也是极好的,只是笔者习惯了在Windows下操作,才这么做的)
下载的过程自然不必说了,那么我们就直接来说说需要配置的这几个文件
解压下载后的文件,进入conf目录里面,
修改hadoop-env.sh文件,加入如下一行
export JAVA_HOME=/usr/program/jdk1.6.0_06
其实hadoop-env.sh里面有这一行,默认是被注释的,你只需要把注释去掉,并且把JAVA_HOME 改成你的java安装目录即可。
修改core-site.xml
默认的core-site.xml是如下这样的
version="1.0"
type="text/xsl" href="configuration.xsl"
&?xml version="1.0"?&
&?xml-stylesheet type="text/xsl" href="configuration.xsl"?&
&!-- Put site-specific property overrides in this file. --&
&configuration&
&/configuration&
现在要改成如下
version="1.0"
type="text/xsl" href="configuration.xsl"
hadoop.tmp.dir
/usr/local/hadoop/hadooptmp
A base for other temporary directories.
fs.default.name
hdfs://192.168.133.128:9000
The name of the default file system.
A URI whose
scheme and authority determine the FileSystem implementation.
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class.
The uri's authority is used to
determine the host, port, etc. for a filesystem.
&?xml version="1.0"?&
&?xml-stylesheet type="text/xsl" href="configuration.xsl"?&
&!-- Put site-specific property overrides in this file. --&
&configuration&
&property&
&name&hadoop.tmp.dir&/name&
&value&/usr/local/hadoop/hadooptmp&/value&
&description&A base for other temporary directories.&/description&
&/property&
&property&
&name&fs.default.name&/name&
&value&hdfs://192.168.133.128:9000&/value&
&description&The name of the default file system.
A URI whose
scheme and authority determine the FileSystem implementation.
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class.
The uri's authority is used to
determine the host, port, etc. for a filesystem.&/description&
&/property&
&/configuration&
修改hdfs-site.xml
默认的hdfs-site.xml是如下这样的
version="1.0"
type="text/xsl" href="configuration.xsl"
&?xml version="1.0"?&
&?xml-stylesheet type="text/xsl" href="configuration.xsl"?&
&!-- Put site-specific property overrides in this file. --&
&configuration&
&/configuration&
要改成如下这样的
version="1.0"
type="text/xsl" href="configuration.xsl"
dfs.replication
Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
&?xml version="1.0"?&
&?xml-stylesheet type="text/xsl" href="configuration.xsl"?&
&!-- Put site-specific property overrides in this file. --&
&configuration&
&property&
&name&dfs.replication&/name&
&value&1&/value&
&description&Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
&/description&
&/property&
&/configuration&
修改mapred-site.xml
默认的mapred-site.xml是如下这样的
version="1.0"
type="text/xsl" href="configuration.xsl"
&?xml version="1.0"?&
&?xml-stylesheet type="text/xsl" href="configuration.xsl"?&
&!-- Put site-specific property overrides in this file. --&
&configuration&
&/configuration&
要改成如下这样的
version="1.0"
type="text/xsl" href="configuration.xsl"
mapred.job.tracker
192.168.133.128:9001
The host and port that the MapReduce job tracker runs
If "local", then jobs are run in-process as a single map
and reduce task.
style="FONT-FAMILY: Verdana, Arial, Helvetica, sans- COLOR: #000000; FONT-SIZE: 12px"
&?xml version="1.0"?&
&?xml-stylesheet type="text/xsl" href="configuration.xsl"?&
&!-- Put site-specific property overrides in this file. --&
&configuration&
&property&
&name&mapred.job.tracker&/name&
&value&192.168.133.128:9001&/value&
&description&The host and port that the MapReduce job tracker runs
If "local", then jobs are run in-process as a single map
and reduce task.
&/description&
&/property&
&/configuration&
修改完这三个文件了,就一些注意的要点说一下
1)、其实core-site.xml 对应有一个core-default.xml, hdfs-site.xml对应有一个hdfs-default.xml,
mapred-site.xml对应有一个mapred-default.xml。这三个defalult文件里面都有一些默认配置,现在我们修改这三个site文件,目的就覆盖default里面的一些配置,
2)、hadoop分布式文件系统的两个重要的目录结构,一个是namenode上名字空间的存放地方,一个是datanode数据块的存放地方,还有一些其他的文件存放地方,这些存放地方都是基于hadoop.tmp.dir目录的,比如namenode的名字空间存放地方就是 ${hadoop.tmp.dir}/dfs/name, datanode数据块的存放地方就是 ${hadoop.tmp.dir}/dfs/data,所以设置好hadoop.tmp.dir目录后,其他的重要目录都是在这个目录下面,这是一个根目录。我设置的是 /usr/local/hadoop/hadooptmp,当然这个目录必须是存在的。
3)、fs.default.name,这个是设置namenode位于哪个机器上,端口号是什么hdfs://192.168.133.128:9000,格式一定要这样写,网上很多资料说ip地址写localhost也行,笔者建议最好写ip,因为后期讲到windows下 eclipse连接hadoop 的时候,如果写localhost,就会连接不到。
4)、mapred.job.tracker,这个是设置jobtracker位于哪个机器上,端口号是什么,192.168.133.128:9001,格式和上一个不一样,这个也必须这样写,同样localhost和ip的分别和上述一样
5)、dfs.replication,这个是设置数据块的复制次数,默认是3,因为笔者这里就一台机器,所以只能存在一份,就改成了1
然后修改 masters和slaves文件
master文件里就把集群中的namenode所在的机器ip,这里就写 192.168.133.128, 不要写localhost,写了localhost,windows 下eclipse 连接不到hadoop
slaves文件里就把集群中所有的nodedata所在的机器ip,这里就写192.168.133.128,因为这里是单机,同样最好别写localhost
5、把修改好的hadoop整个文件夹传到linux下
上述文件修改好之后,把haoop整个目录copy草linux下,记得建个目录放这个,我建的目录是 /usr/local/hadoop,把hadoop的整个目录copy到这个下面,然后就是这样的形式
6、把hadoop的bin加入到环境变量
把hadoop的执行命令加到环境变量里,这样就能直接在命令行里执行hadoop的命令了
操作跟把java的bin加入环境变量一样
1、执行 cd /etc, 进入/etc 目录下。
2、执行 vi profile, 修改profile文件
步骤跟JDK安装一样,只要将hadoop安装路径/bin加到classpath中即可
3、执行 chmod +x profile ,把profile变成可执行文件
4、执行 source profile,把profile里的内容执行生效
7、格式化hadoop,启动hadoop
格式化hadoop
在命令行里执行,hadoop namenode -format,
笔者在格式化的时候出现了一个错误 Invalid byte 2 of 2-byte UTF-8 sequence,经调查,是因为在修改那3个xml 的时候,用非utf-8 编码保存了,所以出错,用editplus打开从新以uft-8的形式保存,在上传到linux上,再执行 hadoop namenode -format 就行了,执行成功之后,去/usr/local/hadoop/hadooptmp 下会自动生成dfs文件夹,进去会有name文件夹,里面还有别的其他namenode上保存名字空间的文件
启动hadoop
在命令行里执行执行start-dfs.sh,再执行start-mapred.sh。
如果SSH没有设置免密码登陆,这一步就得需要手工的输入密码。
在命令行里输入 jps,如果出现一下内容,则说明启动成功。
[root@hadoopName ~]# jps
4505 NameNode
4692 SecondaryNameNode
4756 JobTracker
4854 TaskTracker
4592 DataNode
启动之后,在/usr/local/hadoop/hadooptmp 下的dfs文件夹里会生成 data目录,这里面存放的是datanode上的数据块数据,因为笔者用的是单机,所以name 和 data 都在一个机器上,如果是集群的话,namenode所在的机器上只会有name文件夹,而datanode上只会有data文件夹。
执行 hadoop fs -ls命令,查看当前hdfs分布式文件系统的 文件目录结构,刚执行会说no such dictionary,
你要先建一个文件夹,用命令 haoop fs -mkdir testdir ,然后再执行hadoop fs -ls,就会展示/user/root/testdir
当前用户是root,所以hdfs的根目录就是
/user/root
8、执行wordcount
hadoop安装成功了,来执行一下自带的例子,
执行之前要有输入 输出目录,
建立输入目录: hadoop fs -mkdir input
在这个目录里放入文件:hadoop fs -put /usr/test_in/*.txt
input(把本地/usr/test_in目录里的所有txt文件copy到 hdfs分布式文件系统的 /user/root/input 目录里面,因为当前目录就是root 所以 直接写input 就代表/user/root/input)
进入 /usr/local/hadoop/hadoop1.0.4目录下,
执行 hadoop jar hadoop-1.0.4examples.jar wordcount
input ouput
执行完毕之后,执行hadoop fs -ls output,会发现如下
[root@hadoopName hadoop-1.0.4# hadoop fs -ls output
Found 2 items
drwxr-xr-x
- root supergroup
05:20 /user/root/output/_logs
-rw-r--r--
1 root supergroup
-08 05:21 /user/root/output/part-r-00000
用命令 hadoop fs -cat output/part-r-00000 查看这个part-r-00000文件的内容,会看到执行的结果。
至此hadoop在redhat上的安装就结束了,也学这里写的不够详细,如果有兴趣的朋友,可以来交流,(*^__^*) 嘻嘻……,下面我们来看看,在windows上怎么通过eclipse连接我们刚才安装好的hadoop,在linux下就可以查看hdfs分布式文件系统的目录结构,并能在eclipse调试刚才的wordcount程序。
9、eclipse 连接Linux下的Hadoop
环境及配置:
Eclipse选择
非常重要,、我在网上查了相关资料,有人说需要3.3版本以上的才可以,恰好本人电脑上时3.4,一试就成功了,非常的开心呐
Hadoop Eclipse插件
不建议使用Hadoop自带的,不好用,我下了一个hadoop-eclipse-plugin-1.0.4.jar。非常好用。下载后,将jar包放到Eclipse安装目录下的plugins包下,重启Eclipse即可。
以下内容摘自别人的blog,基本上跟我 的操作是一样的
打开Eclipse
如果在Project Explorer中出现DFS Locations图标(需点击open perspective,选择MapReduce),则说明安装正确,如图:
③ 之后,点击Windows--&Preferrence--&hadoop map/reduce, Brower 选择下载的hadoop所在的路径:
④ 配置相关参数,点击 Windows--&Show View --&Other --& Map/Reduce Location,打开Hadoop的MapReduce View
点击Ok之后,出现如下图
⑤ 上一步你不应该看到hadoopLoc, 应该什么都没有,右键点击空白处--&New Hadoop Location, 你会看到一个填写MapReduce Location参数的一个界面:
PS:HOST 的ip地址需与你在dfs-core.xml中设置的一致
Location Name:
这个不用在意,就是对这个MapReduce的标示,只要能帮你记忆即可
Map/Reduce Master 部分相关定义:
Host:上一节搭建的集群中JobTracker所在的机器的IP地址
port:JobTracker的端口
两个参数就是 mapred-site.xml中mapred.job.tracker的ip和端口
DFS Master部分:
Host:就是上一节集群搭建中Namenode所在机器IP
Port:就是namenode的端口
这两个参数是在 core-site.xml里fs.default.name里面的ip和端口
User Name:
就是搭建Hadoop集群是所用的用户名,我这里用的是root
⑥ 填写完以上信息以后,关闭Eclipse,然后重新启动。
为什么这么做呢?因为如果不重新启动,Advanced Parameters里,有些重要的选项不能显示,重启后,来配制Advanced Parameters信息:
可看到大部分选项都已经预设值好了,其中有一下几个选项,必须注意填写,其他的选项,要么默认,要么会根据我们填写的以下几个选项自动修改:
dfs.replication:
这个这里默认是3,但是要根据你的Datanode的个数来定,如果你仅有2个datanode,那么就写2,如果只有一个,就写1,大于或者等于3个,写3
hadoop.tmp.dir:
这个要跟上节建立的Hadoop集群配置中core-site.xml 中的hadoop.tmp.dir设置一样,上节填写的是/tmp/hadoop-root,这里也如是填写
hadoop.job.ugi:
填成root,Tardis,其中root是我们的用户名,后边的",Tardis"一定要这么写,不能改
这些都填写完了之后,点击保存,重新启动Eclipse,会发现,很多Advanced Parameters里的好多选项都根据hadoop.tmp.dir重新进行了设置。
hadoop1.0.3之后这个选项就没有了,此选项没有了,如果不设置,就会出现以下错误
Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=d, access=WRITE, inode="data":zxg:supergroup:rwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:207)
解决方法:
管理DFS system目录。目前做法是将hadoop服务集群关闭权限认证,修改hadoop安装
集群master的hadoop/conf/mapred-site.xml,增加:(实际应用中这个方法不可取啊,文章最后我们有介绍其他的方式)
dfs.permissions
正式发布时,可以在服务器创建一个和hadoop集群用户名一致的用户,即可不用修改master的permissions策略。
⑦ 重新启动后,在Project Explorer中,会有如下显示:
注意,第一次初始化打开,并不会有user, input, output 这些文件夹,之后红圈圈出的部分,也没有job_local_0001(1).如果是这样显示说明你已经连接成功,否则,展开所有tmp文件夹,会发现最后有错误信息提示。
注意:如果连接不上,有可能是由于linux设置的防火墙有关
<span style="color: #.10.26修改:
hadoop1.0.3此时还会出错,是plugin中jar包不够,可做如下修改:
1.打开Eclipse Plugins中的hadoop-eclipse-plugin-1.0.0.jar,发现只有发现只有commons-cli-1.2.jar和hadoop-core.jar两个包,将%HADOOP_HOME%/lib下的 commons-configuration-1.6.jar , commons-httpclient-3.0.1.jar , commons-lang-2.4.jar , jackson-core-asl-1.8.8.jar 和 jackson-mapper-asl-1.0.8.jar五个jar包打入hadoop-eclipse-plugin-1.0.0.jar中。
2.修改hadoop-eclipse-plugin-1.0.0.jar中META-INF目录下的MANIFEST.MF,将classpath修改为以下内容:Bundle-ClassPath: classes/,lib/hadoop-core.jar,lib/commons-cli-1.2.jar,lib/commons-httpclient-3.0.1.jar,lib/jackson-core-asl-1.0.1.jar,lib/jackson-mapper-asl-1.0.1.jar,lib/commons-configuration-1.6.jar,lib/commons-lang-2.4.jar
3.重启Eclipse即可。
⑧ 在Eclipse中编写调试第一个Hadoop的HelloWorld程序:wordcount
建立Map/Reduce 工程
定义WordCount.Java类
这里,我下载了Hadoop源码,直接拷贝了其WordCount.java文件,代码如下:
package org.apache.hadoop.
import java.io.IOE
import java.util.StringT
import org.apache.hadoop.conf.C
import org.apache.hadoop.fs.P
import org.apache.hadoop.io.IntW
import org.apache.hadoop.io.T
import org.apache.hadoop.mapreduce.J
import org.apache.hadoop.mapreduce.M
import org.apache.hadoop.mapreduce.R
import org.apache.hadoop.mapreduce.lib.input.FileInputF
import org.apache.hadoop.mapreduce.lib.output.FileOutputF
import org.apache.hadoop.util.GenericOptionsP
public class WordCount {
public static class TokenizerMapper extends
Mapper&Object, Text, Text, IntWritable& {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer itr = new StringTokenizer(line);
while (itr.hasMoreTokens()) {
word.set(itr.nextToken().toLowerCase());
context.write(word, one);
public static class IntSumReducer extends
Reducer&Text, IntWritable, Text, IntWritable& {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable&IntWritable& values,
Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
result.set(sum);
context.write(key, new IntWritable(sum));
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args)
.getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount &in& &out&");
System.exit(2);
Job job = new Job(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
为了使程序成功运行,我们需要做一下工作
设置输入:
在命令行中,像hadoop中添加一个文本文件:
hadoop fs -mkdir /input
#在HDFS用户根目录下建立input文件夹 (我的位置是/user/root/input/)
hadoop fs -put test.txt /input/ #向input文件夹里放入所在路径的test.txt文件(我的位置是 /user/root/output2/)
该步骤也可以在Eclipse中建立,首先右键点击Project Explorer中大象图标下第一个没有名字的文件夹,点击 Create New Directory,创建input文件夹,后再右键该文件夹,上传test.txt文件。此时到hadoop DFS中查看,也会发现创建成功。
Eclipse中设置输入参数
设置WordCount.java的执行参数如图
下图的位置信息不对啊,应该是:/user/root/input/ /user/root/output2/
在Eclipse中执行
如图,点击 Run on Hadoop
在控制台,会有以下输出
OK,至此,Congratulations,你已经建立起自己在Windows中Eclipse下进行Hadoop MapReduce开发的基本环境设置工作,并且输出了一个属于自己的HelloWorld程序,并且稍微了解了一些hadoop日志分析的信息,你已经开始进入Hadoop的世界,剩下的,就是要不断地深入学习了。(本部分内容转自,中间加了一点自己搭建是遇到的情况)
Eclipse 连接hadoop一些错误的处理方式:
 这时如果我们运行MaxTemperature类,会报如下错:
12/04/24 15:32:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 12/04/24 15:32:44 ERROR security.UserGroupInformation: PriviledgedActionException as:Administrator cause:java.io.IOException: Failed to set permissions of path: \tmp\hadoop-Administrator\mapred\staging\Administrator-\.staging to 0700 Exception in thread "main" java.io.IOException: Failed to set permissions of path: \tmp\hadoop-Administrator\mapred\staging\Administrator-\.staging to 0700
  这个是Windows下文件权限问题,在Linux下可以正常运行,不存在这样的问题。  解决方法是,修改hadoop-1.0.4/src/core/org/apache/hadoop/fs/FileUtil.java里面的checkReturnValue,注释掉即可(有些粗暴,在Window下,可以不用检查):  重新编译打包hadoop-core-1.0.4.jar,替换掉hadoop-1.0.4根目录下的hadoop-core-1.0.4.jar即可。(我重新打包的时候出了点问题,就直接以从网上下载的hadoop-core-1.0.2.jar代替hadoop-core-1.0.4.jar了,这样也可以正常运行,下载地址:)  (其实还有另一种简单的办法,我们只需要把hadoop-1.0.4/src/core/org/apache/hadoop/fs/FileUtil.java修改之后重新编译过的class文件加入到原来的hadoop-core-1.0.4.jar包中代替原来的FileUtil.class文件即可,这里有一个已经做好的适合于windows环境的hadoop-core-1.0.4.jar包了,你可以直接)
还有一种最简单的处理方式:
在代码中加入:Configuration conf = new Configuration();
conf.set("mapred.job.tracker", "server:9001");
"server:9001"中的server"为Hadoop集群Master的IP地址。
  另外,我还遇到了这么一个错误:
org.apache.hadoop.security.AccessControlException:Permission denied:user=Administrator,access=WRITE,inode="tmp":root:supergroup:rwxr-xr-x 。
  这个错误有些蹊跷,因为我已经在map/reduce locations中配置了用户名是hadoop(hadoop就是我linux上运行hadoop集群的用户名),不知道它为什么还是以Administrator用户身份来方位hadoop的,解决办法如下:
  问题原因:本地用户administrator(本机windows用户)想要远程操作hadoop系统,没有权限引起的。
解决办法:
a、如果是测试环境,可以取消hadoop hdfs的用户权限检查。打开conf/hdfs-site.xml,找到dfs.permissions属性修改为false(默认为true)OK了。
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
浏览 25800
February30thCF
浏览: 53422 次
来自: 北京
Eclipse中设置输入参数设置WordCount.java的 ...
WARN util.NativeCodeLoader: Una ...
crazywen2011 写道哥们是用什么画的?我也是从别人拿 ...
哥们是用什么画的?

我要回帖

更多关于 eclipse 使用hadoop 的文章

 

随机推荐