【面试】【Spark】大数据进阶篇(一)

0、问题大纲

一、Spark基础概念
1.1、Spark 概要

1、Spark 1.X与Spark 2.X区别。
 - 追问1:运行效率方面,Spark比MapReduce更高。请说明效率更高来源于Spark内置的哪些机制?

2、Spark与Flink。

3、Sparkstreaming和Flink做实时处理的区别。

1.2、Spark RDD

1、Spark RDD介绍,属性,原理。
 - 追问1:创建rdd几种方式?
 - 追问2:RDD中的数据在哪?
 - 追问3:如果对RDD进行cache操作后,数据在哪里?
 - 追问4:cache和checkPoint的区别?

2、RDD,DataFrame,DataSet的区别?
 - 追问1:创建Dateset几种方式
 - 追问2:三者联系、转化?
 - 追问3:三者优缺点?

3、RDD支持哪几种类型的操作/算子分类?
 - 追问1:Transformation有哪些算子,其作用是?
 - 追问2:Action有哪些算子,其作用是?
 - 追问3:map和flatMap的区别(x2)和应用场景?
 - 追问4:sortBy 和 sortByKey的区别?
 - 追问5:groupBy和groupBykey的区别?
 - 追问6:groupBykey和reduceByKey的区别?
 - 追问7:cartesian和join的区别?
 - 追问8:聚合算子aggregate作用?……

4、Spark中RDD与Partition的区别
 - 追问1:Block VS Partition?

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做实时处理的区别。

……

1.2、Spark RDD

1、Spark RDD介绍,属性,原理。

  1. 介绍:RDD(Resilient Distributed Dataset):弹性分布式数据集,Spark最基本的数据抽象。

  2. 特性

  • 分片(partitions):数据集基本组成单元;
  • 计算函数(computer(p, context)):RDD的每个partition有function,可实现RDD间partition转换;
  • 依赖(dependencies()):RDD间存在依赖关系;
  • 分区器(partitioner()):RDD的分片函数
  • 本地性(preferredLocations()):送达存储位置计算;
  1. 举例:WordCount粗图解RDD
    3
追问1:创建rdd几种方式?
  1. 集合并行化创建
val arr = Array(1,2,3,4,5)
val rdd = sc.parallelize(arr)
val rdd =sc.makeRDD(arr)
  1. 读取外部文件系统。 如hdfs,或者读取本地文件(最常用的方式)
val rdd2 = sc.textFile("hdfs://hdp-01:9000/words.txt")
// 读取本地文件
val rdd2 = sc.textFile(“file:///root/words.txt”)
  1. 从父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 了, 就无需再算一遍, 对性能有极大的提升。

2、RDD,DataFrame,DataSet的区别?

  • 1)RDD:不可变分布式元素集合,在集群中跨节点分布。

  • 2)DataFrame:以RDD为基础的分布式数据集,类似二维表格。

  • 3)DataSet:强类型的特定领域对象。每个DataSet都有一个DataFrame的非类型化视图,视图是行的数据集。

  • 4)RDD VS DataFrame

4

相同 不同
不可变分布式数据集 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都能,反之不行。

转换:
1

追问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。

3、RDD支持哪几种类型的操作/算子分类?

答:[主要来自参考9]

  • Transformation:lazy特性,不会真正执行。
  • Action:程序遇到这种种类型算子会真正执行。
    注:lazy特性 - 延迟加载,形成计算链,减少中间结果浪费。
追问1:Transformation有哪些算子,其作用是?
Transformation 作用 说明
map 原RDD每个元素与新元素产生一一映射。
flatMap 原RDD每个元素通过函数转换新的多个元素,然后放入一个集合,构成新的RDD。
filter 过滤。
union 合并相同类型RDD,不去重。
distinct 去重。
cartesian 返回两个RDD笛卡儿积。
groupBy 将元素生成相应Key,数据转化为Key-Value格式,之后将Key相同元素分为一组。
groupByKey 对RDD中的数据进行分组操作,在一个由(K, V)键值对组成的数据集上调用,返回一个(K, Seq[V])对的数据集。
sortBy 对RDD每个元素按照给定条件排序。
sortByKey 对RDD每个元素按照Key进行排序。
ReduceByKey 对RDD每个元素对按照Key进行聚合操作。
join 每个RDD元素进行join操作,将两个RDD具有相同key元素
value 对两个RDD中的每个元素对进行join操作,将具有相同的key的元素的value进行笛卡尔积,返回(key,(value1,value2))类型的值
追问2:Action有哪些算子,其作用是?
Action 作用 说明
foreach 对RDD中每个元素自定义操作,如逐个打印
saveAsTextFile 保存数据至HDFS指定目录
collect 将分布式RDD返回为单机scala Array数组
count 返回RDD元素个数
追问3:map和flatMap的区别(x2)和应用场景?

答:map是对每一个元素进行操作,flatmap是对每一个元素操作后并压平。
2

追问4:sortBy 和 sortByKey的区别
sortBy既可以作用于RDD[K] ,还可以作用于RDD[(k,v)]
sortByKey  只能作用于 RDD[K,V] 类型上。

5

追问5:groupBy和groupBykey的区别6
追问6:groupBykey和reduceByKey的区别?

reduceByKey 会有一个分区内聚合,更高效,一般在大量数据计算优先使用;如果仅仅group,优先用groupByKey。

5

追问7:cartesian和join的区别?

6

追问8:聚合算子aggregate作用?

……

4、Spark中RDD与Partition的区别

答:Spark中Partition分布在各个节点,最小单元,多个Partition共同组成RDD。同一份数据(RDD)的Partition大小不一,数量不定,根据application里算子和最初数据分块数量决定。这也是为什么叫弹性分布式数据集的原因之一。

追问1:Block VS Partition?

答:HDFS中block是最小存储单元,大小固定,有冗余;而partition是RDD最小计算单元,不固定,无冗余,丢失后可重新计算。

四、参考

1、2020大数据面试题真题总结(附答案)
2、Spark比拼Flink:下一代大数据计算引擎之争,谁主沉浮?
3、Spark2.x 与 Spark1.x 关系
4、spark2.x比spark1.x做了哪些改进
5、Spark学习之路 (三)Spark之RDD
6、Spark 的核心概念 RDD
7、RDD、DataFrame和DataSet区别
8、Spark中的RDD、DataFrame和DataSet讲解
9、【Spark系列2】reduceByKey和groupByKey区别与用法
10、怎样理解spark中的partition和block的关系?

猜你喜欢

转载自blog.csdn.net/HeavenDan/article/details/112431164