spark面试题

1、rdd有哪些算子?

    主要分为转换算子和action算子。

    transformation:map、filter、flatmap、mappartitions、union、distinct、groupbykey、reducebykey、sortbykey、join、repartition

    action:reduce、collect(以数组形式放回数据集的所有元素)、first、take(n)(返回一个由数据集的前n个元组组成的数组)、count(返回rdd的元素个数)、savesatextfile、saveAsSequencefile、countbykey、foreach、saveAsObjectFile(将数据集的元素,以java序列化的方式保存到指定的目录下)

    转换算子和执行算子的区别:转换算子是一个rdd转换为另外一个rdd。执行算子是一个rdd转换为一个值。

2、rdd是什么?

    翻译过来叫做弹性分布式数据集。就是一个不可变的、可分区的、里面元素可以并行计算的数据集合。

    弹性:代表数据可以保存在内存中也可以保存在磁盘里。

3、rdd的五大属性?

    --分片数决定并行度,分片是数据集的基本组成单位。

    --一个函数会被作用在每一个分区

    --一个rdd依赖于其他rdd

    --可选项,对于key-value类型的rdd会有一个partitioner,即rdd的分区函数

    --可选项,移动数据不如移动计算。spark在进行任务调度的时候,会尽可能选择那些存有数据的worker节点来进行任务计算。

4、spark的checkpoint机制

    spark利用了hdfs的容错机制和高可用,最大程度实现数据的安全性。

5、持久化和checkpoint机制的区别?

①位置:persist和cache只能保存在本地的磁盘或者内存中,而checkpoint可以保存数据到hdfs上,确保数据的安全性。

②生命周期:persist和cache的rdd会在程序结束后会被清除或者手动调用unpersist方法。checkpoint的rdd在程序接收后依然存在,不会被删除。

③lineage(血缘依赖):进行ersist和cache时,不会丢掉rdd之间的依赖关系,因为数据可能会丢失,丢失后需要回溯依赖链重新计算出来。而checkpoint会斩断依赖,因为checkpoint将数据保存到hdfs,数据很难发生丢失,也就不需要回溯依赖链来重新计算了。

6、描述下宽依赖和窄依赖?

    窄依赖:父RDD的一个分区只会被子RDD的一个分区依赖

    宽依赖:父rdd的一个分区会被子rdd的多个分区依赖

----窄依赖可以进行并行计算,提高处理能力。并且一个分区的数据丢失,只需要从父rdd的对应一个分区重新计算即可,不需要重新计算任务,提高容错能力。

----宽依赖是划分stage的依据。spark根据宽依赖使用回溯算法对DAG进行stage划分,从后往前,遇到宽依赖就断开,遇到窄依赖就把当前的RDD加入到当前的stage阶段中。

9、rdd、ds、df的区别?

    df的前身是以rdd为基础的分布式数据集,类似于传统数据库的二维表格,带有schema元信息。可以理解为数据库的列名和类型。

    ds与df相比,保存了类型新消息,是强类型的,提供编译时类型检查。

    DataFrame = RDD - 泛型 + Schema + SQL + 优化

    DataFrame = DataSet[Row]

    DataSet = DataFrame  + 泛型

    DataSet  =  RDD  +  Schema  + SQL + 优化

10、sparkstreaming整合kafka的两种方式?

    ①receive接收方式(不常用)

        --receiver作为常驻task运行在Executor等待数据。需要同时开启多个,在进行手动合并。而且需要开启wal预写日志,防止数据丢失。所以效率低下。

    ②direct直连方式

        --通过直接连接kafka分区来获取数据。offset可以默认保存在checkpoint中,也可以手动维护保存在mysql或者redis中。借助direct模式的特点+手动操作,可以保证数据的精准一次性语义。

11、简单介绍下spark的shuflle过程吧?

    当rdd之间产生的依赖为宽依赖时,会产生shuflle,有两种shuffle方式,一种格式hashshuffle,一种是sortshuffle。我们使用的是2.x版本,shuffle方式是sortshuffle。

12、spark的程序的执行流程?

    ①构建spark application运行环境

    ②sparkcontext向资源管理器注册

    ③资源管理器分配executor

    ④资源管理器启动excutor

    ⑤excutor向资源管理器发送心跳信息

    ⑥excutor申请task任务

    ⑦sparkcontext构建成DAG图

    ⑧将DAG图分解成stage

    ⑨把stage发送给taskscheduler

    ⑩excutor向sparkcontext申请task

        taskScheduler将task发放给Executor运行

        sparkcontext将应用程序代码发放给executor

        task再executor上运行,运行完毕释放资源

11、spark的性能优化你了解哪些?


spark性能优化

spark优化专题

12、开发面试常见问题?


spark开发常见问题

13、spark容易出现序列化问题,为什么会出现?怎么避免这样的问题?

   先回答为什么会出现。spark运行在jvm上,序列化需要遵守java的序列化。将一个对象转换成2进制byte流。常见于数据的传输和保存。

    首先被static和transient修饰的对象不会被序列化。这是解决序列化问题的方法之一。

    其次spark的计算是在excutor上分布式执行的,代码对象在dirver本地序列化,经过网络传输,发送到各个executor上反序列化,再进行执行。

如何避免:在scala中,在object中声明对象。使用static修饰不可序列化的对象。在sparkstream中,要注意哪些操作在dirver端,哪些操作在executor端。一般在foreach或foreachpartition中来实例化对戏年糕,这样对象在executor上,不需要进行序列化发送。

你可能感兴趣的:(spark面试题)