分布式计算MapReduce | Spark实验

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

一、实验内容

题目1

输入文件为学生成绩信息,包含了必修课与选修课成绩,格式如下:

班级1, 姓名1, 科目1, 必修, 成绩1 <br> (注:<br>为换行符)

班级2, 姓名2, 科目1, 必修, 成绩2 <br>

班级1, 姓名1, 科目2, 选修, 成绩3 <br>

………., ………, ………, ………, ……… <br>

编写两个Hadoop平台上的MapReduce程序,分别实现如下功能:

  1. 计算每个学生必修课的平均成绩。

  2. 按科目统计每个班的平均成绩。

题目2

输入文件的每一行为具有父子/父女/母子/母女/关系的一对人名,例如:

Tim, Andy <br>

Harry, Alice <br>

Mark, Louis <br>

Andy, Joseph <br>

…………, ………… <br>

假定不会出现重名现象。

  1. 编写Hadoop平台上的MapReduce程序,找出所有具有grandchild-grandparent关系的人名组。

题目3

输入文件为学生成绩信息,包含了必修课与选修课成绩,格式如下:

班级1, 姓名1, 科目1, 必修, 成绩1 <br> (注:<br> 为换行符)

班级2, 姓名2, 科目1, 必修, 成绩2 <br>

班级1, 姓名1, 科目2, 选修, 成绩3 <br>

………., ………, ………, ………, … <br>

编写一个Spark程序,同时实现如下功能:

  1. 计算每个学生必修课的平均成绩。
  2. 统计学生必修课平均成绩在:90100,8089,7079,6069和60分以下这5个分数段的人数。

二、设计思想

题目1

1. 计算每个学生必修课的平均成绩

  Map阶段:

  (1) 预处理。对txt文档的每一行,先用split函数将其用","分隔成若干字符串,并存于数组splited中。

  (2) 过滤。由于成绩文档的每一行形如“班级,姓名,课程名,性质,分数”,而我们需要统计学生的必修课平均分,因此可以用splited[3].equals("必修")的条件过滤掉选修课所在的行。

  (3) 设置Map的输出格式。由于我们是对每个学生求一个平均分,故思路很直接:让Map阶段的输出是形如<“姓名”: 成绩>的kv对。其中学生姓名字符串和成绩字符串可分别从splited[1]、splited[4]直接得到。

  Reduce阶段:

  (1) 观察Shuffling阶段的输出。根据我们上面设置的Map阶段输出,可以得知:Shuffling后单个学生的所有必修课成绩已被归并至一个列表中,作为以该生的姓名为key的键值对的value。

  (2) 求平均成绩。对于每个学生,我们可以遍历他的value列表并求出他的所有必修课总分。该过程涉及到数据类型的转换,如sum += Integer.valueOf(grade.toString());。在得到总分之后,直接除以该生的成绩条目个数(用i自增1得到)即可得到他的平均成绩。

  (3) 设置Reduce的输出格式。这里我简单地用String.format("%.2f", avg);设置了输出成绩小数点后保留两位小数。我将Reduce的输出设置为形如<“姓名”: 必修课平均成绩>的格式。

2. 按科目统计每个班的平均成绩

  Map阶段:

  (1) 预处理。对txt文档的每一行,先用split函数将其用","分隔成若干字符串,并存于数组splited中。

  (2) 设置Map的输出格式。题目要求按科目统计每个班的平均成绩,只要我们将“科目”和“班级”这两个字段看成是一个字段,就可以直接套用计算学生平均成绩的方法来求解本题。因此,这里我将Map阶段的输出设置为形如<“科目 班级”: 成绩>,其中科目、班级、成绩的字符串均和上面的实验类似,可直接从splited[0]、splited[2]、splited[4]得到。

  Reduce阶段:

  (1) 观察Shuffling阶段的输出。根据我们上面设置的Map阶段输出,可以得知:Shuffling后各班各科目的成绩均已被归并至一个列表中,形如<“科目 班级”: [成绩1, 成绩2, …, 成绩m]>,其中m是该班级考这门课的人数。

  (2) 求平均成绩。对于每个"科目 班级"键,我们可以遍历其value列表来求出该班级所有学生在这门课的总成绩。该过程涉及到数据类型的转换。在得到总分之后,直接除以该班考这门课的学生个数(用i自增1得到)即可得到该班在该科目的平均成绩。

  (3) 设置Reduce的输出格式。这里我简单地用String.format("%.1f", avg);设置了输出成绩小数点后保留一位小数。我将Reduce的输出设置为形如<“科目 班级”: 平均成绩>的格式。

题目2

  Map阶段:

  (1) 预处理。对txt文档的每一行,先用split函数将其用","分隔成若干字符串,并存于数组splited中。splited[0]为父母姓名,splited[1]为子女姓名。

  (2) 设置Map的输出格式。由于我的目的是让任务经过Shuffling阶段后生成类似<“某人姓名”: [“父亲姓名”, “母亲姓名”,“儿子姓名”]>这样的输出,因此我将Map阶段的输出设置为对于原始数据的每一行,输出两个kv对:一个是以该行的splited[0]为键,splited[1]为值,这么做可以保证Shuffling之后得到以某人姓名为键,其所有子女姓名为值的kv对;另一个是以该行的splited[1]为键,splited[0]为值(因为一个人他可能既有父母的身份,也有子女的身份),这么做可以使得Shuffling之后得到以某人姓名为键,其父母姓名为值的kv对。因为Shuffling会把所有同键的value聚集到一个列表中,因此不难发现Shuffling后我们可以得到以某人姓名为键,其子女、父母姓名为值的kv对。此外,为了便于Reduce阶段将父母姓名和孩子姓名分别存入列表中,我在Map阶段设置context.write时将孩子姓名开头加上“0”,将父母姓名开头加上“1”。

  Reduce阶段:

  (1) 观察Shuffling阶段的输出。根据上述分析可知:Shuffling后我们可以得到以某人姓名为键,其子女、父母姓名为值的kv对,即形如<“某人姓名”: [“父亲姓名”, “母亲姓名”,“儿子姓名”]>的kv对

  (2) 构造grandparents和grandchildren列表。遍历当前key的value列表,若姓名以0开头,则将该姓名加入到grandchildren中,否则加入到grandparents中。

  (3) 设置Reduce的输出格式。题目要求我们输出所有具有grandchild-grandparent关系的人名组。因此,只需要写一个二重循环,遍历grandchildren和grandparents列表,输出所有可能的以grandchild姓名为键,grandparent姓名为值的kv对即可,因为可以肯定grandparents列表中的所有人必定是grandchild列表中所有人的祖辈。

题目3

  (1) 利用filter方法过滤掉不是必修课的行。

  (2) 利用map方法将一行数据映射为一个<姓名: (成绩, 1)>对,其中用到了split方法分割出若干字段。

  (3) 利用reduceByKey方法将所有同key项聚合起来,聚合方式为所有同key的value的第一分量相加,得到一个学生的总必修成绩,同时将同key的value的第二分量相加,得到该学生修的必修课总数。然后,利用mapValues方法求出每个学生的平均成绩,即:将(总必修成绩, 必修课程数)这一value映射为该学生的平均成绩,方式为用总成绩除以必修课程数。

  (4) 通过上述步骤我们已经求得了每个学生的必修课均分。先将各学生的<“姓名”: 必修课均分>kv对用map方法映射为<“分段”: 1>,然后再用reduceByKey方法将所有同分段的学生聚集起来,求出各分段的人数。

三、实验结果

(1) 输入命令hadoop fs -cat /output1/part-r-00000查看实验1功能1的程序执行结果:分布式计算MapReduce | Spark实验
(2) 输入命令hadoop fs -cat /output2/part-r-00000查看实验1功能2的程序执行结果:分布式计算MapReduce | Spark实验
输入命令hadoop fs -cat /output3/part-r-00000查看实验2的程序执行结果,结果的第一列是孙辈姓名,第二列是与之对应的祖辈姓名:分布式计算MapReduce | Spark实验
输入命令hadoop fs -cat /user/root/avg_grades/part-00000查看实验3的程序执行结果,这里我将所有学生的必修课平均成绩保留到了整数位,且进行了升序排列。
分布式计算MapReduce | Spark实验
输入命令hadoop fs -cat /user/root/interval_stu_nums/part-00000可查看各分段的学生人数统计结果,这里我输出的结果是按key升序排列的结果。
分布式计算MapReduce | Spark实验

四、遇到的问题及解决方法

  1. 一开始我尝试使用第一种方法搭建实验环境,前面的步骤都很顺利,但是ssh连接远程主机sandbox一直提示connection refused或者是Connection closed by remote host。由于一开始不知道是client-node频繁重启造成的原因,所以去检查本机的ssh服务等是否有问题。我尝试ssh连接自己的主机,但是发现连接不上,搜了解决方案后安装了Windows的OpenSSH服务器和客户端,并且在系统的“服务”中设置了OpenSSH SSH Server的启动类型为自动,这才解决了SSH连接方面的问题。后来导入了老师发的clientnode镜像文件,解决了client-node频繁重启的问题,但由于这时候方法二已经跑通了,故放弃了继续进行方法一的环境搭建。

  2. 在hadoopspark目录下执行docker-compose up -d失败,原因是本地未开启docker服务,开启后成功解决。

  3. 在分布式文件系统 HDFS 中创建子目录时,使用老师文档中给的hadoop fs –mkdir test提示hdfs://localhost:9000/user/root': No such file or directory。后来多次尝试后发现在要创建的子目录名前加"/"即可成功创建:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MQ5583kt-1659514943855)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20220611151838639.png)]

  4. 在写MapReduce程序时,我先是对着老师写的例程观摩了一番,然后准备在此基础上进行修改,以使之符合实验要求。一开始我想将context.write的value的类型改成Text(字符串),但是发现有多处报错,后来查阅资料得知需要相应地修改Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>类的out的数据类型和job.setMapOutputValueClass();的参数,使其均与Text类型一致才行。

  5. 在编写寻找祖孙关系的程序时,我查看了child-parent.txt文档,发现假设第一列是父母的话,会出现一个人有五六个父母的情况,这是不现实的,因此我将第二列当成父母,第一列当成子女进行了程序编写。

  6. 在编写pyspark程序时,由于一开始还不太能掌握编写技巧,因此我先对着网上的例程学习了基本的filter、map、mapValues、reduceByKey等方法的使用要点,并且逐步将这些方法运用在测试数据上,然后观察hadoop平台的运行结果,再根据结果不断调整代码,最终完成了程序编写。

  7. 在提交程序至hadoop平台运行之前,若输入的命令中把要处理的文档写错了(比如child-parent.txt写成grades.txt)则会导致输出的文档大小为0B,因此在输入命令时一定要小心而细致。

源码:分布式计算MapReduce实验 + 分布式计算Spark实验文章来源地址https://www.toymoban.com/news/detail-476727.html

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

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

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

相关文章

  • 分布式计算框架:Spark、Dask、Ray 分布式计算哪家强:Spark、Dask、Ray

    目录 什么是分布式计算 分布式计算哪家强:Spark、Dask、Ray 2 选择正确的框架 2.1 Spark 2.2 Dask 2.3 Ray 分布式计算是一种计算方法,和集中式计算是相对的。 随着计算技术的发展, 有些应用需要非常巨大的计算能力才能完成,如果采用集中式计算,需要耗费相当长的时间来完成

    2024年02月11日
    浏览(70)
  • 分布式内存计算Spark环境部署与分布式内存计算Flink环境部署

    目录 分布式内存计算Spark环境部署 1.  简介 2.  安装 2.1【node1执行】下载并解压 2.2【node1执行】修改配置文件名称 2.3【node1执行】修改配置文件,spark-env.sh 2.4 【node1执行】修改配置文件,slaves 2.5【node1执行】分发 2.6【node2、node3执行】设置软链接 2.7【node1执行】启动Spark集群

    2024年02月08日
    浏览(76)
  • Spark分布式内存计算框架

    目录 一、Spark简介 (一)定义 (二)Spark和MapReduce区别 (三)Spark历史 (四)Spark特点 二、Spark生态系统 三、Spark运行架构 (一)基本概念 (二)架构设计 (三)Spark运行基本流程 四、Spark编程模型 (一)核心数据结构RDD (二)RDD上的操作 (三)RDD的特性 (四)RDD 的持

    2024年02月04日
    浏览(68)
  • 分布式计算框架:Spark、Dask、Ray

    目录 什么是分布式计算 分布式计算哪家强:Spark、Dask、Ray 2 选择正确的框架 2.1 Spark 2.2 Dask 2.3 Ray 分布式计算是一种计算方法,和集中式计算是相对的。 随着计算技术的发展, 有些应用需要非常巨大的计算能力才能完成,如果采用集中式计算,需要耗费相当长的时间来完成

    2024年02月06日
    浏览(46)
  • 【Spark分布式内存计算框架——Spark 基础环境】1. Spark框架概述

    第一章 说明 整个Spark 框架分为如下7个部分,总的来说分为Spark 基础环境、Spark 离线分析和Spark实时分析三个大的方面,如下图所示: 第一方面、Spark 基础环境 主要讲述Spark框架安装部署及开发运行,如何在本地模式和集群模式运行,使用spark-shell及IDEA开发应用程序,测试及

    2024年02月11日
    浏览(67)
  • 云计算与大数据第16章 分布式内存计算平台Spark习题

    1、Spark是Hadoop生态(  B  )组件的替代方案。 A. Hadoop     B. MapReduce        C. Yarn             D.HDFS 2、以下(  D  )不是Spark的主要组件。 A. Driver      B. SparkContext       C. ClusterManager D. ResourceManager 3、Spark中的Executor是(  A  )。 A.执行器      B.主节

    2024年02月14日
    浏览(118)
  • 分布式计算实验4 随机信号分析系统

    利用MOM消息队列技术实现一个分布式随机信号分析系统,具体要求: 1.随机信号产生器微服务每隔100毫秒左右就产生一个正态分布的随机数字,并作为一个消息发布。 2.一个随机信号统计分析微服务,对信号进行如下分析:   (1) 计算过去N个随机信号的均值和方差(N为常量

    2023年04月25日
    浏览(48)
  • 如何使用Spark/Flink等分布式计算引擎做网络入侵检测

    ⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿 个人网站:https://jerry-jy.co/ 本篇博客是我在做 基于Spark/Flink大数据环境下网络入

    2024年02月11日
    浏览(51)
  • 分布式计算中的大数据处理:Hadoop与Spark的性能优化

    大数据处理是现代计算机科学的一个重要领域,它涉及到处理海量数据的技术和方法。随着互联网的发展,数据的规模不断增长,传统的计算方法已经无法满足需求。因此,分布式计算技术逐渐成为了主流。 Hadoop和Spark是目前最为流行的分布式计算框架之一,它们都提供了高

    2024年01月23日
    浏览(57)
  • 分布式计算实验3 基于PRC的书籍信息管理系统

      利用RPC技术实现一个书籍信息管理系统,具体要求:   1.客户端实现用户交互,服务器端实现书籍信息存储和管理。客户端与服务器端利用RPC机制进行协作。中间件任选。   2.服务器端至少暴露如下RPC接口∶    · bool add(Book b) 添加一个书籍对象。    · Book quer

    2023年04月12日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包