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优化专题
12、开发面试常见问题?
13、spark容易出现序列化问题,为什么会出现?怎么避免这样的问题?
先回答为什么会出现。spark运行在jvm上,序列化需要遵守java的序列化。将一个对象转换成2进制byte流。常见于数据的传输和保存。
首先被static和transient修饰的对象不会被序列化。这是解决序列化问题的方法之一。
其次spark的计算是在excutor上分布式执行的,代码对象在dirver本地序列化,经过网络传输,发送到各个executor上反序列化,再进行执行。
如何避免:在scala中,在object中声明对象。使用static修饰不可序列化的对象。在sparkstream中,要注意哪些操作在dirver端,哪些操作在executor端。一般在foreach或foreachpartition中来实例化对戏年糕,这样对象在executor上,不需要进行序列化发送。