超详细hadoop与eclipse开发环境设置.docx
《超详细hadoop与eclipse开发环境设置.docx》由会员分享,可在线阅读,更多相关《超详细hadoop与eclipse开发环境设置.docx(22页珍藏版)》请在冰点文库上搜索。
超详细hadoop与eclipse开发环境设置
hadoop搭建与eclipse开发环境设置
――罗利辉
1.前言
1.1目标
目的很简单,为进行研究与学习,帮忙初学者快速搭建hadoop环境,部署一个hadoop运行环境,并搭建一个hadoop开发与测试环境。
具体目标是:
✓在ubuntu系统上部署hadoop
✓在windows上能够使用eclipse连接ubuntu系统上部署的hadoop进行开发与测试
1.2软硬件要求
硬件要求:
三台普通PC。
当然使用虚拟机也可以,本环境搭建也是VMWare6.5虚拟机上进行的。
软件要求:
操作系统:
ubuntu11.04server。
Hadoop版本:
hadoop-0.20.2
Eclipse版本:
3.3.2
Java版本:
1.6.0_26(必须1.6以上)
注意:
机器的台数最好为奇数,偶数的话有可能遇到不可预知的问题!
Hadoop版本和Eclipse版本请严格按照要求。
现在的hadoop最新版本是hadoop-0.20.203,我在windows上使用eclipse(包括3.6版本和3.3.2版本)连接ubuntu上的hadoop-0.20.203环境一直没有成功。
但是开发测试程序是没有问题的,不过需要注意权限问题。
如果要减少权限问题的发生,可以这样做:
ubuntu上运行hadoop的用户与windows上的用户一样。
1.3环境拓扑图
主机名
Hadoop角色
Hadoopjps命令结果
Hadoop用户
Hadoop安装目录
ubuntu
Master
slaves
NameNode
DataNode
JobTracker
TaskTracker
SecondaryNameNode
创建相同的用户的组名:
hadoop。
安装hadoop-0.20.2时使用hadoop用户,并且hadoop的文件夹归属也是hadoop:
hadoop
/opt/hadoop
Ubuntu1
slaves
DataNode
TaskTracker
Ubuntu2
slaves
DataNode
TaskTracker
Windows
开发测试环境
安装了jdk与eclipse,本身不需要安装hadoop,但是需要hadoop安装包下面的jar包。
注意:
ubuntu既是NameNode又是DataNode,同时也是JobTracker。
2.Ubuntu安装
安装ubuntu11.04server系统,具体略。
我是先在虚拟机上安装一个操作系统,然后把hadoop也安装配置好了,再克隆二份,然后把主机名与IP修改,再进行主机之间的SSH配置。
如果仅作为hadoop的运行与开发环境,不需要安装太多的系统与网络服务,或者在需要的时候通过apt-getinstall进行安装。
不过SSH服务是必须的。
3.Hadoop安装
以下的hadoop安装以主机ubuntu下进行安装为例。
3.1下载安装jdk1.6
安装版本是:
jdk-6u26-linux-i586.bin,我把它安装拷贝到:
/opt/jdk1.6.0_26
3.2下载解压hadoop
安装包是:
hadoop-0.20.2.tar.gz。
$tar–zxvfhadoop-0.20.2.tar.gz
$mvhadoop-0.20.2/opt/hadoop
3.3修改系统环境配置文件
切换为根用户。
●修改环境配置文件/etc/profile,加入:
exportJAVA_HOME=/opt/jdk1.6.0_26
exportJRE_HOME=/opt/jdk1.6.0_26/jre
exportCLASSPATH=.:
$JAVA_HOME/lib:
$JRE_HOME/lib:
$CLASSPATH
exportPATH=$JAVA_HOME/bin:
$JRE_HOME/bin:
$PATH
exportHADOOP_HOME=/opt/hadoop
exportPATH=$HADOOP_HOME/bin:
$PATH
●修改地址解析文件/etc/hosts,加入
192.168.69.231ubuntu
192.168.69.232ubuntu1
192.168.69.233ubuntu2
3.4修改hadoop的配置文件
切换为hadoop用户。
●修改hadoop目录下的conf/hadoop-env.sh文件
加入java的安装根路径:
exportJAVA_HOME=/opt/jdk1.6.0_26
●把hadoop目录下的conf/core-site.xml文件修改成如下:
xmlversion="1.0"?
>
xml-stylesheettype="text/xsl"href="configuration.xsl"?
>
--Putsite-specificpropertyoverridesinthisfile.-->
hadoop.tmp.dir
/hadoop
Abaseforothertemporarydirectories.
fs.default.name
hdfs:
//ubuntu:
9000
Thenameofthedefaultfilesystem.AURIwhose
schemeandauthoritydeterminetheFileSystemimplementation.The
uri'sschemedeterminestheconfigproperty(fs.SCHEME.impl)naming
theFileSystemimplementationclass.Theuri'sauthorityisusedto
determinethehost,port,etc.forafilesystem.
dfs.hosts.exclude
excludes
dfs.name.dir
/hadoop/name
DetermineswhereonthelocalfilesystemtheDFSnamenodeshouldstorethenametable.Ifthisisacomma-delimitedlistofdirectoriesthenthenametableisreplicatedinallofthedirectories,forredundancy.
●把hadoop目录下的conf/hdfs-site.xml文件修改成如下:
xmlversion="1.0"?
>
xml-stylesheettype="text/xsl"href="configuration.xsl"?
>
--Putsite-specificpropertyoverridesinthisfile.-->
dfs.data.dir
/hadoop/data
DetermineswhereonthelocalfilesystemanDFSdatanodeshouldstoreitsblocks.Ifthisisacomma-delimitedlistofdirectories,thendatawillbestoredinallnameddirectories,typicallyondifferentdevices.Directoriesthatdonotexistareignored.
dfs.replication
3
Defaultblockreplication.Theactualnumberofreplicationscanbespecifiedwhenthefileiscreated.Thedefaultisusedifreplicationisnotspecifiedincreatetime.
●把hadoop目录下的conf/mapred-site.xml文件修改成如下:
xmlversion="1.0"?
>
xml-stylesheettype="text/xsl"href="configuration.xsl"?
>
--Putsite-specificpropertyoverridesinthisfile.-->
mapred.job.tracker
ubuntu:
9001
ThehostandportthattheMapReducejobtrackerrunsat.If"local",thenjobsarerunin-processasasinglemapandreducetask.
注意:
别忘了hadoop.tmp.dir,dfs.name.dir,dfs.data.dir参数,hadoop存放数据文件,名字空间等的目录,格式化分布式文件系统时会格式化这个目录。
这里指向了/hadoop,所以也要创建这个目录,并且用户归属也是hadoop:
hadoop。
●把hadoop目录下的conf/masters文件修改成如下:
ubuntu
●把hadoop目录下的conf/slaves文件修改成如下:
ubuntu
ubuntu1
ubuntu2
3.5分发hadoop安装文件
我使用VMWare的克隆功能,将主机ubuntu完全克隆两份:
ubuntu1和ubuntu2,并修改相应的主机名和IP地址,这样就可以简单地保持hadoop环境基本配置相同。
如果是安装在实体物理机上,把在ubuntu安装的jdk,系统配置文件/etc/host,/etc/profile,hadoop安装目录拷贝到ubuntu1和ubuntu2相应的目录。
3.6SSH配置无密码验证配置
切换到Hadoop用户,在Hadoop家目录下面创建.ssh目录:
$cd
$mkdir.ssh
在master节点(即主机ubuntu)上生成密钥对:
$ssh-keygen–trsa
然后一直按[Enter]键,按默认的选项生成密钥对保存在.ssh/id_rsa文件中。
然后执行命令:
$ssh~/.ssh
$cpid_rsa.pubauthorized_keys
$scpauthorized_keysubuntu1:
/home/hadoop/.ssh
$scpauthorized_keysubuntu2:
/home/hadoop/.ssh
从ubuntu向ubuntu1和ubuntu2发起SSH连接,第一次登录时需要输入密码,以后就不需要了。
$sshubuntu1
$sshubuntu2
我们只需要配置从master向slaves发起SSH连接不需要密码就可以了,但这样只能在master(即在主机ubuntu)启动或关闭hadoop服务。
3.7运行hadoop
使用Hadoop用户。
首先说明,hadoop命令和参数都是大小写敏感的,该用大写时用大写,用小写时用小写,否则会执行错误。
格式化分布式文件系统:
$hadoopnamenode-format
在ubuntu上启动hadoop守护进行:
$start-all.sh
停止hadoop守护进程是:
$stop-all.sh
在ubuntu上查看运行的进程:
$jps
2971SecondaryNameNode
3043JobTracker
2857DataNode
4229Jps
3154TaskTracker
2737NameNode
在ubuntu1上查看运行的进程:
$jps
1005DataNode
2275Jps
1090TaskTracker
其它命令请参考相关资料。
在windows上通过WEB查看hadoop相关信息。
修改C:
\WINDOWS\system32\drivers\etc\hosts文件,加入主机名与IP对应关系:
192.168.69.231ubuntu
192.168.69.232ubuntu1
192.168.69.233ubuntu2
访问:
http:
//ubuntu:
50030 可以查看JobTracker的运行状态:
访问:
http:
//ubuntu:
50070 可以查看NameNode及整个分布式文件系统的状态等:
3.8运行WordCount实例
WordCount是hadoop自带的实例,统计一批文本文件中各单词出现的资料,输出到指定的output目录中,输出目录如果已经存在会报错。
$cd/opt/hadoop
$hadoopfs-mkdirinput
$hadoopfs-copyFromLocal/opt/hadoop/*.txtinput/
$hadoopjarhadoop-0.20.2-examples.jarwordcountinputoutput
$hadoopfs-catoutput/*#最后查看结果
4.Windows下eclipse开发环境配置
4.1系统环境配置
在windows上通过WEB查看hadoop相关信息。
修改C:
\WINDOWS\system32\drivers\etc\hosts文件,加入主机名与IP对应关系:
192.168.69.231ubuntu
192.168.69.232ubuntu1
192.168.69.233ubuntu2
4.2安装开发hadoop插件
将hadoop安装包hadoop\contrib\eclipse-plugin\hadoop-0.20.2-eclipse-plugin.jar拷贝到eclipse的插件目录plugins下。
需要注意的是插件版本(及后面开发导入的所有jar包)与运行的hadoop一致,否则可能会出现EOFException异常。
重启eclipse,打开windows->openperspective->other->map/reduce可以看到map/reduce开发视图。
4.3设置连接参数
打开windows->showview->other->map/reduceLocations视图,在点击大象后弹出的对话框(Generaltab)进行参数的添加:
参数说明如下:
Locationname:
任意
map/reducemaster:
与mapred-site.xml里面mapred.job.tracker设置一致。
DFSmaster:
与core-site.xml里fs.default.name设置一致。
Username:
服务器上运行hadoop服务的用户名。
然后是打开“Advancedparameters”设置面板,修改相应参数。
上面的参数填写以后,也会反映到这里相应的参数:
主要关注下面几个参数:
fs.defualt.name:
与core-site.xml里fs.default.name设置一致。
mapred.job.tracker:
与mapred-site.xml里面mapred.job.tracker设置一致。
dfs.replication:
与hdfs-site.xml里面的dfs.replication一致。
hadoop.tmp.dir:
与core-site.xml里hadoop.tmp.dir设置一致。
hadoop.job.ugi:
并不是设置用户名与密码。
是用户与组名,所以这里填写hadoop,hadoop。
说明:
第一次设置的时候可能是没有hadoop.job.ugi和dfs.replication参数的,不要紧,确认保存。
打开ProjectExplorer中DFS Locations目录,应该可以年看到文件系统中的结构了。
但是在/hadoop/mapred/system下却没有查看权限,如下图:
而且删除文件的时候也会报错:
这个原因是我使用地本用户Administrator(我是用管理员用户登陆来地windows系统的)进行远程hadoop系统操作,没有权限。
此时再打开“Advancedparameters”设置面板,应该可以看到hadoop.job.ugi了,这个参数默认是本地操作系统的用户名,如果不幸与远程hadoop用户不一致,那就要改过来了,将hadoop加在第一个,并用逗号分隔。
如:
保存配置后,重新启动eclipse。
/hadoop/mapred/system下就一目了然了,删除文件也OK。
4.4运行hadoop程序
首先将hadoop安装包下面的所有jar包都导到eclipse工程里。
然后建立一个类:
DFSOperator.java,该类写了四个基本方法:
创建文件,删除文件,把文件内容读为字符串,将字符串写入文件。
同时有个main函数,可以修改测试:
packagecom.kingdee.hadoop;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.FSDataOutputStream;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.fs.Path;
/**
*
*Theutilitiestooperatefileonhadoophdfs.
*
*@authorluolihui2011-07-18
*
*/
publicclassDFSOperator{
privatestaticfinalStringROOT_PATH="hdfs:
///";
privatestaticfinalintBUFFER_SIZE=4096;
/**
*construct.
*/
publicDFSOperator(){}
/**
*Createafileonhdfs.Therootpathis/.
*forexample:
DFSOperator.createFile("/lory/test1.txt",true);
*@parampaththefilenametoopen
*@paramoverwriteifafilewiththisnamealreadyexists,theniftrue,thefilewillbe
*@returntrueifdeleteissuccessfulelseIOException.
*@throwsIOException
*/
publicstaticbooleancreateFile(Stringpath,booleanoverwrite)throwsIOException
{
//Stringuri="hdfs:
//192.168.1.100:
9000";
//FileSystemfs1=FileSystem.get(URI.create(uri),conf);
Configurationconf=newConfiguration();
FileSystemfs=FileSystem.get(conf);
Pathf=newPath(ROOT_PATH+path);
fs.create(f,overwrite);
fs.close();
returntrue;
}
/**
*Deleteafileonhdfs.Therootpathis/.
*forexample:
DFSOperator.deleteFile("/user/hadoop/output",true);
*@parampaththepathtodelete
*@paramrecursiveifpathisadirectoryandsettotrue,thedirectoryisdeletedelsethrowsanexception.Incaseofafiletherecursivecanbesettoeithertrueorfalse.
*@returntrueifdeleteissuccessfulelseIOException.
*@throwsIOException
*/
publicstaticbooleandeleteFile(Stringp