云计算技术 实验七 MapReduce编程基础

这篇具有很好参考价值的文章主要介绍了云计算技术 实验七 MapReduce编程基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考资料为:

教材代码-林子雨编著《大数据基础编程、实验和案例教程(第2版)》教材所有章节代码_厦大数据库实验室博客

1.实验学时

4学时

2.实验目的

  • 熟悉MapReduce编程框架。
  • 了解Map部分和Reduce部分的工作原理。
  • 实现简单的MapReduce编程。

3.实验内容

(一)实现词频统计的基本的MapReduce编程。

首先创建两个txt文件。

让后向里面输入想要统计的句子。

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后启动ecplise完成程序编写:

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

首先编写map处理逻辑:(这里选择在windows上先编写,然后在linux上再复现一次)

下面为java代码:此为map处理逻辑

public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
        private static final IntWritable one = new IntWritable(1);
        private Text word = new Text(); 
        public TokenizerMapper() {
        }
        public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString()); 
            while(itr.hasMoreTokens()) {
                this.word.set(itr.nextToken());
                context.write(this.word, one);
            }
        }
    }

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

在map阶段,文件wordfile1.txt和文件wordfile2.txt中的数据被读入,然后以键值对的形式被提交给map函数处理。键值对交给map函数之后,就可以运行自定义的map处理逻辑。

之后编写reduce处理逻辑。

Map阶段处理得到的中间结果,经过shuffle阶段,会分发给对应的reduce任务处理。

下面为java代码,此为reduce任务处理

public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable(); 
        public IntSumReducer() {
        }
        public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            int sum = 0; 
            IntWritable val;
            for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {
                val = (IntWritable)i$.next();
            }
            this.result.set(sum);
            context.write(key, this.result);
        }
    }

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

之后编写main函数

为了使TokenizerMapper类和IntSumReduce类能够正常协同工作,需要在主函数中通过job类设置hadoop程序的运行环境。

下面为java代码,此为main函数

public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        String[] otherArgs = (new GenericOptionsParser(conf, args)).getRemainingArgs();
        if(otherArgs.length < 2) {
            System.err.println("Usage: wordcount <in> [<in>...] <out>");
            System.exit(2);
        }
        Job job = Job.getInstance(conf, "word count");        //设置环境参数
        job.setJarByClass(WordCount.class);                //设置整个程序的类名
        job.setMapperClass(WordCount.TokenizerMapper.class); //添加Mapper类
        job.setReducerClass(WordCount.IntSumReducer.class);  //添加Reducer类
        job.setOutputKeyClass(Text.class);                  //设置输出类型
        job.setOutputValueClass(IntWritable.class);             //设置输出类型 
        for(int i = 0; i < otherArgs.length - 1; ++i) {
            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));  //设置输入文件
        }
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));//设置输出文件
        System.exit(job.waitForCompletion(true)?0:1);
    }

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后是打包程序。

先打开hadoop对应文件夹:

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

将代码传入文件夹之后,使用之前下载的java jar进行编译

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

编译完成之后查看文件夹,多出三个.class文件,然后进行文件的打包。

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后启动hadoop

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后输入命令查看结果:

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

结果:

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

(二)配置eclipse环境,跑词频统计的程序。

先启动eclipse

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

创建新的java工程进行编写程序

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后导入jar包

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后开始编写java程序

先创建新的java类开始编写

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后将之前编写号的代码输入到java文件之中,然后进行运行查看结果。

完整程序:

import java.io.IOException;
import java.util.Iterator;
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 WordCount() {
    }
     public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        String[] otherArgs = (new GenericOptionsParser(conf, args)).getRemainingArgs();
        if(otherArgs.length < 2) {
            System.err.println("Usage: wordcount <in> [<in>...] <out>");
            System.exit(2);
        }
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(WordCount.TokenizerMapper.class);
        job.setCombinerClass(WordCount.IntSumReducer.class);
        job.setReducerClass(WordCount.IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class); 
        for(int i = 0; i < otherArgs.length - 1; ++i) {
            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
        }
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));
        System.exit(job.waitForCompletion(true)?0:1);
    }
    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
        private static final IntWritable one = new IntWritable(1);
        private Text word = new Text();
        public TokenizerMapper() {
        }
        public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString()); 
            while(itr.hasMoreTokens()) {
                this.word.set(itr.nextToken());
                context.write(this.word, one);
            }
        }
    }
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();
        public IntSumReducer() {
        }
        public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            int sum = 0;
            IntWritable val;
            for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {
                val = (IntWritable)i$.next();
            }
            this.result.set(sum);
            context.write(key, this.result);
        }
    }
}

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

查看结果:

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

结果已经呈现出来,然后把java程序打包生成jar包。放到hadoop平台之上运行。

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoopmapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

查看对应文件夹:

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后为了运行,先启动hadoop

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后删除input和output防止出错

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后新建文件

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

由于先前已经将对应文件传入linux,然后可以考虑现将文件上传到hdfs中的/user/Hadoop/input中

然后使用jar命令查看;

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后查看结果:

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

(三)编写MapReduce程序,实现计算平均成绩的程序。

首先编写程序。

程序的主要点是输入三个txt文件,然后计算三个txt文件对应的科目之和的平均值。这里的导入方法与前面相似。

然后先创建新的项目,导入jar包

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后将对应的代码输入java文件中。

注意导入的包的个数问题。

然后导入对应的包:

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后导出jar文件。

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

编写对应的txt文件,设置

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

然后输入./bin/hdfs dfs -cat output*/

注意,这里的名字不能使用单个字符,不然会报错!!!,所以后面改成了多个字符。

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

4.思考题

(一)MapReduce的工作原理是什么?

MapRedece分为两部分,一个是Map函数,一个是Reduce函数。Map函数接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。 Reduce函数接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。

下面是一个图介绍MapReduce的工作流程:

mapreduce编程基础篇实验,云计算,mapreduce,云计算,hadoop

MapReduce库先把user program的输入文件划分为M份(M为用户定义),每一份通常有16MB到64MB,如图左方所示分成了split0~4;然后使用fork将用户进程拷贝到集群内其它机器上。

user program的副本中有一个称为master,其余称为worker,master是负责调度的,为空闲worker分配作业(Map作业或者Reduce作业),worker的数量也是可以由用户指定的。

被分配了Map作业的worker,开始读取对应分片的输入数据,Map作业数量是由M决定的,和split一一对应;Map作业从输入数据中抽取出键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对被缓存在内存中。

缓存的中间键值对会被定期写入本地磁盘,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个Reduce作业;这些中间键值对的位置会被通报给master,master负责将信息转发给Reduce worker。

master通知分配了Reduce作业的worker它负责的分区在什么位置(肯定不止一个地方,每个Map作业产生的中间键值对都可能映射到所有R个不同分区),当Reduce worker把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起。因为不同的键可能会映射到同一个分区也就是同一个Reduce作业(谁让分区少呢),所以排序是必须的。

reduce worker遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。

  当所有的Map和Reduce作业都完成了,master唤醒正版的user program,MapReduce函数调用返回user program的代码。

(二)Hadoop是如何运行MapReduce程序的?

有两个方法,这两个方法的前提是需要启动hadoop才可以运行。
方法一:

将自己的编译软件与hadoop相连(我用的是MyEclipse去链接hadoop),直接运行程序。运行完成之后在输出文件夹就可以查看输出的文件。

方法二:

方法二的话更加复杂,需要将mapreduce程序打包成jar文件。需要在linux上的eclipse编写好程序之后,将程序导出打包,之后执行这个jar文件,在输出文件中查看结果即可。

5.实验结论或体会

1.实验开始编写程序之前,需要将hadoop启动方才可以继续编写程序。

2.程序导出的时候,需要将jar文件导出到相应的hadoop程序的文件夹下,这样方便程序的运行。

3.编写程序的时候,需要将导入的包一一对应,确保所有的包都导入到程序之中。

4.TXT文件需要提前写好,方便运行程序。文章来源地址https://www.toymoban.com/news/detail-753717.html

到了这里,关于云计算技术 实验七 MapReduce编程基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云计算与大数据技术】大数据系统总体架构概述(Hadoop+MapReduce )

    企业级大数据应用框架需要满足业务的需求,一是要求能够满足基于数据容量大,数据类型多,数据流通快的大数据基本处理需求,能够支持大数据的采集,存储,处理和分析,二是要能够满足企业级应用在可用性,可靠性,可扩展性,容错性,安全性和隐私性等方面的基本

    2024年02月09日
    浏览(48)
  • 【云计算与大数据技术】Hadoop MapReduce的讲解(图文解释,超详细必看)

    MapReduce 是一种分布式计算框架,能够处理大量数据 ,并提供容错 、可靠等功能 , 运行部署在大规模计算集群中,MapReduce计算框架采用主从架构,由 Client、JobTracker、TaskTracker组成 用户编写 MapReduce程序,通过Client提交到JobTracker JobTracker负责管理运行的 TaskTracker节点;负责Job的调度

    2024年02月13日
    浏览(43)
  • 实验三-MapReduce编程

    前提:安装好Hadoop 参考文章: MapReduce编程实践(Hadoop3.1.3)_厦大数据库实验室博客 实验要求 实验步骤         1. 启动Hadoop                   2. 上传本地文件至hdfs中         在hdfs中创建存放本地文件的文件夹         将文件上传至hdfs中           (上传结果

    2024年02月06日
    浏览(32)
  • 实验5:MapReduce 初级编程实践

    由于CSDN上传md文件总是会使图片失效 完整的实验文档地址如下: https://download.csdn.net/download/qq_36428822/85709497 实验内容与完成情况: (一)编程实现文件合并和去重操作 对于两个输入文件,即文件 A 和文件 B,请编写 MapReduce 程序,对两个文件进行合并, 并剔除其中重复的内

    2024年02月07日
    浏览(54)
  • Hadoop之MapReduce实现原理-基础篇

    MR诞生于搜索领域,主要是为了解决海量数据处理扩展性差的问题,它的实现时基于谷歌MR的设计思想,包括简化编程接口、提高系统容错性等。 易于编程:用户无需关注数据切片、数据传输、节点间通信等,只需要关注业务逻辑的实现,简化了开发过程且提高了开发效率。

    2024年02月05日
    浏览(47)
  • 大数据技术之Hadoop:MapReduce与Yarn概述(六)

    目录 一、分布式计算 二、分布式资源调度 2.1 什么是分布式资源调度 2.2 yarn的架构 2.2.1 核心架构 2.2.2 辅助架构 前面我们提到了Hadoop的三大核心功能:分布式存储、分布式计算和资源调度,分别由Hadoop的三大核心组件可以担任。 即HDFS是分布式存储组件,MapReduce是分布式计算

    2024年02月09日
    浏览(36)
  • 大数据实战——基于Hadoop的Mapreduce编程实践案例的设计与实现

    图1:MaxCompute MapReduce各个阶段思路设计 设计思路分析分为六个模块:input输入数据、splitting拆分、Mapping映射、Shuffing派发、Reducing缩减、Final result输出。 输入数据:直接读入文本不进行分片,数据项本身作为单个Map Worker的输入。 Map阶段:Map处理输入,每获取一个数字,将数

    2024年02月05日
    浏览(53)
  • 大数据技术之Hadoop:提交MapReduce任务到YARN执行(八)

    目录 一、前言 二、示例程序 2.1 提交wordcount示例程序 2.2 提交求圆周率示例程序 三、写在最后 我们前面提到了MapReduce,也说了现在几乎没有人再写MapReduce代码了,因为它已经过时了。然而不写代码不意味着它没用,当下很火的HIve技术就到了MapReduce,所以MapReduce还是相当重要

    2024年02月08日
    浏览(41)
  • 分布式计算MapReduce | Spark实验

    题目1 输入文件为学生成绩信息,包含了必修课与选修课成绩,格式如下: 班级1, 姓名1, 科目1, 必修, 成绩1 br (注: br 为换行符) 班级2, 姓名2, 科目1, 必修, 成绩2 br 班级1, 姓名1, 科目2, 选修, 成绩3 br ………., ………, ………, ………, ……… br 编写两个Hadoop平台上的MapRed

    2024年02月08日
    浏览(57)
  • 《大数据系统与编程》MapReduce程序实现词频统计实验报告

    MapReduce程序实现词频统计            实验目的 1) 理解Hadoop中MapReduce模块的处理逻辑; 2)熟悉MapReduce编程; 实验平台 操作系统:Linux 工具:Eclipse或者Intellij Idea等Java IDE 实验内容 1) 在电脑上新建文件夹input,并input文件夹中创建三个文本文件:file1.txt,file2.txt,file3.tx

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包