说 明
1、各实验给出的代码仅供上机前参考,上机时应尽量脱离指导书并按照自己的理解来编程,切忌“对着实验指导书/实验报告敲代码——把编程当打字”。
2、编辑代码时,应尽量使用IDE提供的代码提示/补全功能(Eclipse下的快捷键为Alt+/),同时注意编码规范的养成。
3、当代码存在语法错误时,应能熟练根据编译器提示的错误信息来改正语法错误;当代码存在难以察觉的逻辑错误时,应尽量使用IDE的调试功能来定位逻辑错误;严禁“一边看实验指导书/实验报告、一边看屏幕,逐行对比代码”。
4、实验报告应于上机前写好,并在上机后将实验结果记录在实验报告上。若实验涉及代码较多,则实验报告中只书写核心代码及其注释,但应注明各源文件名并保留完整语法结构及缩进。
信息工程学院
实验1 熟悉常用的Linux操作和Hadoop操作
实验目的
Hadoop 运行在Linux系统上,因此,需要学习实践一些常用的Linux命令. 本实验旨在熟悉常用的 Linux操作和 Hadoop操作,为顺利开展其他实验奠定基础。
实验平台
- 操作系统:Linux(建议 Ubuntu)。
实验步骤
熟悉常用的 Linux 操作
1)cd命令:切换目录
(1)切换到目录/usr/local。
cd /usr/local
(2)切换到当前目录的上一级目录。
cd ..
(3)切换到当前登录Linux系统的用户自己的主文件夹。
cd ~
(4)查看目前的工作目录。
pwd
2)ls命令:查看文件与目录
查看目录/usr 下的所有文件和目录。
ls /usr
3)mkdir命令:新建目录
(1)进人/tmp目录,创建一个名为a的目录,并查看/tmp 目录下已经存在哪些目录。
cd /tmp
mkdir a
ls
(2)进人/tmp目录,创建目录al/a2/a3/a4。
cd /tmp
mkdir -p a1/a2/a3/a4
4)rm命令:删除空的目录
(1)将上面创建的目录a(在/tmp目录下面)删除。
rm -rf /tmp/a
(2)删除上面创建的目录a1(在/tmp目录下面),然后查看/tmp目录下面存在哪些目录。
rm -rf a1
cd /tmp
ls
5)cp命令:复制文件或目录
(1)将当前用户的主文件夹下的文件.bashrc复制到目录/usr下,并重命名为 .bashrc1。
sudo cp ~/.bashrc /usr/
sudo mv /usr/.bashrc /usr/.bashrc1
(2)在目录/tmp下新建目录 test,再把这个目录复制到/usr目录下。
mkdir /tmp/test
sudo cp -r /tmp/test /usr/
6)mv命令:移动文件与目录,或重命名
(1)将/usr 目录下的文件.bashrc1 移动到/usr/test目录下。
sudo mv /usr/.bashrc1 /usr/test
(2)将/usr目录下的 test目录重命名为test2。
sudo mv /usr/test /usr/test2
7)rm命令:移除文件或目录
(1)将/usr/test2 目录下的.bashrc1 文件删除。
rm -f /usr/test2/.bashrc1
(2)将/usr 目录下的 test2 目录删除。
sudo rm -rf /usr/test2
8)cat命令:查看文件内容
查看当前用户主文件夹下的.bashrc 文件的内容。
cat ~/.bashrc
9)tail命令:取出后面几行
(1)查看当前用户主文件夹下.bashrc 文件的内容的最后20行。
tail -20 ~/.bashrc
10)find 命令:文件查找
找出主文件夹下文件名为.bashrc 的文件。
sudo find ~ -name ".bashrc"
11)tar命令:压缩命令
(1)在根目录下把tmp文件夹打包成 test.tar.gz。
sudo tar -zcvf test.tar.gz /tmp
(2)把上面的test.tar.gz压缩包,解压缩到/usr/local下。
sudo tar -zxvf test.tar.gz -C /usr/local
12)配置环境变量
(1)请在~/.bashrc中查看当前的环境变量配置。
cat ~/.bashrc
(2)查看JAVA_HOME 变量的值。
echo $JAVA_HOME
13)在主目录下创建hello.txt,文件内容是"I love China!"
cd ~
使用vi编辑器编辑内容,步骤如下:
(1)按"i"键,进入编辑模式
(2)编辑内容为"I love China!"
(3)按ESC键,输入":",":"后面输入"wq"保存,输入"q!"不保存
(4)查看文件内容, cat hello.txt
vi编辑中连续按两次"d",删除一行。
(14)查看hello.txt的文件权限
ls -l hello.txt
备注:Ubuntu密码为admin123
实验2 熟悉常用的HDFS操作
1. 理解HDFS在Hadoop体系结构中的角色;
2. 熟练使用HDFS操作常用的Shell命令;
操作系统:Windows7
Hadoop版本:2.7.6
JDK版本:1.8
-
实验方案
1.win7环境上,以管理员身份运行cmd。
2.在cmd应用中使用命令start-dfs.cmd启动HDFS。
3.在终端上执行jps查看HDFS的运行情况,确认Hadoop是否启动正常。
4.在终端上执行HDFS相关命令。
5.实验完毕,执行stop-dfs.cmd关闭Hadoop。
利用Hadoop提供的Shell命令完成相同任务:
- 查看Hadoop的版本。
hadoop version
- 在HDFS上创建4个目录/a,/b,/c/d,/input。
hdfs dfs -mkdir /a
hdfs dfs -mkdir /b
hdfs dfs -mkdir –p /c/d
hdfs dfs -mkdir /input
- cmd中执行cd c:\进入C盘,在C盘中创建两个文件:A.txt与B.txt
文件A.txt的内容如下:
China is my motherland
I love China
文件B.txt的内容如下:
I am from China
将A.txt上传到HDFS的/input中,将B.txt上传到HDFS的/input中。
hdfs dfs -put A.txt /input
hdfs dfs -put B.txt /input
- 查看HDFS的目录/input下的所有文件。
hdfs dfs -ls /input
- 在HDFS上复制/input/A.txt到/a中,并命名为hello.txt。
hdfs dfs -cp /input/A.txt /a/hello.txt
- 从HDFS中下载指定文件/a/hello.txt到本地文件系统的D盘中。
hdfs dfs -get /a/hello.txt D:\
- 将HDFS中的文本文件/a/hello.txt内容输出到终端中查看。
hdfs dfs -cat /a/hello.txt
- 显示HDFS中文件/a/hello.txt的读写权限、大小、创建时间、路径等文件详细信息。
hdfs dfs -ls /a/hello.txt
- 查看目录/c/d的大小。
hdfs dfs -dus /c/d
- 在HDFS上删除文件/a/hello.txt,删除目录/c/d。
hdfs dfs -rm /a/hello.txt
hdfs dfs -rm -r /c/d
- 实验总结
可从以下几方面总结:总结实验内容;实验中遇到的问题与解决方法;对本次实验的理解。
实验3 Java API操作HDFS
1 实验目的
1. 掌握使用IDE开发工具Eclipse操作HDFS的步骤。
2. 熟悉HDFS操作常用的Java API。
2 实验平台
操作系统:Windows7
Hadoop版本:2.7.6
JDK版本:1.8
Java IDE:Eclipse
3 实验方案
- 以管理员身份运行启动cmd应用,执行命令start-dfs.cmd启动HDFS。
(2)使用Eclipse创建java工程。
(3)在Java工程中引入HDFS API开发需要的jar。
(4)编写HDFS API程序。
(5)使用HDFS的命令hdfs dfs -cat /input/hello.txt查看操作结果。
4 实验内容和要求
1. 编程实现一个类“HDFS_write”,在HDFS中创建目录"/input",并在该目录下写入一个新文件: /hello.txt,文件中写入自己的姓名。
程序清单:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFS_write {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000");
FileSystem fs = FileSystem.get(conf);
fs.mkdirs(new Path("/input"));
Path p1 = new Path("/input/hello.txt");
FSDataOutputStream out = fs.create(p1);
byte[] b = "姓名".getBytes();
out.write(b);
}
}
2. 编程实现一个类“HDFS_read”,读取操作1中创建的文件/input/hello.txt。把读取到的值输出到Eclipse的控制台。
程序清单:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFS_read {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000");
FileSystem fs = FileSystem.get(conf);
Path p1 = new Path("/input/hello.txt");
FSDataInputStream in = fs.open(p1);
String s=in.readLine();//iso-8859-1
String s1=new String(s.getBytes("iso-8859-1"),"utf-8");
System.out.println(s1);
}
}
实验4 MapReduce API编程
1 实验目的
- 掌握使用IDE开发工具Eclipse访问MapReduce的步骤。
2. 熟悉MapReduce编程常用的Java API。
3. 理解MapReduce程序执行过程。
2 实验平台
操作系统:Windows7
Hadoop版本:2.7.6
JDK版本:1.8
Java IDE:Eclipse
3 实验方案
- 数据准备:在C盘创建文本文件wordcount.txt,内容如下。
- 以管理员身份运行启动cmd应用,在cmd应用中执行命令start-all.cmd启动Hadooop。启动Hadoop后,执行hdfs dfs -mkdir /input,在HDFS上创建/input目录。执行命令cd c:\进入C盘,再执行
Hello World Hello Hadoop Hello MapReduce |
hdfs dfs -put wordcount.txt /input
将wordcount.txt文件上传到HDFS上的/input目录。
(3)使用Eclipse创建java工程。
(4)引入MapReduce API开发需要的jar。
(5)编写MapReduce程序。
(6)运行查看程序执行结果,期望输出如下:
输出 |
Hadoop 1 Hello 3 MapReduce 1 World 1 |
4 实验内容和要求
编程实现一个类“WordCount”,实现词频统计。
程序清单:
package cn.chu.wordcount;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class WordCount{
public static class MyMapper 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{
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()){
word.set(itr.nextToken());
context.write(word,one);
}
}
}
public static class MyReducer 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,result);
}
}
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
Job job = new Job(conf,"word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job,new Path("/input"));
FileOutputFormat.setOutputPath(job,new Path("/output"));
System.exit(job.waitForCompletion(true)?0:1);
}
}
5 实验结果与结论
通过MapReduce API程序正确地实现了词频统计,验证了MapReduce编程模型的map与reduce过程。
6 试验心得与小结
可简要谈谈实验后对MapReduce编程模型的理解。