1、 Hadoop云计算实验报告 Hadoop云计算实验报告 1 实验目的 在虚拟机Ubuntu上安装Hadoop单机模式和集群; 编写一个用Hadoop处理数据的程序,在单机和集群上运行程序。 2 实验环境 虚拟机:VMware 9 操作系统:ubuntu-12.04-server-x64(服务器版),ubuntu-14.10-desktop-amd64(桌面版) Hadoop版本:hadoop 1.2.1 Jdk版本:jdk-7u80-linux-x64 Eclipse版本:ecli
2、pse-jee-luna-SR2-linux-gtk-x86_64 Hadoop集群:一台namenode主机master,一台datanode主机salve, master主机IP为10.5.110.223,slave主机IP为10.5.110.207。 3 实验设计说明 3.1 主要设计思路 在ubuntu操作系统下,安装必要软件和环境搭建,使用eclipse编写程序代码。实现大数据的统计。本次实验是统计软件代理系统操作人员处理的信息量,即每个操作人员出现的次数。程序设计完成后,在集成环境下运行该程序并查看结果。 3.2 算法设计 该算法首先将输入文件都
3、包含进来,然后交由map程序处理,map程序将输入读入后切出其中的用户名,并标记它的数目为1,形成
4、lue的类型,输出key的类型,输出value的类型。 2) UserNameCountReduce类继承了org.apache.hadoop.mapreduce.Reducer,4个泛型类型含义与map类相同。 3) main函数通过addInputPath将数据文件引入该类,在通过setOutputPath将生成结果转为一个文件,实现生成结果,即统计结果的查看。 FileInputFormat.addInputPath(job, new Path(args[0])); FileOutpu
5、tFormat.setOutputPath(job, new Path(args[1])); 程序具体代码如附件中源程序。 4 实验过程 4.1 安装实验环境 4.1.1 安装ubuntu操作系统 1) 打开VMware,在Home tab中单击“Create a New Virtual Machine”, 2) 选择custom,选择虚拟硬件版本Workstation9.0,选择ios文件,next, 3) 录入目标操作系统信息,包括Full name、Uer name和Password, next, 4) 选择默认的选项,一般不做更改,最后确认信息,Finish, 5
6、) 安装成功后,会看到如下画面, 4.1.2 安装配置Samba 安装samba主要为了实现与windows操作系统的通讯,由于server版本的ubuntu没有自带图形操作界面,所以下载资料等操作不太方便,这也是安装samba的目的之一。 1) 安装samba,输入如下命令: 2) 安装vim 3) 创建共享目录,并修改权限 4) 配置samba。修改samba的配置文件/etc/samba/smb.conf ,将security=share,并在文件的末尾追加如下内容, 5) 测试。在windows实机中,通过ip访问ubuntu虚拟机,可以见到sha
7、re文件夹 4.1.3 安装配置JDK 首先,下载java开发工具包JDK。在本次试验中,我们下载的版本是jdk-7u80-linux-x64.gz。 解压安装到/usr/lib/jvm/目录下,更名为java-7-sun。 配置环境变量/etc/environment, 使配置生效 测试安装配置结果 4.1.4 在单节点(伪分布式)环境下运行HADOOP 1) 添加Hadoop用户并赋予sudo权限 2) 安装配置SSH 切换至hadoop用户, 配置密钥,使得hadoop用户能够无须输入密码,通过SSH访问localhost, 测试结果:
8、 3) 安装配置Hadoop 首先下载Hadoop,解压缩到/opt/hadoop目录下, 本次试验中我们下载的版本是hadoop-1.2.1-bin.tar.gz,更改目录名称为hadoop。 修改与hadoop相关的配置文件(在/opt/hadoop/conf目录下),分别是core-site.xml, hadoop-env.sh, hdsf-site.xml, mapred-site.xml。在此不一一列举。 4) 运行Hadoop 首先格式化HDFS, 启动单节点集群, 通过jps查看, master slave 停止单节点集群, 4.1
9、5 在多节点(分布式)环境下运行HADOOP 1) 设置/etc/hosts文件 实验中两台机器处于同一局域网中,其中一台作为master,ip地址为10.5.110.223,一台作为slave,ip地址为10.5.110.207,修改两台机器的/etc/hosts文件, 2) 设置节点之间无密码SSH登陆 验证配置SSH是否正确 3) 修改集群配置文件 修改master的masters、slaves,修改所有节点的core-site.xml, hdsf-site.xml, mapred-site.xml,在此不一一列出。 4) 在master上格式化HDFS 5)
10、启动和停止集群 启动集群, 在master上启动HDFS后,jps结果如下: master slave 在master上启动mapreduce后,jps结果如下: master slave 停止集群 4.2 运行程序 4.2.1 在单机上运行程序 (1) 在Eclipse下,新建map/reduce工程 (2) 新建一个java类UserNameCount,编写代码 (3) 运行程序,结果如下: (4) 在eclipse中编译好源代码后,导出程序的jar包,供在集群上使用。 4.2.2 在集群上运行程序 (
11、1) 启动集群,通过jps命令查看master,slave上启动的服务列表,结果如下: (2) 在集群环境下运行该程序jar包(UserNameCount.jar),结果如下: (3) 查看集群环境下启动程序生成的结果,即output文件,结果如下: (4) 数据统计结果在part-r-00000中,具体内容如下, 5 附件 源代码如下: package hadoop; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hado
12、op.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.R
13、educer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; public class UserNameCount {
14、public static class UserNameCountMap extends
Mapper
15、on {
String line = value.toString();
StringTokenizer token = new StringTokenizer(line);
while (token.hasMoreTokens()) {
word.set(token.nextToken());
context.write(word, one);
}
}
}
public static class UserNameCountReduce extends
Reducer 16、 IntWritable> {
public void reduce(Text key, Iterable 17、 void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = new Job(conf);
job.setJarByClass(UserNameCount.class);
job.setJobName("usernamecount");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapp 18、erClass(UserNameCountMap.class);
job.setReducerClass(UserNameCountReduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.waitForCompletion(true);
}
}






