Spark 面试题大全
1、Spark 中的 HashShufle 的有哪些不足?1)shuffle 产生海量的小文件在磁盘上,此时会产生大量耗时的、低效的 IO 操作;2)容易导致内存不够用,由于内存需要保存海量的文件操作句柄和临时缓存信息,如果数据处理规模比较大的话,容易出现 OOM;3)容易出现数据倾斜,导致 OOM。
2、 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 很多时)还是会很多文件。
3、spark.default.parallelism 这个参数有什么意义,实际生产中如何设置?1)参数用于设置每个 stage 的默认 task 数量。这个参数极为重要,如果不设置可能会直接影响你的 Spark 作业性能;2)很多人都不会设置这个参数,会使得集群非常低效,你的 cpu,内存再多,如果 task 始终为 1,那也是浪费,spark 官网建议 task 个数为 CPU 的核数*executor 的个数的 2~3 倍。
4、spark.shuffle.memoryFraction 参数的含义,以及优化经验?1)spark.shuffle.memoryFraction 是 shuffle 调优中 重要参数,shuffle 从上一个 task 拉去数据过来,要在 Executor 进行聚合操作,聚合操作时使用 Executor 内存的比例由该参数决定,默认是 20%如果聚合时数据超过了该大小,那么就会 spill 到磁盘,极大降低性能;2)如果 Spark 作业中的 RDD 持久化操作较少,shuffle 操作较多时,建议降低持久化操作的内存占比,提高 shuffle 操作的内存占比比例,避免 shuffle 过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。此外,如果发现作业由于频繁的 gc 导致运行缓慢,意味着 task 执行用户代码的内存不够用,那么同样建议调低这个参数的值。
5、Spark 中 standalone 模式特点,有哪些优点和缺点?1)特点:(1)standalone 是 master/slave 架构,集群由 Master 与 Worker 节点组成,程序通过与 Master 节点交互申请资源,Worker 节点启动 Executor 运行;(2)standalone 调度模式使用 FIFO 调度方式;(3)无依赖任何其他资源管理系统,Master 负责管理集群资源。2)优点:(1)部署简单;(2)不依赖其他资源管理系统。3)缺点:(1)默认每个应用程序会独占所有可用节点的资源,当然可以通过 spark.cores.max 来决定一个应用可以申请的 CPU cores 个数;(2)可能有单点故障,需要自己配置 master HA。
6、FIFO 调度模式的基本原理、优点和缺点?基本原理:按照先后顺序决定资源的使用,资源优先满足最先来的 job。第一个 job 优先获取所有可用的资源,接下来第二个 job 再获取剩余资源。大数据培训以此类推,如果第一个 job 没有占用所有的资源,那么第二个 job 还可以继续获取剩余资源,这样多个 job 可以并行运行,如果第一个 job 很大,占用所有资源,则第二 job 就需要等待,等到第一个 job 释放所有资源。优点和缺点:1)适合长作业,不适合短作业;2)适合 CPU 繁忙型作业(计算时间长,相当于长作业),不利于 IO 繁忙型作业(计算时间短,相当于短作业)。
7、FAIR 调度模式的优点和缺点?所有的任务拥有大致相当的优先级来共享集群资源,spark 多以轮训的方式为任务分配资源,不管长任务还是端任务都可以获得资源,并且获得不错的响应时间,对于短任务,不会像 FIFO 那样等待较长时间了,通过参数 spark.scheduler.mode 为 FAIR 指定。
8、CAPCACITY 调度模式的优点和缺点?1)原理:计算能力调度器支持多个队列,每个队列可配置一定的资源量,每个队列采用 FIFO 调度策略,为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。调度时,首先按以下策略选择一个合适队列:计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值(即比较空闲的队列),选择一个该比值最小的队列;然后按以下策略选择该队列中一个作业:按照作业优先级和提交时间顺序选择,同时考虑用户资源量限制和内存限制 2)优点:(1)计算能力保证。支持多个队列,某个作业可被提交到某一个队列中。每个队列会配置一定比例的计算资源,且所有提交到队列中的作业共享该队列中的资源;(2)灵活性。空闲资源会被分配给那些未达到资源使用上限的队列,当某个未达到资源的队列需要资源时,一旦出现空闲资源资源,便会分配给他们;(3)支持优先级。队列支持作业优先级调度(默认是 FIFO);(4)多重租赁。综合考虑多种约束防止单个作业、用户或者队列独占队列或者集群中的资源;(5)基于资源的调度。 支持资源密集型作业,允许作业使用的资源量高于默认值,进而可容纳不同资源需求的作业。不过,当前仅支持内存资源的调度。
9、常见的数压缩方式,你们生产集群采用了什么压缩方式,提升了多少效率?1)数据压缩,大片连续区域进行数据存储并且存储区域中数据重复性高的状况下,可以使用适当的压缩算法。数组,对象序列化后都可以使用压缩,数更紧凑,减少空间开销。常见的压缩方式有 snappy,LZO,gz 等 2)Hadoop 生产环境常用的是 snappy 压缩方式(使用压缩,实际上是 CPU 换 IO 吞吐量和磁盘空间,所以如果 CPU 利用率不高,不忙的情况下,可以大大提升集群处理效率)。snappy 压缩比一般 20%~30%之间,并且压缩和解压缩效率也非常高(参考数据如下):(1)GZIP 的压缩率最高,但是其实 CPU 密集型的,对 CPU 的消耗比其他算法要多,压缩和解压速度也慢;(2)LZO 的压缩率居中,比 GZIP 要低一些,但是压缩和解压速度明显要比 GZIP 快很多,其中解压速度快的更多;(3)Zippy/Snappy 的压缩率最低,而压缩和解压速度要稍微比 LZO 要快一些。
提升了多少效率可以从 2 方面回答:1)数据存储节约多少存储,2)任务执行消耗时间节约了多少,可以举个实际例子展开描述。
10、使用 scala 代码实现 WordCount?val conf = new SparkConf()val sc = new SparkContext(conf)val line = sc.textFile(“xxxx.txt”) line.flatMap(.split(" ")).map((,1)).reduceByKey(+). collect().foreach(println) sc.stop()
11、Spark RDD 和 MapReduce2 的区别?1)mr2 只有 2 个阶段,数据需要大量访问磁盘,数据来源相对单一 ,spark RDD ,可以无数个阶段进行迭代计算,数据来源非常丰富,数据落地介质也非常丰富 spark 计算基于内存;2)MapReduce2 需要频繁操作磁盘 IO,需要大家明确的是如果是 SparkRDD 的话,你要知道每一种数据来源对应的是什么,RDD 从数据源加载数据,将数据放到不同的 partition 针对这些 partition 中的数据进行迭代式计算计算完成之后,落地到不同的介质当中。
12、spark 和 Mapreduce 快? 为什么快呢? 快在哪里呢?Spark 更加快的主要原因有几点:1)基于内存计算,减少低效的磁盘交互;2)高效的调度算法,基于 DAG;3)容错机制 Lingage,主要是 DAG 和 Lianage,即使 spark 不使用内存技术,也大大快于 mapreduce。
13、Spark sql 为什么比 hive 快呢?计算引擎不一样,一个是 spark 计算模型,一个是 mapreudce 计算模型。
14、RDD 的数据结构是怎么样的?一个 RDD 对象,包含如下 5 个核心属性。1)一个分区列表,每个分区里是 RDD 的部分数据(或称数据块)。2)一个依赖列表,存储依赖的其他 RDD。3)一个名为 compute 的计算函数,用于计算 RDD 各分区的值。4)分区器(可选),用于键/值类型的 RDD,比如某个 RDD 是按散列来分区。5)计算各分区时优先的位置列表(可选),比如从 HDFS 上的文件生成 RDD 时,RDD 分区的位置优先选择数据所在的节点,这样可以避免数据移动带来的开销。
15、RDD 算子里操作一个外部 map,比如往里面 put 数据,然后算子外再遍历 map,会有什么问题吗?频繁创建额外对象,容易 oom。
16、 说说你对 Hadoop 生态的认识。hadoop 生态主要分为三大类型,1)分布式文件系统,2)分布式计算引擎,3)周边工具 1)分布式系统:HDFS,hbase2)分布式计算引擎:Spark,MapReduce3)周边工具:如 zookeeper,pig,hive,oozie,sqoop,ranger,kafka 等
17、hbase region 多大会分区,spark 读取 hbase 数据是如何划分 partition 的?region 超过了 hbase.hregion.max.filesize 这个参数配置的大小就会自动裂分,默认值是 1G。默认情况下,hbase 有多少个 region,Spark 读取时就会有多少个 partition 。
评论