Spark--SparkCore面试知识点总结

整理于【Spark面试2000题】Spark core面试篇03 ,梅峰谷大数据
1.Spark使用parquet文件存储格式能带来哪些好处?

    1. 如果说HDFS 是大数据时代分布式文件系统首选标准,那么parquet则是整个大数据时代文件存储格式实时首选标准;
    1. 速度更快:从使用spark sql操作普通文件CSV和parquet文件速度对比上看,绝大多数情况会比使用csv等普通文件速度提升10倍左右,在一些普通文件系统无法在spark上成功运行的情况下,使用parquet很多时候可以成功运行;
    1. parquet的压缩技术非常稳定出色,在spark sql中对压缩技术的处理可能无法正常的完成工作(例如会导致lost task,lost executor)但是此时如果使用parquet就可以正常的完成;
    1. 极大的减少磁盘I/O,通常情况下能够减少75%的存储空间,由此可以极大的减少spark sql处理数据的时候的数据输入内容,尤其是在spark1.6x中有个下推过滤器在一些情况下可以极大的减少磁盘的IO和内存的占用,(下推过滤器);
    1. spark 1.6x parquet方式极大的提升了扫描的吞吐量,极大提高了数据的查找速度spark1.6和spark1.5x相比而言,提升了大约1倍的速度,在spark1.6X中,操作parquet时候cpu也进行了极大的优化,有效的降低了cpu;
    1. 采用parquet可以极大的优化spark的调度和执行。我们测试spark如果用parquet可以有效的减少stage的执行消耗,同时可以优化执行路径。
2.Spark Executor之间如何共享数据?
答:基于hdfs或者基于tachyon【英 ['t?k??n 美 ['t?ki,ɑn] n. 速子,[高能] 超光速粒子】---待总结
3.Spark累加器有哪些特点?
答:
1)累加器在全局唯一的,只增不减,记录全局集群的唯一状态;
2)在executor中修改它,在driver读取;
3)executor级别共享的,广播变量是task级别的共享,两个application不可以共享累加器,但是同一个app不同的job可以共享
4.Spark 如何在一个不确定的数据规模的范围内进行排序?
答:为了提高效率,要划分一下,划分的范围并且是有序的要么有序,要么降序?
水塘抽样:目的是从一个集合中选取,集合非常大,适合内存无法容纳数据的时候使用从N中抽取出K个,N是随机数。
5.Spark hashParitioner的弊端是什么?
https://www.jianshu.com/p/c36d684ae79e Spark--对分区Partition的理解
6. Spark RangePartitioner分区的原理?
https://www.jianshu.com/p/c36d684ae79e Spark--对分区Partition的理解
7.介绍Spark中parition和block有什么关联关系?
https://www.jianshu.com/p/c36d684ae79e Spark--对分区Partition的理解
8.Spark应用程序的执行过程是什么?
https://www.jianshu.com/p/01599e28090d Spark -- 工作流程图
9.hbase预分区个数和spark过程中的reduce个数相同么?
答:答:和spark的map个数相同,reduce个数如果没有设置和reduce前的map数相同。
10.如何理解Spark Standalone模式下,Spark资源分配是粗粒度的?
答:spark默认情况下资源分配是粗粒度的,也就是说程序在提交时就分配好资源,后面执行的时候使用分配好的资源,除非资源出现了故障才会重新分配。比如Spark shell启动,已提交,已注册,哪怕没有任务,worker都会分配资源给executor。
11.Spark如何自定义partitioner分区器?
https://www.jianshu.com/p/c36d684ae79e Spark--对分区Partition的理解
12.spark中task有几种类型?
答:2种类型:
Spark有2个类型的Task: ShuffleMapTask和ResultTask; Task的类型和Stage相关
1) resulttask类型,最后一个是task,
2) shuffleMapTask类型,除了最后一个task都是。
13.Spark 中union操作是产生宽依赖还是窄依赖?
答:窄依赖
union算子原理 参考连接 https://www.jianshu.com/p/fd7805257809 Spark--Spark RDD中常考算子
14.Spark中rangePartioner分区器特点?
https://www.jianshu.com/p/c36d684ae79e Spark--对分区Partition的理解
15.什么是二次排序,你是如何用spark实现二次排序的?(互联网公司常面)
https://www.jianshu.com/p/6356e3a8df7a Spark--spark的二次排序(面试必问)
16.如何使用Spark解决TopN问题?(互联网公司常面)
https://www.jianshu.com/p/bc977d23eb7f Spark--Spark求分组TopN(RDD及SQL方式)面试必问
17.如何使用Spark解决分组排序问题?(互联网公司常面)
https://www.jianshu.com/p/bc977d23eb7f Spark--Spark求分组TopN(RDD及SQL方式)面试必问,去掉排序中的take即可。
18.Spark中窄依赖父RDD的partition和子RDD的parition是不是都是一对一的关系?
答:不一定,除了一对一的窄依赖,还包含一对固定个数的窄依赖(就是对父RDD的依赖的Partition的数量不会随着RDD数量规模的改变而改变),比如join操作的每个partiion仅仅和已知的partition进行join,这个join操作是窄依赖,依赖固定数量的父rdd,因为是确定的partition关系。
19.Hadoop中,Mapreduce操作的mapper和reducer阶段相当于spark中的哪几个算子?
答:相当于spark中的map算子和reduceByKey算子,当然还是有点区别的,MR会自动进行排序的,spark要看你用的是什么partitioner。
  • hadoop mapreduce mapper--->>>spark map()算子
  • hadoop mapreducereducer----->>>>spark reducebykey()算子
20.什么是shuffle,以及为什么需要shuffle?--针对hadoop和spark都可以
答:
回答重点:如果问起来,可以具体谈一下,什么是hadoop shuffle 、spark shuffle
shuffle中文翻译为洗牌,需要shuffle的原因是:某种具有共同特征的数据汇聚到一个计算节点上进行计算。
21.Spark中不需要排序的hash shuffle是否一定比需要排序的sort shuffle速度快?
https://www.jianshu.com/p/7d5f1a7c7c09 Spark--Spark Shuffle细节掌握(面试类)问题
22.Spark中的HashShufle的有哪些不足?
https://www.jianshu.com/p/7d5f1a7c7c09 Spark--Spark Shuffle细节掌握(面试类)问题
23.conslidate是如何优化Hash shuffle时在map端产生的小文件?
答:1)conslidate为了解决Hash Shuffle同时打开过多文件导致Writer handler内存使用过大以及产生过多文件导致大量的随机读写带来的低效磁盘IO;
2)conslidate根据CPU的个数来决定每个task shuffle map端产生多少个文件,假设原来有10个task,100个reduce,每个CPU有10个CPU那么使用hash shuffle会产生10100=1000个文件,conslidate产生1010=100个文件
备注:conslidate部分减少了文件和文件句柄,并行读很高的情况下(task很多时)还是会很多文件;
24.Spark中Sort-basesd shuffle产生多少个临时文件
https://www.jianshu.com/p/7d5f1a7c7c09 Spark--Spark Shuffle细节掌握(面试类)问题
25. Spark中Sort-based shuffle的缺陷?
https://www.jianshu.com/p/7d5f1a7c7c09 Spark--Spark Shuffle细节掌握(面试类)问题
26.Spark shell启动时会启动derby?
答:spark shell启动会启动spark sql,spark sql默认使用derby保存元数据,但是尽量不要用derby,它是单实例,不利于开发。会在本地生成一个文件metastore_db,如果启动报错,就把那个文件给删了 ,derby数据库是单实例,不能支持多个用户同时操作,尽量避免使用。
27.spark.default.parallelism这个参数有什么意义,实际生产中如何设置?
答:
1)参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能;
2)很多人都不会设置这个参数,会使得集群非常低效,你的cpu,内存再多,如果task始终为1,那也是浪费,spark官网建议task个数为CPU的核数*executor的个数的2--3倍。
28.spark.storage.memoryFraction参数的含义,实际生产中如何调优?
答:
1)用于设置RDD持久化数据在Executor内存中能占的比例,默认是0.6,默认Executor 60%的内存,可以用来保存持久化的RDD数据。根据你选择的不同的持久化策略,如果内存不够时,可能数据就不会持久化,或者数据会写入磁盘。
2)如果持久化操作比较多,可以提高spark.storage.memoryFraction参数,使得更多的持久化数据保存在内存中,提高数据的读取性能,如果shuffle的操作比较多,有很多的数据读写操作到JVM中,那么应该调小一点,节约出更多的内存给JVM,避免过多的JVM gc发生。在web ui中观察如果发现gc时间很长,可以设置spark.storage.memoryFraction更小一点。
29.spark.shuffle.memoryFraction参数的含义,以及优化经验?
【Spark--SparkCore面试知识点总结】答:
1)spark.shuffle.memoryFraction是shuffle调优中 重要参数,shuffle从上一个task拉去数据过来,要在Executor进行聚合操作,聚合操作时使用Executor内存的比例由该参数决定,默认是20%如果聚合时数据超过了该大小,那么就会spill到磁盘,极大降低性能;
2)如果Spark作业中的RDD持久化操作较少,shuffle操作较多时,建议降低持久化操作的内存占比,提高shuffle操作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。此外,如果发现作业由于频繁的gc导致运行缓慢,意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值。

    推荐阅读