- 需求描述
本次实验需基于spark下的RDD的概念理解,通过代码完成实验。RDD叫做弹性分布式数据集,是Spark中最基本的数据抽象。代码中是一个抽象类,它代表一个不可变、可分区、里面的元素可并行计算的集合。从课上可以了解到RDD的属性是由一组分区(Partition),即数据集的基本组成单位;一个计算每个分区的函数;RDD之间的依赖关系;一个Partitioner,即RDD的分片函数;一个列表,存储存取每个Partition的优先位置(preferred location)。其特点生成的RDD不可改变只能通过转换操作性生成一个新的RDD,新的RDD包含了从其他RDD衍生所必需的信息。RDDs之间存在依赖,RDD的执行是按照血缘关系延时计算的。如果血缘关系较长,可以通过持久化RDD来切断血缘关系。RDD的两种算子有两类,一类叫做transformations,它是用来将RDD进行转化,构建RDD的血缘关系;另一类叫做actions,它是用来触发RDD的计算,得到RDD的相关计算结果或者将RDD保存的文件系统中。其缓存:如果在应用程序中多次使用同一个RDD,可以将该RDD缓存起来,该RDD只有在第一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该RDD的时候,会直接从缓存处取而不用再根据血缘关系计算,这样就加速后期的重用。如下图所示,RDD-1经过一系列的转换后得到RDD-n并保存到hdfs,RDD-1在这一过程中会有个中间结果,如果将其缓存到内存,那么在随后的RDD-1转换到RDD-m这一过程中,就不会计算其之前的RDD-0了。
- 环境介绍
使用的是oracle VM virtualBox,虚拟机的操作系统为Ubuntu16.04,Spark版本为2.4.0,Python版本为3.4.3,,虚拟机的内存为6G,hadoop为2.7.1,JDK版本为1.8,使用Mysql数据库,Hbase为1.1.5,Scala为2.11.8,主机为8G内存128固态加1T机械,i5八代,独立显卡为GTX1050ti,使用的win10专业版。
- 数据来源描述
此次数据文件分别为A.txt, Algorithm.txt,B.txt,data.txt,Database.txt,Python.txt六个txt文档,由老师编辑而成,作为我们此次实验的前提内容条件。Adata.txt为”
题一:pyspark交互式编程的实验数据。A.txt,B.txt为“:编写独立应用程序实现数据去重”的实验数据。Algorithm.txt,Database.txt,Python.txt为“题三:编写独立应用程序实现求平均值问题”的实验数据。
其格式如下:
- txt,B.txt(例如:20200101 x)
data,txt(例如:Aaron,OperatingSystem,100)
Database.txt,Python.txt,Algorithm.txt(例如:小明a 92)
- 数据上传及上传结果查看
数据内容有:
题一:pyspark交互式编程
上传数据结果如下:
题二:编写独立应用程序实现数据去重
上传数据结果如下:题三:编写独立应用程序实现求平均值问题
上传数据结果如下:
- 数据处理过程描述
题一:pyspark交互式编程
本作业提供分析数据data.txt,该数据集包含了某大学计算机系的成绩,数据格式如下所示:
Tom,DataBase,80 Tom,Algorithm,50 Tom,DataStructure,60 Jim,DataBase,90 Jim,Algorithm,60 Jim,DataStructure,80 …… |
根据给定的实验数据,在pyspark中通过编程来计算以下内容:
首先进入pyspark:
- 该系总共有多少学生;
- 该系共开设了多少门课程;
- Tom同学的总成绩平均分是多少;
- 求每名同学的选修的课程门数;
- 该系DataBase课程共有多少人选修;
- 各门课程的平均分是多少;
(7)使用累加器计算共有多少人选了DataBase这门课。
题二:编写独立应用程序实现数据去重
对于两个输入文件A和B,编写Spark独立应用程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新文件C。本文给出门课的成绩(A.txt、B.txt)下面是输入文件和输出文件的一个样例,供参考。
输入文件A的样例如下:
20200101 x
20200102 y
20200103 x
20200104 y
20200105 z
20200106 z
输入文件B的样例如下:
20200101 y
20200102 y
20200103 x
20200104 z
20200105 y
根据输入的文件A和B合并得到的输出文件C的样例如下:
20200101 x
20200101 y
20200102 y
20200103 x
20200104 y
20200104 z
20200105 y
20200105 z
20200106 z
实验步骤如下:
1. 文件A和B放置位置,内容如下:
2. 编写Spark独立应用程序c.py,合并AB内容为result
3. 合并成功如下显示:
4. 合并结果内容如下:
题三:编写独立应用程序实现求平均值问题
每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写Spark独立应用程序求出所有学生的平均成绩,并输出到一个新文件中。本文给出门课的成绩(Algorithm.txt、Database.txt、Python.txt),下面是输入文件和输出文件的一个样例,供参考。
- Algorithm成绩:
小明 92
小红 87
小新 82
小丽 90
- Database成绩:
小明 95
小红 81
小新 89
小丽 85
- Python成绩:
小明 82
小红 83
小新 94
小丽 91
- 平均成绩如下:
(小红,83.67)
(小新,88.33)
(小明,89.67)
(小丽,88.67)
实验步骤如下:
1. 文件(Algorithm.txt、Database.txt、Python.txt)放置位置,内容如下:
2. 编写Spark独立应用程序avg.py,求平均值
3. 求平均值成功如下显示:dsfd
4. 平均值结果内容如下:
6、经验总结
- 编辑地址时,file :///(后面需要加三个/)
- RDD:弹性分布式数据集,是Spark上最基本,也是最根本的数据抽象,是只读的、分区记录的集合,是分布式内存的一个抽象概念,它提供了一种高度受限的共享内存模型。
- DAG:有向无环图,它由RDD之间的依赖关系构成,反映了RDD之间的依赖关系。
- stage:阶段,是作业的基本调度单位,一个作业有多个任务,每组任务被成为“阶段”,或者“任务集”。
- 分区:数据集片段,RDD是分布式对象集合,在本质上是只读的,分区记录的集合,所以每个RDD可以分成多个分区,每个分区就是一个数据集片段。
- 宽依赖:一对多。就是存在一个父RDD的一个分区被一个子RDD的多个分区所使用,可以看成是数据分发。
- 窄依赖:一对一,或者多对一。就是当父RDD的一个分区只被一个子RDD的一个分区所使用;或者多个父RDD汇总到一个子 RDD上,可以看成是数据汇总。