当前位置:   article > 正文

Hadoop实验4:MapReduce编程_mapreduce实验

mapreduce实验

目录

一. 【实验准备】

1.工作目录

2.打开eclipse并配置工作空间

二、准备工作

1. 新建项目

2. 准备测试数据

3. 添加 MapReduce 编程框架

三、Map过程

四、Reduce过程

五、执行MapReduce任务

六、实验结果

七、准备工作

1. 新建项目

2. 准备relation.dat

3. 添加 MapReduce 编程框架

(1).MyMapper

(2).MyReducer

(3).MyRunner

八、Map过程

九、Reduce过程

十、执行MapReduce任务

十一、实验结果

十二、准备工作

1.新建项目

2.准备 input.dat

十三、Map过程

十四、Combine过程

十五、Reduce过程

十六、执行MapReduce过程

十七、实验结果


一. 【实验准备】

参考《Hadoop安装部署》实验,安装部署配置了三个数据节点的Hadoop集群

1.工作目录

本实验的工作目录为~/course/hadoop/mr_pro,使用以下命令创建和初始化工作目录:

  1. $ mkdir -p ~/course/hadoop/mr_pro
  2. $ cd ~/course/hadoop/mr_pro

2.打开eclipse并配置工作空间

在桌面右键打开终端输入如下命令打开eclipse:

eclipse &

打开eclipse后选择/headless/course/hadoop/mr_pro做为工作空间

二、准备工作

1. 新建项目

1.在eclipse中依次点击:File->New->Project->Map/Reduce Project->Next

2.在项目名称(Project Name)处填入WordCount,将工程位置设置为文件夹/headless/course/hadoop/mr_pro/WordCount,点击Finish

2. 准备测试数据

新建终端,使用如下命令新建一个文本文件:

  1. # cd ~/course/hadoop/mr_pro/WordCount/
  2. # mkdir target
  3. # mkdir data
  4. # cd data
  5. # echo "Hello World" >> file1.txt
  6. # echo "Hello MapReduce" >> file2.txt

使用如下命令进入master节点:

# docker exec -it --privileged master /bin/bash

主机的~/course目录挂载到了master节点的/course目录。

在master节点中使用如下命令新建目录,并将文本文件上传到目录:

  1. # hadoop fs -mkdir -p mapreduce/WordCount/input
  2. # cd /course/hadoop/mr_pro/WordCount/data
  3. # hadoop fs -put file1.txt file2.txt mapreduce/WordCount/input
  4. # hadoop fs -ls mapreduce/WordCount/input
  5. Found 2 items
  6. -rw-r--r-- 3 bd1_cg bd1 12 2018-12-20 17:59 mapreduce/WordCount/input/file1.txt
  7. -rw-r--r-- 3 bd1_cg bd1 16 2018-12-20 17:59 mapreduce/WordCount/input/file2.txt

3. 添加 MapReduce 编程框架

MapReduce 编程框架分为三个部分,请在 Eclipse 中的 WordCount 下分别创建如下三个类,内容分别如下:

(1).WcMapper

  1. public class WcMap extends Mapper<LongWritable, Text, Text, LongWritable>{
  2. //重写map这个方法
  3. //mapreduce框架每读一行数据就调用一次该方法
  4. protected void map(LongWritable key, Text value, Context context)
  5. throws IOException, InterruptedException {
  6. //具体业务逻辑就写在这个方法体中,而且我们业务要处理的数据已经被框架传递进来,在方法的参数中key-value
  7. //key是这一行数据的起始偏移量,value是这一行的文本内容
  8. }
  9. }

(2).WcReducer

  1. public class WcReduce extends Reducer<Text, LongWritable, Text, LongWritable>{
  2. //继承Reducer之后重写reduce方法
  3. //第一个参数是key,第二个参数是集合。
  4. //框架在map处理完成之后,将所有key-value对缓存起来,进行分组,然后传递一个组<key,valus{}>,调用一次reduce方法
  5. protected void reduce(Text key, Iterable<LongWritable> values,Context context)
  6. throws IOException, InterruptedException {
  7. }
  8. }

(3).WcRunner

  1. public class WcRunner {
  2. public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
  3. //创建配置文件
  4. Configuration conf = new Configuration();
  5. //获取一个作业
  6. Job job = Job.getInstance(conf);
  7. //设置整个job所用的那些类在哪个jar包
  8. job.setJarByClass(WcRunner.class);
  9. //本job使用的mapper和reducer的类
  10. job.setMapperClass(WcMap.class);
  11. job.setReducerClass(WcReduce.class);
  12. //指定reduce的输出数据key-value类型
  13. job.setOutputKeyClass(Text.class);
  14. job.setOutputValueClass(LongWritable.class);
  15. //指定mapper的输出数据key-value类型
  16. job.setMapOutputKeyClass(Text.class);
  17. job.setMapOutputValueClass(LongWritable.class);
  18. //指定要处理的输入数据存放路径
  19. FileInputFormat.setInputPaths(job, new Path("hdfs://192.168.51.149:9000/user/cg/input"));
  20. //指定处理结果的输出数据存放路径
  21. FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.51.149:9000/user/cg/output"));
  22. //将job提交给集群运行
  23. job.waitForCompletion(true);
  24. }
  25. }


三、Map过程

Map过程需要继承org.apache.hadoop.mapreduce包中Mapper类,并重写其map方法。通过在map方法中添加两句把key值和value值输出到控制台的代码,可以发现map方法中value值存储的是文本文件中的一行(以回车符为行结束标记),而key值为该行的首字母相对于文本文件的首地址的偏移量。然后StringTokenizer类将每一行拆分成为一个个的单词,并将<word,1>作为map方法的结果输出,其余的工作都交有MapReduce框架处理。

完整代码与解析如下:

  1. import java.io.IOException;
  2. import org.apache.commons.lang.StringUtils;
  3. import org.apache.hadoop.io.LongWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.Mapper;
  6. /***
  7. *
  8. * @author Administrator
  9. * 1:4个泛型中,前两个是指定mapper输入数据的类型,KEYIN是输入的key的类型,VALUEIN是输入的value的值
  10. * KEYOUT是输入的key的类型,VALUEOUT是输入的value的值
  11. * 2:map和reduce的数据输入和输出都是以key-value的形式封装的。
  12. * 3:默认情况下,框架传递给我们的mapper的输入数据中,key是要处理的文本中一行的起始偏移量,这一行的内容作为value
  13. * 4:key-value数据是在网络中进行传递,节点和节点之间互相传递,在网络之间传输就需要序列化,但是jdk自己的序列化很冗余
  14. * 所以使用hadoop自己封装的数据类型,而不要使用jdk自己封装的数据类型;
  15. * Long--->LongWritable
  16. * String--->Text
  17. */
  18. public class WcMap extends Mapper<LongWritable, Text, Text, LongWritable>{
  19. //重写map这个方法
  20. //mapreduce框架每读一行数据就调用一次该方法
  21. @Override
  22. protected void map(LongWritable key, Text value, Context context)
  23. throws IOException, InterruptedException {
  24. //具体业务逻辑就写在这个方法体中,而且我们业务要处理的数据已经被框架传递进来,在方法的参数中key-value
  25. //key是这一行数据的起始偏移量,value是这一行的文本内容
  26. //1:
  27. String str = value.toString();
  28. //2:切分单词,空格隔开,返回切分开的单词
  29. String[] words = StringUtils.split(str," ");
  30. //3:遍历这个单词数组,输出为key-value的格式,将单词发送给reduce
  31. for(String word : words){
  32. //输出的key是Text类型的,value是LongWritable类型的
  33. context.write(new Text(word), new LongWritable(1));
  34. }
  35. }
  36. }


四、Reduce过程

Reduce过程需要继承org.apache.hadoop.mapreduce包中Reducer类,并重写其reduce方法。Map过程输出<key,values>key为单个单词,而values是对应单词的计数值所组成的列表,Map的输出就是Reduce的输入,所以reduce方法只要遍历values并求和,即可得

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/780722
推荐阅读
相关标签
  

闽ICP备14008679号