spark面试题

1、spark和hadoop的区别?各自扮演什么角色?
首先,说两者共同点都是大数据框架,然后说区别hadoop重在存储,分布式数据基础设施,spark是对分布式存储大数据进行处理的工具,不会进行分布式存储,因此依赖与分布式存储工具,可以使基于云的数据系统凭条在分布式计算和处理上的区别hadoop也可以分布式处理,但是只是MapReducer,不能迭代式处理,job与job之间进行大量io操作,效率十分低,而且还需要集成多种不同的工具(如用于机器学习的Mahout和流数据处理的Stormspark的RDD是弹性的,支持多重数据处理,大部分存储在内存中,支持迭代计算,而且和scala可以交互式计算Hadoop和Spark两者都是大数据框架,但是各自存在的目的不尽相同。Hadoop实质上更多是一个分布式数据基础设施: 它将巨大的数据集分派到一个由普通计算机组成的集群中的多个节点进行存储,意味着您不需要购买和维护昂贵的服务器硬件。同时,Hadoop还会索引和跟踪这些数据,让大数据处理和分析效率达到前所未有的高度。
Hadoop除了提供为大家所共识的HDFS分布式数据存储功能之外,还提供了叫做MapReduce的数据处理功能。
Spark,则是那么一个专门用来对那些分布式存储的大数据进行处理的工具,它并不会进行分布式数据的存储。
Spark也不是非要依附在Hadoop身上才能生存,毕竟它没有提供文件管理系统,所以,它必须和其他的分布式文件系统进行集成才能运作。这里我们可以选择Hadoop的HDFS,也可以选择其他的基于云的数据系统平台,但Spark默认来说还是被用在Hadoop上面的。
Spark因为其处理数据的方式不一样,它会在内存中以接近“实时”的时间完成所有的数据分析,速度上会比MapReduce快上很多。
如果需要处理的数据和结果需求大部分情况下是静态的,且你也有耐心等待批处理的完成的话,MapReduce的处理方式也是完全可以接受的。
但如果你需要对流数据进行分析,又或者说你的应用是需要多重数据处理的,那么你也许更应该使用Spark进行处理。通常会用到Spark的应用场景有以下方面:实时的市场活动,在线产品推荐,网络安全分析,机器日记监控,机器学习等等。
2、Spark有哪些组成部分,Spark的架构基础是什么?
sparkCore,SparkStraming,SparkSql,mLIB,gRAPHx
Spark由SparkCore(Spark Runtime)、Spark Streaming、Spark Sql、SparkMLlib、SparkGraphX组成。
Spark的架构基础:
Cluster Manager:Spark的集群管理器,主要负责资源的分配与管理。集群管理器分配的资源属于一级分配,它将各个Worker上的内存、CPU等资源分配给应用程序,(相当于resourceManger)但是并不负责对Executor的资源分配。目前,Standalone、YARN、Mesos、EC2等都可以作为Spark的集群管理器。Worker:Spark的工作节点。对Spark应用程序来说,由集群管理器分配得到资源的Worker节点主要负责以下工作:创建Executor,将资源和任务进一步分配给Executor,同步资源信息给Cluster Manager。Executor:执行计算任务的一线进程。主要负责任务的执行以及与Worker、Driver App的信息同步。Driver App:客户端驱动程序,也可以理解为客户端应用程序,用于将任务程序转换为RDD和DAG,并与Cluster Manager进行通信与调度。3、简述Spark的shuffle过程
Shuffle是MapReduce框架中的一个特定的phase,介于Map phase和Reduce phase之间,当Map的输出结果要被Reduce使用时,输出结果需要按key哈希,并且分发到每一个Reducer上去,这个过程就是shuffle。由于shuffle涉及到了磁盘的读写和网络的传输,因此shuffle性能的高低直接影响到了整个程序的运行效率。
Spark 也有自己的 shuffle 过程。下图是 DAG schedula的任务划分,从最后一个RDD往前追溯,遇到宽依赖(shuffle)就划分一个 Stage。在DAG 调度的过程中,在划分 Stage 的时候,构建 shuffleDependency 的时候进行shuffle注册,获取后续数据读取所有要的 shuffleHandle,最终每一个 job 提交之后都会生成一个 ResultStage 和若干个 ShuffleMapStage ,其中ResultStage 表示生成作业的最终结果所在的 Stage,ResultStage 与 shuffleMapStage 中的task 分别对应着 ResultTask 与shuffleMapTask ,一个作业,除了最终的 ResultStage 外,其他若干 shuffleMapStage 中的各个 shuffleMapTask 都需要将最终的数据根据相应的 partition 对数据进行分组,然后持久化分区的数据。
4、 Spark中 sortByKey被划分到transformation中,却有action操作原因?
实例化了一个RangePartitioner对象,在RangePartitioner中,在Range数据分片的时候,内部进行排序,它需要对所有分区的的数据进行扫描和范围的划分,(就好比二叉树的算法)官方将sortByKey划分到transformation了。
5. RDD是什么?在Spark中有什么作用?
RDD全称为Resilient Distributed Datasets,弹性分布式数据集。
RDD是Spark最核心的模块和类,是Spark操纵数据的一个高度抽象,即Spark所操作的数据集都是包装成RDD来进行操作的。例如 Spark可以兼容处理Hadoop的HDFS数据文件,那么这个HDFS数据文件就是包装成Spark认识的RDD来完成数据抽取和处理的。Spark中绝大多数的操作,就是在操作各种RDD。
RDD 的五大特性:
1. RDD是由一系列的partition组成的。
2. 函数是作用在每一个partition(split)上的。
3. RDD之间有一系列的依赖关系。
4. 分区器是作用在K,V格式的RDD上。
5. RDD提供一系列最佳的计算位置。
什么是RDD?你理解中的 Spark RDD 是什么?这种问题是开放性的,
很好答,根据自己的理解,一定要有自己的理解,自己说出来应该是一个完整的对话。
是什么?
概念?
源码上一个抽象类RDD
源码的角度看五个特性?源码里面体现了,我个人能力有限。
1.一系列分区组成
2.函数作用在分区上
3.RDD之间有一些依赖关系
4.RDD提供一系列最佳的计算位置
5.分区器作用在 K V 上
分区?
这里的分区指的是什么?类似于 分区的概念?
弹性扩容?指定分区数?numPartition 分布在不同的节点上。
partition 对应一个一个的 block 块。
spark函数?RDD算子?转换算子?action算子?控制算子?
转换算子:(RDD转换成新的RDD,懒加载的)map flatMap filter mapPartition groupBy sortBy reduceBy
action算子:(触发一个runJob) count countByKey foreach foreachPartition reduce collect take first saveAsTextFile
说到 job ,内部是由一些列 stage组成,stage里面有并行的task任务,pipeline计算模型,内存中迭代计算。 计算速度快
控制算子:cache persist checkpoint(前两个是为了提高性能,后一个是为了容错)
前两个根本没有提供一个路径,我们都不知道他在哪里。
cache 是一个 memoryOnly 的 persist
persist:memory disk ser 压缩的时候,也会占用 cpu 的资源,通知也可以加上 副本数
checkpoint 用来做容错,服务区宕机之后,可以在指定的地址上恢复RDD;
计算job完成之后,会重新往前找看看哪一个RDD被标记了checkpoint ,
重新启动一个 job 来算,所以结合 cache来使用,不必重新计算了。
依赖关系?连起来就是血统。
窄依赖和宽依赖?
stage划分:从 final RDD 开始往前追溯,遇到宽依赖就划分一个 stage
划分操作是由 DAGSchduel 来完成的。
容错:
血统 lineage 父RDD
RDD 提供最佳计算位置
移动计算
迭代计算:
分区作用在 K V 上,使用的时候尽量去构建 k v 的结构就可以了
6. Spark如何实现迭代计算?
基本的思路是,凡是需要迭代的,都作为一个全局分布式的rdd,每次都生成新的,新的东西通过join等操作符,和旧的合并,做为下一次的迭代输入。
如果迭代次数未知,则设置结束条件。
7. Spark如何实现交互式计算?
Spark的shell提供了简单方式去识别API,同样也有一个强大的工具去交互式地分析数据。Shell提供两种语言有这样的交换能力,分别是Scala 和 Python。
8. Spark算子分区如何理解?
分区是RDD内部并行计算的一个计算单元,RDD的数据集在逻辑上被划分为多个分片,每一个分片称为分区,分区的格式决定了并行计算的粒度,而每个分区的数值计算都是在一个任务中进行的,因此任务的个数,也是由RDD(准确来说是作业最后一个RDD)的分区数决定。
我们都可以通过spark.default.parallelism来配置其默认分区个数,若没有设置该值,则根据不同的集群环境确定该值。
9. spark中的partitionby怎么理解?
defpartitionBy(partitioner: Partitioner): RDD[(K, V)]
该函数根据partitioner函数生成新的ShuffleRDD,将原RDD重新分区。
11. RDD有怎么样的特性?
1.一系列分区组成
2.函数作用在分区上
3.RDD之间有一些依赖关系
4.RDD提供一系列最佳的计算位置
5.分区器作用在 K V 上
12. 创建sparkStreaming的函数是什么?
val conf = newSparkConf().setMaster("local[2]").setAppName("WordCount")
val ssc = new StreamingContext(conf,Seconds(1))
13. spark的reduceByKey和groupByKey的作用和区别?
reduceByKey()与reduce()相当类似,它们都接收一个函数,并使用该函数对值进行合并。reduceByKey()会把数据集中将键相同的值合并起来,它会返回一个由各键和对应键合并出来的结果值组成的新的RDD。
groupByKey对具有相同键的值分组。
示例:{(1, 2), (3, 4), (3, 6)}
reduceByKey:{(1,2),(3,10)} groupByKey:{(1,[2]), (3,[4,6])}
14. spark以及hadoop中是否遇到过OOM,怎样解决的
Spark中的OOM问题不外乎以下两种情况:map执行中内存溢出;shuffle后内存溢出。
map这种溢出的原因是在单个map中产生了大量的对象导致的,针对这种问题,在不增加内存的情况下,可以通过减少每个Task的大小,以便达到每个Task即使产生大量的对象Executor的内存也能够装得下。
shuffle内存溢出的情况可以说都是shuffle后,单个文件过大导致的。在Spark中,join,reduceByKey这一类型的过程,都会有shuffle的过程,在shuffle的使用,需要传入一个partitioner,大部分Spark中的shuffle操作,默认的partitioner都是HashPatitioner,默认值是父RDD中最大的分区数,这个参数通过spark.default.parallelism控制, spark.default.parallelism参数只对HashPartitioner有效,所以如果是别的Partitioner或者自己实现的Partitioner就不能使用spark.default.parallelism这个参数来控制shuffle的并发量了。
1、拉取数据 少一些。
2、提高ExecutorShuffle聚合内存。
3、提高executor内存。
15. spark streaming 怎么和Kafka结合,,为什么要和kafka结合
通过KafkaUtils可以创建一个基于Kafka输入的RDD。结合后可以把kafka做为spark streaming的输入流。
sparkstreaming+kafka的receiver 模式,数据怎么保证不丢失?
开启WAL机制,但是有可能会导致数据重复消费
这是因为,开启WAL机制后,sparkstreaming会将kafka中的数据读一份放hdfs上面,之后才提交offset到zookeeper上。
若此时dirver挂掉,则excutor也会挂掉,提交offset失败。
等dirver重新启动后,就会先去hdfs上面把数据拉过来计算一遍,然后再去zookeeper拿offset开始读,
此时就造成了数据重复消费。
exactly-once : 有且只有一次
sparkstreaming+kafka的direct模式怎么保证数据不丢失
这种模式下,sparkstreaming 自己管理偏移量,将偏移量放在内存里,它底层使用了kafka的低级API。
为了避免offset不丢失,应该开启 chekpoint 机制 ,它会将offset保存到chekpoint目录里。
注意:
direct模式 它不是启动一个Receivers来连续不断地从Kafka中接收数据并写入到WAL中,
而是简单地给出每个batch区间需要读取的偏移量位置,
最后,每个batch的Job被运行,那些对应偏移量的数据在Kafka中已经准备好了。
这些偏移量信息也被可靠地存储(checkpoint),在从失败中恢复可以直接读取这些偏移量信息。
Direct Api访问kafka带来的一个显而易见的性能上的好处就是:
如果你要读取多个partition,Spark也会创建RDD的partition,这个时候RDD的partition和kafka的partition是一致的
不足之处是由于RDD和kafka的patition是一对一的,想提高并行度就会比较麻烦。
提高并行度还得repartition,即重新分区,因为产生shuffle,很耗时


还没有评论,来说两句吧...