没有合适的资源?快使用搜索试试~ 我知道了~
Spark经典常见的面试题集合,一共三十个常见的spark面试问题,都了解了,面试不是问题。
资源推荐
资源详情
资源评论
问题1 ★★★
var、val、def三个关键字之间的区别;伴生类与伴生对象;
(1)问题分析:主要考察Scala中的基本概念,这些是应该熟练掌握的
(2)核心问题回答
var是变量声明关键字,类似于Java中的变量,变量值可以更改,但是变量类型不能更改
val常量声明关键字
def 关键字用于创建方法(注意方法和函数的区别)
还有一个lazy val(惰性val)声明,意思是当需要计算时才使用,避免重复计算
类和它的伴生对象同名且存在于同一个文件中,二者互为伴生;可以相互访问私有成员(字段和方
法);
问题2 ★★★
case class 是什么,与case object的区别是什么
(1)问题分析:主要考察样例类的理解,样例类在 Scala、Spark 的开发中使用的非常频繁,对其应该
熟练掌握
(2)核心问题回答
样例类是scala中特殊的类。当声明样例类时,如下事情会自动发生:
构造器中每一个参数都成为val。除非它被显示的声明为var(不建议这样做)
提供apply方法。不用new关键字就能够构造出相应的对象
提供unapply方法。让模式匹配可以工作
将生成toString、equals、hashCode和copy方法。除非你显示的给出这些方法的定义
继承了Product和Serializable,即已实现序列化方法和可以应用Product的方法
case class是多例的,后面要跟构造参数,case object是单例的
此外,case class和其他类型完全一样,可以添加方法和字段,扩展它们;
case class最大的用处是用于模式匹配。
(3)问题扩展
模式匹配的相关问题
问题3 ★★★
Spark为什么快,Spark SQL 一定比 Hive 快吗
(1)问题分析:常见问题,但是并不好答,因为只有对两个计算框架有一定程度的理解才能准确回
答。
(2)核心问题回答
通常大家只是说Spark是基于内存计算的,速度比MapReduce要快。或者说内存中迭代计算。其实没有
抓住问题的本质,所有的计算都是发生在内存中的,MR的计算一样是发生在内存中的。
说 Spark 是基于内存的计算,正确的理解应该:与MR相比Spark积极的使用内存,减少数据的落地。
Spark比MR快主要有两个原因:
MapReduce通常需要将计算的结果(即Job的结果)写入磁盘,然后还要读取磁盘,从而导致了频
繁的磁盘IO;
MapReduce采用了多进程模型,而Spark采用了多线程模型。MapReduce的Map Task和Reduce
Task是进程级别的,而Spark Task则是基于线程模型的,就是说map、reduce Task都是 jvm 进
程,每次启动都需要重新申请资源,消耗大量时间;Spark则是通过复用线程池中的线程来减少启
动、关闭task所需要的开销;
对于以下查询:
这个查询对于MR来说也只需要一个 Job 就能完成。此时,也许 HQL 的运行时间也许比 SparkSQL 还
快,因为MR没有中间的结果数据落地。
结论:Spark 快不是绝对的,但绝大多数情况下,Spark 都比 Hadoop 计算要快,特别是在迭代计算
中。这主要得益于其对Spark积极的使用内存以及对 JVM 使用的优化。
问题4 ★★★
描述以下你对RDD的理解
(1)问题分析:对Spark基本概念的考察,对RDD同学们都有一定的了解,但是要论述的清楚、有条理
(2)核心问题回答
RDD 是 Spark 提供的最重要的抽象概念,它是一种有容错机制的特殊数据集合,可以分布在集群的结
点上,以函数式操作集合的方式进行各种并行操作。RDD核心特点包括:
A list of partitions
A function for computing each split
A list of dependencies on other RDDs
Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
Optionally, a list of preferred locations to compute each split on (e.g. block locations for an
HDFS file)
RDD 具有容错机制,是只读的,可以执行转换操作创建新的 RDD。具体来讲,RDD 具有以下几个属
性:
只读的:只能通过转换操作生成新的 RDD
分布式:可以分布在多台机器上进行并行处理
弹性:计算过程中内存不够时它会和磁盘进行数据交换
基于内存:可以全部或部分缓存在内存中,在多次计算间重用
(3)问题扩展
(4)结合项目使用
Select month, sum(sales) from tab group by month;
问题5 ★★★
描述以下算子的区别与联系:
groupByKey、reduceByKey、aggreageByKey
cache、presist
repartition、coalesce
map、flatMap
(1)问题分析:考察对算子的理解
(2)核心问题回答
groupByKey、reduceByKey、aggregateByKey的相同点:作用key-value RDD上,对相同 key 的数据
进行聚合,都会有shuffle;
groupByKey:没有map端的combiner,所以shuffle过程的数据量大,效率低,应避免使用;
reduceByKey、aggregateByKey:有map端的combiner,shuffle过程中的数据量小,效率高。
reduceByKey:不能定义初值;初值类型与RDD元素类型必须一致;分区内和分区间聚合使用完全相同
的算法;
aggregateByKey:最灵活也最复杂。可以定义初值;初值的数据类型是任意的;分区内聚合与分区间
聚合的方法可以不一样;
cache、presist的相同点:都是Transformation,都是实现RDD的持久化;
cache与persist的区别在于: cache只有一个默认的缓存级别MEMORY_ONLY ,而persist可以根据
StorageLevel设置其它的缓存级别。
缓存级别包括:
cache() = persist(StorageLevel.MEMORY_ONLY)
class StorageLevel private(
private var _useDisk: Boolean,
private var _useMemory: Boolean,
private var _useOffHeap: Boolean,
private var _deserialized: Boolean,
private var _replication: Int = 1)
val NONE = new StorageLevel(false, false, false, false)
val DISK_ONLY = new StorageLevel(true, false, false, false)
val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
val MEMORY_ONLY = new StorageLevel(false, true, false, true)
val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
几个重要的缓存级别:
MEMORY_ONLY(RDD默认的缓存级别):将RDD 作为反序列化的对象存储 JVM 中。如果RDD不能被
内存装下,一些分区将不会被缓存,并且在需要的时候被重新计算;
MEMORY_AND_DISK(Dataset默认的缓存级别):将RDD 作为反序列化的的对象存储在JVM 中。如
果RDD不能被与内存装下,超出的分区将被保存在硬盘上;
MEMORY_ONLY_SER(DStream默认的缓存级别):将RDD 作为序列化的的对象进行存储(每一分区
一个字节数组)。 这比将对象反序列化的空间利用率更高,读取时会比较占用CPU
repartition、coalesce都是对RDD进行从分区操作。
repartition可以减少和增加分区,coalesce只能减少分区。
从源码上看,可以认为:
即:repartition 操作一定会带来 Shuffle 。在有可能的情况下,尽量选择不产生 Shuffle 的算子。
map、flatMap都是遍历RDD中的每个数据元素。
flatMap操作可以看成是map 与 flatten操作的结合,即 flatMap 操作遍历RDD中的元素,再将元素压
平。
(3)问题扩展
能在开发中熟练的使用这些算子
问题6 ★★★
简述Spark中的缓存机制与checkpoint机制,说明两者的区别与联系
(1)问题分析:对Spark基本原理的考察
(2)核心问题回答
cache 能够让重复数据在同一个 application 中的 jobs 间共享。RDD的cache()方法其实调用的就是
persist方法,默认的缓存策略为MEMORY_ONLY。
cache与persist的目的是:将会重复多次使用的RDD进行持久化或者说缓存,避免重复计算,从而减少
应用的执行时间。
checkpoint的目的是:容错。
val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)
val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)
val OFF_HEAP = new StorageLevel(true, true, true, false, 1)
repartition(numPartitions) = coalesce(numPartitions, shuffle = true)
即cache 和 checkpoint 的显著区别是:cache把 RDD 计算出来然后放在内存中, 但是RDD 的依赖链
也不能丢掉, 当某个点某个 executor 宕了, 上面cache 的RDD就会丢掉, 需要通过依赖链重新计算
出来;而 checkpoint 是把 RDD 保存在 HDFS中, 是多副本可靠存储,所以依赖链就可以丢掉了,即斩
断了依赖。
这里值得注意的是:cache 机制是每计算出一个要 cache 的 partition 就直接将其 cache 到内存了。但
checkpoint 没有使用这种第一次计算得到就存储的方法,而是等到 job 结束后另外启动专门的 job 去
完成 checkpoint 。也就是说需要 checkpoint 的 RDD 会被计算两次。因此,在使用 checkpoint 的时
候,应该先执行 cache 操作,这样第二次运行的 job 就不用再去计算该 rdd 了,直接读取 cache 写磁
盘。
cache:主要目的是RDD数据缓存,不会截断血缘关系,使用计算过程中的数据缓存。
checkpoint:主要目的是容错,会截断依赖,checkpoint 会额外提交一次任务。
(3)问题扩展
RDD、DataSet、DStream的默认缓存级别;对各种缓存级别的理解;
缓存与检查点使用的时机,以及正确的使用姿势
(4)结合项目使用
问题7 ★★★
RDD、DataFrame、DataSet三者的区别与联系
(1)问题分析:考察Spark的基本概念
(2)核心问题回答
RDD
RDD是一个懒执行的、不可变的、可以支持Lambda表达式的并行数据集合
RDD的最大好处就是简单,API丰富、易于使用
RDD的劣势是性能限制,数据序列化、反序列化的成本高
DataFrame
与RDD类似,DataFrame也是一个分布式数据容器;
DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema;
从API易用性的角度上看,DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友
好,门槛更低;
DataSet
是Dataframe API的一个扩展,是Spark最新的数据抽象
用户友好的API风格,既具有类型安全检查也具有Dataframe的查询优化特性
Dataset支持编解码器,当需要访问非堆上的数据时可以避免反序列化整个对象,提高了效率
样例类被用来在Dataset中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet中
的字段名称
剩余22页未读,继续阅读
资源评论
张飞的猪大数据
- 粉丝: 3317
- 资源: 41
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- mybatis中的动态sql, 涉及 where trim set if foreach等
- 简单- 快递运输(Java & JS & Python & C).html
- mybatis框架 更改ems系统,使用动态sql等.zip
- 易语言工具条下拉菜单实现
- Mybatis动态SQL高级映射.zip
- 源码esp8266开发板机智云机智云智能灯
- Python实现多图像转换成连贯的PDF文件,支持所有图片格式,可预览、裁剪、自定义PDF布局、设置图像顺序、PDF质量选择等
- H5腾讯地图选择位置组件
- 基于UCC28019+LM5017电源板硬件(原理图+PCB)工程文件.zip
- 源码esp8266开发板机智云机智云空气净化器
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功