虚拟化与云计算课程实验报告Hadoop平台搭建.docx
《虚拟化与云计算课程实验报告Hadoop平台搭建.docx》由会员分享,可在线阅读,更多相关《虚拟化与云计算课程实验报告Hadoop平台搭建.docx(24页珍藏版)》请在冰豆网上搜索。
虚拟化与云计算课程实验报告Hadoop平台搭建
虚拟化与云计算
实
验
报
告
一、实验目标1
二、实验容1
三、实验步骤1
四、实验遇到的问题及其解决方法1
五、实验结论1
一、实验目的
1.实验题目:
配置和使用SAN存储
掌握在Linux上配置iSCSItarget服务的方法。
2.实验题目:
Hadoop&MapReduce
安装、部署、使用Hadoop-HDFS
配置运行MapReduce程序,使用MapReduce编程
二、实验容
1.实验题目:
配置和使用SAN存储
配置在Linux上iSCSI实现两台机器间的共享存储。
2.实验题目:
Hadoop&MapReduce
1.掌握在集群上(使用虚拟机模拟)安装部署Hadoop-HDFS的方法。
2.掌握在HDFS运行MapReduce任务的方法。
3.理解MapReduce编程模型的原理,初步使用MapReduce模型编程。
三、实验步骤及实验结果
1.实验题目:
配置和使用SAN存储
在实验1中我作为主机提供共享存储空间,实验地点是在机房,但是由于我当时没有截图所以回寝室在自己的电脑上重做,以下为主机步骤:
1.1确定以root身份执行以下步骤
sudosu–
1.2安装iSCSITarget软件
1.3修改/etc/default/iscsitarget
ISCSITARGET_ENABLE=true
1.4创建共享存储
共享存储可以是logicalvolumes,imagefiles,harddrives,harddrivepartitionsorRAIDdevices
例如使用imagefile的方法,创建一个10G大小的LUN:
ddif=/dev/zeroof=/storage/lun1.imgbs=1024kcount=10240
1.5修改/etc/iet/ietd.conf
添加:
Targetiqn.2001-04..example:
storage.lun1
IncomingUser[username][password]
OutgoingUser
Lun0Path=/storage/lun1.img,Type=fileio
AliasLUN1
#MaxConnections6
1.6修改/etc/iet/initiators.allow
如果只允许特定IP的initiator访问LUN,则如下设置
iqn.2001-04..example:
storage.lun1192.168.0.100
如果任意initiator均可以访问,则:
ALLALL
1.6启动/重启动iSCSItarget
/etc/init.d/iscsitargetstart
/etc/init.d/iscsitargetrestart
2.实验题目:
Hadoop&MapReduce
1.安装JDK——在实验中安装为OpenJDK6Runtime
2.安装openssh-server,命令为:
sudoapt-getinstallopenssh-server,并检查sshserver是否已经启动:
ps-e|grepssh,如果只有ssh-agent那ssh-server还没有启动,需要/etc/init.d/sshstart,如果看到sshd那说明ssh-server已经启动了。
3.免密码ssh设置,确认能否不输入口令就用ssh登录localhost:
sshlocalhost
如果不输入口令就无法用ssh登陆localhost,执行下面的命令:
$ssh-keygen-trsa-f~/.ssh/id_rsa
cat~/.ssh/id_rsa.pub>>~/.ssh/authorized_keys
再次执行sshlocalhost,完成后请登入确认不用输入密码
4.安装Hadoop
解压Hadoop安装包到安装目录,在本实验中我新建了一个用户hadoop并把hadoop解压到home/hadoop文件夹下,在伪分布模式下使用的版本为0.20.203,在分布模式下因为要与Eclipse兼容所以最终使用版本为0.20.2,下面部分截图为版本为0.20.203。
并编辑conf/hadoop-env.sh,将JAVA_HOME设置为Java安装根路径
运行运行bin目录下的hadoop,如显示hadoop脚本的使用文档,说明安装已经完成。
如下图所示:
5.安装部署单机伪分布式模式Hadoop-HDFS
Hadoop可以在单节点上以伪分布式模式运行。
编辑/conf/core-site.xml
fs.default.name
hdfs:
//localhost:
9000
hadoop.tmp.dir
/tmp/hadoop/hadoop-${user.name}
编辑/opt/hadoop/conf/hdfs-site.xml
dfs.replication
1
编辑/opt/hadoop/conf/mapred-site.xml
mapred.job.tracker
localhost:
9001
格式化HDFS
bin/hadoopnamenode–format
启动Hadoop,启动后可使用命令jps查看已启动进程,观察是否namenode、datanode已启动,关闭所有服务,使用命令stop-all.sh,bin/start-all.sh
6.浏览NameNode和JobTracker的网络接口,地址默认为:
NameNode-localhost:
50070/
JobTracker-localhost:
50030/
7.下面尝试在单机伪分布模式下运行wordcount样例程序
将输入文件拷贝到分布式文件系统
bin/hadoopfs-puthome/lee/桌面testfileinput
运行Hadoop自带的wordcount例子
bin/hadoopjarhadoop-examples-0.20.203.0.jarwordcountinputoutput
将输出文件从分布式文件系统拷贝到本地文件系统查看
bin/hadoopfs-getoutput/home/lee/文档
cat/home/lee/文档/output/*
8.安装部署多机Hadoop-HDFS
这个部署多机的实验在实验室没有做完,最后实在宿舍完成的,节点为两个,使用系统为wubi安装的Ubuntu,所以不需要桥接方式(因为有固定IP),以下步骤为我做为Master时的实验截图:
本机名为node1,另外一台机器为node2,两台机器均建立一个名为hadoop的管理员用户用于统一部署安装hadoop。
编辑文件/etc/hosts
127.0.1.1ubuntu替换为127.0.1.1node1
编辑/etc/hostname文件删除该文件的所有容,添加node1
运行命令hostnamenode1
a)指定IP地址
编辑文件/etc/network/interfaces
autoeth0
ifaceeth0inetstatic
address115.24.250.196
netmask255.255.255.0
重启网络服务sudo/etc/init.d/networkingrestart
查看IP地址ifconfig
b)修改/etc/hosts文件
node1中:
115.24.250.196node1
115.24.250.43node2
node2中:
115.24.250.196node1
115.24.250.43node2
c)配置从node1无需输入密码ssh登录node1、node2,命令如下:
首先在node1、node2下建立home/hadoop/.ssh文件夹
在node1(master)上:
$ssh-keygen-trsa
$cat.ssh/id_rsa.pub>>.ssh/authorized_keys
这两行命令生成密钥并将公钥导出到authorized_keys中,然后将此文件拷贝到node2(slaves)中的相同文件夹下,因为通过网络命令拷贝比较困难所以我在这里用U盘拷贝的,之后就可以成功无密码登录node2
d)编辑/conf/core-site.xml
//此处为了方便查找我更改了hadoop.tmp.dir的文件目录,改为/home/hadoop/tmp
fs.default.name
hdfs:
//node1:
9000
hadoop.tmp.dir
/home/hadoop/tmp
e)编辑/opt/hadoop/conf/hdfs-site.xml,其中
//这里我们将dfs.data.dir改为/home/hadoop/data
//将dfs.name.dir的默认文件夹改为/home/hadoop/name
dfs.name.dir
/home/hadoop/name
dfs.data.dir
/home/hadoop/data
dfs.replication
2
f)编辑/opt/hadoop/conf/mapred-site.xml
mapred.job.tracker
node1:
9001
g)配置jobtracker
masters文件配置如下:
node1
slaves文件配置如下:
node2
在主节点编辑hadoop的配置之后,将其拷贝到node2的对应目录(U盘)
h)格式化HDFS
bin/hadoopnamenode-format
i)启动Hadoop,启动后可使用命令jps查看namenode和datanode上已启动进程,观察是否namenode、datanode已启动,关闭所有服务,使用命令stop-all.sh,再分别按顺序在node1和node2上开启namenode(node1)、datanode(node2)、jobtracker(node1)、tasktracker(node2),注意我在此处只能分别开启,如果使用start-all.sh全部自动开启的话启动所有节点正常但是无活节点可用,可能与启动顺序有关,成功之后截图如下:
j)浏览NameNode和JobTracker的网络接口,地址默认为:
NameNode-node1:
50070/
JobTracker-node1:
50030/
9.安装eclipse和hadooppluginforeclipse
这里经过反复测试发下到现在为止只使用了eclipse3.3和hadoop0.20.2-plugin插件可以配置成功,最新版本均不能配置成功。
具体做法是下载eclipse解压之后将hadoop安装路径下的contrib的下的jar插件复制到eclipse文件夹下的plugins文件夹下即可在eclipse下成功安装插件。
10.新建MapReduce工程,并在eclipse中下方的Map/ReduceLocations下新建刚刚添加好的node1并配置如下:
11.最后将写好的测试文件testfile上传到DFSLocations分布式文件系统中,并设置好文件的输入输出参数(如下图,输入输出文件/文件夹均在DFS中)。
这里我根据要求将老师给的WordCount.java做了一定的修改,具体来说就是将第一个Job输出的文本文件作为输入,再次读入并交换为(用以是以词频为关键字并以单词为values,这样就能遍历统一词频的所以单词并以字符串的形式拼接起来,但是跟最后的要求还差一点就是因为时间的关系我没有实现一个比较函数的类并设置所以最后的排序是默认的从小到大,而不是从大到小)下面截图如下:
修改过的代码如下:
importjava.io.IOException;
importjava.util.StringTokenizer;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.io.IntWritable;
importorg.apache.hadoop.io.LongWritable;
importorg.apache.hadoop.io.Text;
importorg.apache.hadoop.conf.*;
importorg.apache.hadoop.mapreduce.Job;
importorg.apache.hadoop.mapreduce.Mapper;
importorg.apache.hadoop.mapreduce.Reducer;
importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;
importorg.apache.hadoop.mapreduce.lib.input.TextInputFormat;
importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
importorg.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
publicclassWordCount{
publicstaticclassMapextendsMapper{
privatefinalstaticIntWritableone=newIntWritable
(1);
privateTextword=newText();
publicvoidmap(LongWritablekey,Textvalue,Contextcontext)
throwsIOException,InterruptedException{
Stringline=value.toString();
StringTokenizertokenizer=newStringTokenizer(line);
while(tokenizer.hasMoreTokens()){
word.set(tokenizer.nextToken());
context.write(word,one);
}
}
}
publicstaticclassReduceextendsReducer{
publicvoidreduce(Textkey,Iterablevalues,Contextcontext)
throwsIOException,InterruptedException{
intsum=0;
for(IntWritableval:
values){
sum+=val.get();
}
context.write(key,newIntWritable(sum));
}
}
publicstaticclasssortMapextendsMapper{
privateTextwordcount=newText();
privateTextword=newText();
publicvoidmap(LongWritablekey,Textvalue,Contextcontext)
throwsIOException,InterruptedException{
Stringline=value.toString();
StringTokenizertokenizer=newStringTokenizer(line);
while(tokenizer.hasMoreTokens()){
word.set(tokenizer.nextToken());
wordcount.set(tokenizer.nextToken());
context.write(wordcount,word);
}
}
}
publicstaticclasssortReduceextendsReducer{
publicvoidreduce(Textkey,Iterablevalues,Contextcontext)
throwsIOException,InterruptedException{
Stringwordline="";
for(Textval:
values){
wordline+=val+",";
}
context.write(key,newText(wordline));
}
}
publicstaticvoidmain(String[]args)throwsException{
Configurationconf=newConfiguration();
Jobjob=newJob(conf,"wordcount");
job.setJarByClass(WordCount.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job,newPath(args[0]));
FileOutputFormat.setOutputPath(job,newPath(args[1]));
job.waitForCompletion(true);
JobsortJob=newJob(conf,"sortword");
sortJob.setJarByClass(WordCount.class);
sortJob.setOutputKeyClass(Text.class);
sortJob.setOutputValueClass(Text.class);
sortJob.setMapperClass(sortMap.class);
sortJob.setReducerClass(sortReduce.class);
sortJob.setInputFormatClass(TextInputFormat.class);
sortJob.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(sortJob,newPath(args[1]+"/part-r-00000"));
FileOutputFormat.setOutputPath(sortJob,newPath(args[1]+"/result"));
sortJob.waitForCompletion(true);
}
}
四、实验遇到的问题及其解决方法
iSCSItarget实验比较简单,所遇到的问题不多,主要是当时对于vim的操作上有一些不熟练所以耽误了一些时间;其次就是刚开始时NAT而不是桥接模式致使client连接不上我的机器浪费了一些时间,总体来说实验比较简单;
此次实验中的问题主要集中在Hadoop/MapReduce这个实验上,程序的编写上不是特别困难,参照着网上的讲解和HadoopAPI可以自己摸索个大概并修改老师给的程序;主要是在配置ssh无密码连接以及之后的Hadoop服务启动及重启之后再次开启服务上出现了一些问题,下面挑选列举如下:
1.在分布模式下试图无密码登录node2的时候失败,之后按照网上教程尝试尝试用ssh中的scp命令传输文件失败;
解决方法:
出现问题的主要原因是因为当时对scp命令以及相关的参数不太了解,所以当时着急解决问题所