( 2022 -2023 学年第 1 学期)
信息工程学院 班(年)级 课程 云计算与云存储
题目 | 一 | 二 | 三 | 四 | 五 | … | 总分 |
得分 | |||||||
阅卷人 |
一、单项选择题(每题 3 分,共 21 分)
1.OpenStack 是一个由NASA(美国国家航空航天局)和 Rackspace 合作研发并发起的,以 Apache 许可证授权的自由软件和开放源代码项目。openstack 技术属于()架构的实现。(A )
(A)基础设置即服务; (B)平台即服务;
(C)软件即服务; (D)硬件即服务;
2.云端资源只给两个或者两个以上的特定单位组织内的员工使用,除此之外的人和机构都无权租赁和使用云端计算资源,例如,深圳地区的酒店联盟组建的关于酒店方面的云服务,这种云服务属于(B)
(A)私有云; (B)社区云;
(C)公有云; (D)混合云;
3.下列哪个支持将 RDD 数据长久地保存在磁盘文件中进行数据重用 (B)
(A)cache() ; (B)checkpoint();
(C)persist (); (D)memory();
4.软件架构的演变过程很漫长,经历了几十年发展,主要经历了从()的过程。(A)
(A)单体架构-分布式架构-SOA 架构-微服务架构
(B)分布式架构-单体架构-微服务架构- SOA 架构
(C)单体架构-微服务架构-分布式架构-SOA 架构
(D)分布式架构- SOA 架构-单体架构-微服务架构
5.当需要比较多个服务器在不同长度的时间段内的性能时,由于不同组数据的测量尺度相差太大,或者数据量纲的不同,使用()指标可以较好地消除测量尺度和量纲对结果的影响。 ( C)
(A)平均值; (B)方差;
(C)变异系数; (D)标准差;
6.软件系统的高可靠性(也称为可用性,英文描述为 HA,High Available)里有个衡量其可靠性的标准——9 的个数。5 个 9 表示在该软件系统在连续运行 1 年时间里最多可能的业务中断时间是 ( D)
(A)87.6 小时; (B)8.76 小时;
(C)52.6 分钟; (D)5.26 分钟;
7.将键值对 RDD 中具有相同键的元素进行分组,可以使用什么操作: (B)
(A)sortByKey(); (B)groupByKey();
(C)reduceByKey(); (D)keys();
二、多项选择题(每题 4 分,共 8 分)
1.Spark 的设计遵循“一个软件需要满足不同应用场景”的理念,逐渐形成了一套完整的生态系统,可以支持以下哪些操作计算: (ABCD)
(A)图计算(GraphX); (B)SQL 即席查询(Spark SQL);
(C)机器学习(MLlib); (D)流式计算(Spark Streaming);
2.spark 的部署模式有: (ABCD)
(A)本地模式; (B)standalone 模式;
(C)spark on yarn 模式; (D)mesos 模式;
三、简答题(每题 10 分,共 60 分)
- 1. 云计算技术主要有三个显著特点:资源池化,弹性伸缩,安全可靠,分别对这三个特点进行简要的描述(10 分)。
- 资源池化: “云”具有相当的规模,支持用户在任意位置、使用各种终端获取应用服务。所请求的资源来自“云”,而不是固定的有形的实体。
- 云计算不针对特定的应用,同一个“云”可以同时支撑不同的应用运行, “云”的规模可以动态伸缩,满足应用和用户规模增长的需要。
- 安全可靠:“云”使用了数据多副本容错、计算节点同构可互换等措施来保障服务的高可靠性,使用云计算比使用本地计算机可靠。
- 2. RDD 之间的依赖关系可以分为窄依赖和宽依赖,请对窄依赖和宽依赖分别进行介绍并举例说明(10 分)。
窄依赖:是指每个父RDD的一个Partition最多被子RDD的一个Partition所使用,例如map、 filter、union等操作都会产生窄依赖;(独生子女)
宽依赖:是指一个父RDD的Partition会被多个子RDD的Partition所使用,例如groupByKey、 reduceByKey、sortByKey等操作都会产生宽依赖;(超生)
- 3. RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。请简要介绍 RDD 的 5 个核心属性(10 分)
- RDD是由一系列partition组成。(block块对应partition),textFile底层调用的是MR读取hdfs上的数据的方法默认一个block块对应一个split,split的大小和block大小一致,可以自己调整。
- 函数作用在每一个partition(split)上。
- RDD之间有一系列的依赖关系(容错机制)。
- 分区器作用在K,V格式的RDD上。
- 提供一系列最佳的计算位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。
- 4. RDD 通过缓存或者检查点技术将前面的计算结果持久化,,并供后面的 RDD 反复用。请简要说明cache,persist 和checkpoint 这 3 种持久化技术的区别。(10 分)。
- Cache 缓存只是将数据临时保存起来。Cache 缓存的数据通常存储在内存,可靠性低。不切断血缘依赖,只会在血缘关系中添加新的依赖,一旦出现问题,可以重头读取数据。
- persisit:将数据临时存储在磁盘文件中进行数据重用,涉及到磁盘IO,性能较低,但是数据安全。如果作业执行完毕,临时保存的数据文件就会丢失。
- CheckPoint:将数据长久地保存在磁盘文件中进行数据重用,涉及到磁盘IO,性能较低,但是数据安全。为了包装数据安全,一般情况下会把当前需要持久化的RDD重新创建并保存。
- Checkpoint 检查点会切断血缘依赖,重新建立新的血缘关系。
- cache 机制是每计算出一个要 cache 的 partition 就直接将其 cache 到内存了。但 checkpoint是等到 job 结束后另外启动专门的 job 去完成 checkpoint 。
- 5. Hadoop 的 MR 框架和Spark 框架都是数据处理框架,请简要说明它们关系,以及我们在使用时候如何选择 (10 分)。
- Spark把运算中数据放到内存中,迭代计算效率会更高;MR的中间结果需要落地磁盘,所以大量的磁盘IO操作,会影响性能
- MR是基于进程,Spark是基于线程。MR是多进程单线程模型,而Spark是多进程多线程模型;此外,Spark是粗粒度资源申请模式,而MR是细粒度资源申请模式
- Spark容错性高,它通过弹性分布数据集RDD来实现高容错,RDD是一组分布式存在节点内存中只读性的数据,这些集合是弹性,某一部分数据丢失或出错,可以通过整个数据集的计算流程的血缘来实现重建;MR的容错需要重新计算,成本高。
- Spark更加通用,Spark提供了transformation和action这两大类多功能API,另外还有流式处理SparkStreaming模块,机器学习、图计算;MR只提供Map和Reduce方法,没有其他模块,MR其实是有机器学习的基本上没有人使用。
- Spark框架的生态更加丰富,首先由RDD、血缘Lineage,执行时有有向无环图DAG,Stage划分等等,很多时候Spark作业需要在不同场景上运行,此时可以根据不同场景进行调优;MR计算框架相对简单,对性能也相对较弱,单运行稳定,适合长时间在后台运行。
- 6. Spark 包含 5 大核心模块,请对每个模块进行简要介绍(10 分)。
1、Spark Core:包含了 Spark 最核心与基础的功能,为其他 Spark 功能模块提供了核心层 的支撑,可类比 Spring 框架中的 Spring Core。
2、Spark SQL:官方文档的介绍如下图,Spark SQL 适用于结构化表和非结构化数据的查 询,并且可以在运行时自适配执行计划,支持 ANSI SQL(即标准的结构化查询语言)。
3、Spark Streaming:是 Spark 平台上针对实时数据进行流式计算的组件,而流式数据指的 是实时或接近实时的时效性处理的大数据流,常见的流式数据处理使用Spark、Storm和 Samza等框架。
4、Spark MLlib:是 Spark 提供的一个机器学习算法库。MLlib 不仅提供了模型评估、数据 导入等额外的功能,还提供了一些更底层的机器学习原语。
5、Spark GraphX:是 Spark 面向图计算提供的框架与算法库。
四、编程题 (每题 11 分,共 11 分)
1.有一组键值对("Spark",5),("Hadoop",3),("Scala",4),("Spark",3),("Hadoop",1),键值对的 key 表示图书名称,value 表示某天图书的销量,编程计算每个键对应的平均值,即计算每种图书当天的平均销量,将每本图书的平均销量打印到控制台。(10 分)
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object WordCount {
def main(args: Array[String]): Unit = {
val sparkConf =new SparkConf().setMaster("local").setAppName("WordCount")
val sc= new SparkContext(sparkConf)
val datas: RDD[(String,Int)] = sc.makeRDD(
List(("Spark",5),("Hadoop",3),("Scala",4),("Spark",3),("Hadoop",1)),5)
val a = datas.groupByKey() //按key分组 (张三,CompactBuffer(78, 80, 88))
.map(x => {
var num = 0
var sum = 0
for (i <- x._2) {
sum = sum + i
num = num + 1
}
val avg = sum / num
(x._1, avg)
})
a.collect.foreach(x => println(x._1+"\t"+x._2))
//关闭连接
sc.stop()
}}