问题大纲
- 一、Spark
- 1.1、Spark基础
- 1.2、Spark进阶
一、Spark
1.1、Spark基础
1、Spark 1.X与Spark 2.X区别。
- 1)性能:优化Spark内存和CPU使用,逼近物理机器性能极限。
- 2)功能:Spark SQL–统一DataFrame和DataSet API,支持SQL 2003;Spark Streaming–引入Structured Streaming、Spark MILib 2.0诞生。
追问1:运行效率方面,Spark比MapReduce更高。请说明效率更高来源于Spark内置的哪些机制?
2、Spark与Flink。
Spark可提供高速批处理和微批处理模式的流处理,Flink的批处理很大程度是对流处理的扩展。
3、Sparkstreaming和Flink做实时处理的区别。
……
4、Spark RDD介绍,属性,原理。
-
介绍:RDD(Resilient Distributed Dataset):弹性分布式数据集,Spark最基本的数据抽象。
-
特性:
- 分片(partitions):数据集基本组成单元;
- 计算函数(computer(p, context)):RDD的每个partition有function,可实现RDD间partition转换;
- 依赖(dependencies()):RDD间存在依赖关系;
- 分区器(partitioner()):RDD的分片函数
- 本地性(preferredLocations()):送达存储位置计算;
- 举例:WordCount粗图解RDD
追问1:创建rdd几种方式?
- 集合并行化创建
val arr = Array(1,2,3,4,5)
val rdd = sc.parallelize(arr)
val rdd =sc.makeRDD(arr)
- 读取外部文件系统。 如hdfs,或者读取本地文件(最常用的方式)
val rdd2 = sc.textFile("hdfs://hdp-01:9000/words.txt")
// 读取本地文件
val rdd2 = sc.textFile(“file:///root/words.txt”)
- 从父RDD(调用Transformation类方法)转换成新的子RDD。
追问2:RDD中的数据在哪?
在数据源。RDD只是一个抽象的数据集,我们通过对RDD的操作就相当于对数据进行操作。
追问3:如果对RDD进行cache操作后,数据在哪里?
第一次执行cache算子时会被加载到各个Executor进程的内存中,第二次就会直接从内存读取。
追问4:cache和checkPoint的区别?
- 比较:cache把RDD计算完放在内存中, 但依赖链不能丢掉,如果节点宕掉,上面cache 的RDD就会丢掉, 需要重新计算;而 checkpoint 是把 RDD 保存在 HDFS中, 是多副本可靠存储,所以会丢掉依赖链。
- 综合:都是做RDD持久化,因为checkpoint需要把 job 重新从头算一遍, 最好先cache一下, checkpoint就可以直接保存缓存中的 RDD 了, 就无需再算一遍, 对性能有极大的提升。
5、RDD,DataFrame,DataSet的区别?
-
1)RDD:不可变分布式元素集合,在集群中跨节点分布。
-
2)DataFrame:以RDD为基础的分布式数据集,类似二维表格。
-
3)DataSet:强类型的特定领域对象。每个DataSet都有一个DataFrame的非类型化视图,视图是行的数据集。
-
4)RDD VS DataFrame
相同 | 不同 |
---|---|
不可变分布式数据集 | DataFrame数据集都是按指定列存储,即结构化数据,类似表。 |
- 5)RDD VS DataSet
相同 | 不同 |
---|---|
- | DataSet是特定域对象集合,而RDD是任何对象集合。 |
- | DataSet是强类型,可以用来优化,RDD不行。 |
- 6)DataFrame VS DataSet
相同 | 不同 |
---|---|
- | DataFrame弱类型,执行时进行类型检测;DataSet强类型,编译时检测。 |
- | DataFrame采用Java序列号/kyro序列化;DataSet通过Encoder序列化,支持动态生成代码,直接在bytes层面进行排序。 |
追问1:创建Dateset几种方式
……
追问2:三者联系、转化?
联系:DataFrame和DataSet在Spark 2.X实现了API统一。RDD更偏底层抽象,DataFrame/DataSet在上面做了一次封装优化,使用更方便。功能上RDD更强大,DataFrame/DataSet能做的RDD都能,反之不行。
转换:
追问3:三者优缺点?
对象 | 优点 | 缺点 |
---|---|---|
RDD | 1)强大:内置很多函数操作,方便处理结构化或非结构化数据。 2)面向对象编程,类型转换安全。 | 1)结构化数据(SQL)处理麻烦。2)Java序列化开销大。3)数据存储在Java堆内存,GC频繁。 |
DataFrame | 1)结构化数据处理方便。2)针对性优化。序列号不需带元信息,数据在堆外存中,减少了GC次数。3)Hive兼容,支持HQL、UDF等。 | 1)编译时不能进行安全检测。2)对象支持不友好。内存存储ROW对象,而不能时自定义对象。 |
DataSet | 1)支持结构化&非结构化数据。2)支持自定义对象查询。3)堆外内存存储,GC友好。4)类型转化安全,代码优好。 | - |
- 官方建议使用DataSet。
6、Spark中RDD与Partition的区别
答:Spark中Partition分布在各个节点,最小单元,多个Partition共同组成RDD。同一份数据(RDD)的Partition大小不一,数量不定,根据application里算子和最初数据分块数量决定。这也是为什么叫弹性分布式数据集的原因之一。
追问1:Block VS Partition?
答:HDFS中block是最小存储单元,大小固定,有冗余;而partition是RDD最小计算单元,不固定,无冗余,丢失后可重新计算。
1.2、Spark进阶
1、Spark中广播变量是什么,作用?
广播变量可以将一些共享数据或大变量缓存在Spark集群中,而不用每个task都copy一个副本,后续计算可重复使用,减少网络传输,提高性能。
补充:
1、广播变量只读,保证数据一致性。
2、相比Hadoop分布式缓存,广播内存可以跨作业共享。
追问1:累加器是什么?
累加器可以进行全局汇总,拥有分布式计数的功能。
注意:只有Driver能取到累加器值,Task端是累加操作。
追问2:Hadoop中job和Tasks的区别是什么?
答:Job是我们对一个完整MapReduce程序的抽象封装,Task是job运行时,每一个处理阶段的具体实例,如map task,reduce task,maptask和reduce task都会有多个并发运行的实例。