实验1:HADOOP实验-HDFS与MAPREDUCE操作
云计算技术与应用 石家庄铁道大学信息学院
实验1:HADOOP实验-HDFS与MAPREDUCE操作
本次实验属于验证型实验,通过本次实验学生将掌握以下内容:
1、利用虚拟机搭建集群部署hadoop
2、HDFS文件操作以及文件接口编程;
3、MAPREDUCE并行程序开发、发布与调用。
[实验任务]:
一、虚拟机集群搭建部署hadoop
利用VMware、centOS-7、Xshell(secureCrt)等软件搭建集群部署hadoop,具体操作参照
https://www.bilibili.com/video/BV1Kf4y1z7Nw?p=1
可使用官网下载:
二、HDFS文件操作
在分布式文件系统上验证HDFS文件命令,如下。
hadoop fs [genericOpitions] [-ls <path>] //显示目标路径当前目录下的所有文件 [-lsr <path>] //递归显示目标路径下的所有目录及文件(深度优先) [-du <path>] //以字节为单位显示目录中所有文件的大小,或该文件的大小(如果path为文件) [-dus <paht>] //以字节为单位显示目标文件大小(用于查看文件夹大小) [-count [-q] <path>] //将目录的大小、包含文件(包括文件)个数的信息输出到屏幕(标准stdout) [-mv <src> <dst>] //把文件或目录移动到目标路径,这个命令允许同时移动多个文件,但是只允许移动到一个目标路径中,参数中的最有一个文件夹即为目标路径 [-cp <src> <dst>] //复制文件或目录到目标路径,这个命令允许同时复制多个文件,如果复制多个文件,目标路径必须是文件夹 [-rm [-skipTrash] <path>] //删除文件,这个命令不能删除文件夹 [-rmr [-skipTrash] <path>] //删除文件夹及其下的所有文件 [-expunge] [-put <localsrc> ... <dst>] //从本地文件系统上传文件到HDFS中 [-copyFromLocal <localsrc> ... <dst>] //与put相同 [-moveFromLocal <localsrc> ... <dst>] //与put相同,但是文件上传之后会从本地文件系统中移除 [-get [-ignoreCrc] [-crc] <src> <localdst>] //复制文件到本地文件系统。这个命令可以选择是否忽视校验和,忽视校验和和下载主要用于挽救那些已经发生错误的文件 [-getmerge <src> <localdst> [addnl]] //将源目录中的所有文件进行排序并写入目标文件中,文件之间以换行符分隔 [-cat <src>] //在终端显示(标准输出stdout)文件中的内容,类似Linux系统中的cat [-text <src>] [-copyToLocal [-ignoreCrc] [-crc] <src> <localdst>] //与get相同 [-moveToLocal [-crc] <src> <localdst>] [-mkidr <path>] //创建文件夹 [-setrep [-R] [-w] <rep> <path/file>] //改变一个文件的副本个数。参数-R可以递归地对该目录下的所有文件做统一操作 [-touchz <path>] //类似Linux中的touch,创建一个空文件 [-test -[ezd] <path>] //将源文件输出为文本格式显示到终端上,通过这个命令可以查看TextRecordInputStream(SequenceFile等)或zip文件 [-stat [format] <path>] //以指定格式返回路径的信息 [-tail [-f] <file>] //在终端上显示(标准输出stdout)文件的最后1kb内容。-f选项的行为与LInux中一致,会持续监测先添加到文件中的内容,这在查看日志文件时会显得非常方便。 [-chmod [-R] <MODE[,MODE]...| OCTALMODE> PATH...] //改变文件的权限,只有文件的所有者或者是超级用户才能使用这个命令。-R可以递归地改变文件夹内的所有文件的权限 [-chown [-R] [OWNER] [:[GROUP] PATH...]] //改变文件的拥有者,-R可以递归地改变文件夹内所有文件的拥有者。同样,这个命令只有超级用户才能使用 [-chgrp [-R] GROUP PATH...] //改变文件所属的组,-R可以递归地改变文件夹内所有文件所属的组。这个命令必须是超级用户才能使用 [-help [cmd]] //这是命令的帮助信息 |
2.1 HDFS接口编程
调用HDFS文件接口实现对分布式文件系统中文件的访问,如创建、修改、删除等。
参考代码:
三、MAPREDUCE并行程序开发
3.1 求每年最高气温
原始数据如下:
|
参考代码
|
将程序发布为jar包,并上传到hadoop平台运行。
3.2 词频统计
maven建立quick-start工程。
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>cn.edu.bupt.wcy</groupId> <artifactId>wordcount</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging>
<name>wordcount</name> <url>http://maven.apache.org</url>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.1</version> </dependency> </dependencies> </project> |
3个java代码,mapper、reducer、runner主类:
mapper:
package cn.edu.bupt.wcy.wordcount;
import java.io.IOException;
import org.apache.commons.lang.StringUtils; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper;
public class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
@Override protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context) throws IOException, InterruptedException { // TODO Auto-generated method stub //super.map(key, value, context); //String[] words = StringUtils.split(value.toString()); String[] words = StringUtils.split(value.toString(), " "); for(String word:words) { context.write(new Text(word), new LongWritable(1));
} } } |
reducer:
package cn.edu.bupt.wcy.wordcount;
import java.io.IOException;
import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer;
public class WordCountReducer extends Reducer<Text, LongWritable, Text, LongWritable> {
@Override protected void reduce(Text arg0, Iterable<LongWritable> arg1, Reducer<Text, LongWritable, Text, LongWritable>.Context context) throws IOException, InterruptedException { // TODO Auto-generated method stub //super.reduce(arg0, arg1, arg2); int sum=0; for(LongWritable num:arg1) { sum += num.get();
} context.write(arg0,new LongWritable(sum));
} } |
runner:
package cn.edu.bupt.wcy.wordcount;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; 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 WordCountRunner {
public static void main(String[] args) throws IllegalArgumentException, IOException, ClassNotFoundException, InterruptedException { Configuration conf = new Configuration(); Job job = new Job(conf); job.setJarByClass(WordCountRunner.class); job.setJobName("wordcount"); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setInputFormatClass(TextInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class); FileInputFormat.addInputPath(job, new Path(args[1])); FileOutputFormat.setOutputPath(job, new Path(args[2])); job.waitForCompletion(true); }
} |
打包成jar包后,放到集群上运行。先在集群上新建一个文件夹:
hdfs dfs -mkdir /input_wordcount 再放入单词文件,比如:
hello world
I like playing basketball
hello java。。。
运行hadoop jar WordCount.jar(jar包) WordCountRunner(主类) /input_wordcount /output_wordcount
运行完成后,查看:
hdfs dfs -ls /output_wordcount。已经生成了结果,在cat一下查看内容即可。
实验总结
这次实验,我完成了客户机与HDFS交互,更进一步了解了Hadoop 的日常操作,同时对于MapReduce和 HDFS的功能也有了了解。其中遇到了Input path does not exist报错,结果是没有提前建立文件,导致找不到相应的文件。