Spark常见面试题

checkpoint机制

        checkpoint的意思就是建立检查点,类似于快照,当一个spark的血缘关系比较长的时候,服务器需要将整个计算完成得出结果,但是如果在这很长的计算流程中突然中间算出的数据丢失了,spark又会根据RDD的依赖关系从头到尾计算一遍,这样子就很费性能,当然我们可以将中间的计算结果通过cache或者persist放到内存或者磁盘中,但是这样也不能保证数据完全不会丢失,存储的这个内存出问题了或者磁盘坏了,也会导致spark从头再根据RDD计算一遍,所以就有了checkpoint,其中checkpoint的作用就是将DAG中比较重要的中间数据做一个检查点将结果存储到HDFS里面。
    使用 checkpoint 的时候,建议先将 rdd.cache 一次,因为 checkpoint 是 transform 算子,执行的时候相当于走了两次流程,前面计算了一遍,然后checkpoint又会计算一次,所以一般我们先进行cache然后做checkpoint就会只走一次流程,checkpoint的时候就会从刚cache到内存中取数据写入hdfs中

累加器

向Spark传递函数时,通常可以使用Driver端定义的变量,但是在Executor端使用此变量时,每个task中使用的都是此变量的副本。如果变量的值发生了变化,Driver端的变量值却不会改变。

1) 系统自带累加器 longAccumuator
    如果在driver中定义一个变量,在算子中去进行数字累加,但是程序执行后,该变量的值没有发生改变    
    原因是因为driver定义的变量在算子中使用中,是他的副本,底层会将该变量传输到执行器
       所以可以通过累加器完成该累加操作
        
       rdd1 = sc.makeRDD(1 to 10,2)
       var sum = 0
       val x1 = sc.longAccumuator()
       rdd1.foreach(v =>{
           x1.add(v)
       })
       println(sum)
       
2) 自定义累加器   extends AccumulatorV2  重写add方法

广播变量

         如果Executor需要访问driver的某个变量,spark会将Executor的所有节点都发一份该变量的副本,如果这个数据比较大的话,就会造成大量的内存和数据传输,因此使用广播变量,将会给一个Executor发送一份变量 ,减少了网络传输和内存损耗。
        广播变量的应用场景:大表 Join  小表 ,广播小表  

cache和persist

    cache将数据缓存到内存中,cache底层调用了persist,使用persist可以设置缓存级别
    cache的用途是在一个application中有多个job,对rdd进行cache,当第一个job触发后,会执行cache操作,第二个job在计算时可以从缓存中

cache最终也是调用了persist方法   
persist缓存级别
  MEMORY_ONLY:将 RDD 缓存到内存中。
  MEMORY_ONLY_SER:将 RDD 缓存为序列化的 Java 对象,并将其存储在内存中。
  MEMORY_AND_DISK:将 RDD 缓存到内存中,同时如果内存空间不足,可以将不常用的分区写入磁盘。
  MEMORY_AND_DISK_SER:将 RDD 缓存为序列化的 Java 对象,并将其存储在内存中。如果内存空间不足,可以将不常用的分区写入磁盘。
  DISK_ONLY:将 RDD 缓存到磁盘上。
  MEMORY_ONLY_2、MEMORY_AND_DISK_2、MEMORY_AND_DISK_SER_2:这三种级别存储的数据有两份副本,以提高容错性。
rdd默认缓存等级MEMORY_ONLY,DataSet和DataFrame默认缓存MEMORY_AND_DISK

Persist和Cache和checkpoint的区别
位置:Persist和Cache将数据保存在内存,使用计算过程中的数据缓存,Checkpoint将数据保存在HDFS
生命周期:Persist和Cache程序结束后会被清除或手动调用unpersist方法,Checkpoint永久存储不会被删除
RDD依赖关系:Persist和Cache,不会丢掉RDD间的依赖关系,Checkpoint会斩断依赖关系
checkpoint:磁盘,截断血缘关系,在ck之前必须没有任何任务提交才会生效,ck过程会额外提交一次任务。

spark的宽窄依赖,设计宽窄依赖的目的,窄依赖的算子

窄依赖:父RDD的一个分区只会被子RDD的一个分区依赖
宽依赖:父RDD的一个分区会被子RDD的多个分区依赖,中间会产生shuffle


宽依赖是指RDD之间存在着多对一的依赖关系。在宽依赖下,每个父RDD的分区都可能对当前RDD的一个或多个分区进行贡献。在这种情况下,Spark需要将父RDD中所有分区的数据全部传输给子RDD中的一个分区,才能完成任务,这会带来较大的网络开销和延迟。因此,宽依赖会导致任务的执行效率降低。
窄依赖是指RDD之间存在着一对一的依赖关系。在窄依赖下,每个父RDD的分区都只能对当前RDD的一个分区进行贡献。在这种情况下,Spark只需要将父RDD中与子RDD分区对应的数据进行传输,就能够完成任务,这可以大大减少网络开销和延迟,提高任务的执行效率。
因为Spark作业需要通过遍历RDD的依赖关系图(DAG)来执行所有的转化和行动操作,因此设计窄依赖就可以减少遍历RDD DAG所需要的操作。这样就可以加速任务的执行,并且可以减少Spark作业的整体运行时间。另外,设计窄依赖也可以帮助Spark高效地利用资源,提高任务的容错性。因此,设计宽窄依赖的目的是为了提高Spark作业的执行效率和可靠性。

Spark中有很多算子都是窄依赖算子,例如:map、filter、union等


spark的job作业划分stage阶段,宽依赖会划分新的阶段
在同一个stage阶段,包含的算子作为task可以交给一个executor执行,不用考虑其他分区的执行情况

spark的转换算子和行动算子有什么区别

    转换算子:这些方法接收一个 RDD 并返回一个新的 RDD,但并不执行计算。Spark 只有在执行行动算子时才开始计算转换算子。
    行动算子:这些方法立即对 RDD 执行计算,并以某种形式将结果返回给驱动程序或存储在外部系统中。行动算子会触发 Spark 执行所有与相应 RDD 相关的转换算子,并返回计算结果。

转换算子的例子包括map、filter、reduceByKey 等方法。它们定义了 RDD 的操作,但不会立即启动任何算。而行动算子的例子包括count、collect、foreach等。它们会触发 Spark 计算 RDD 并返回结果。

总的来说,转换算子主要用于构建 RDD,而行动算子主要用于从 RDD 中检索和操纵数据。Spark 使用延迟计算技术以提高性能,因此只有当需要计算时才会执行操作,即当调用行动算子时才会真计算 RDD。

什么时候减少分区
    数据量较小:如果处理的数据集较小,使用更少的分区可能会提高性能,因为分区太多会导致过多的管理开销。
    数据分布不平衡:如果数据的分布不平衡,一些分区可能比其他分区更大,导致处理负载不均衡。在这种情况下,可以通过减少一些大分区的数量来平衡分布,使处理更加均衡。
    执行shuffle操作:在执行需要重新分区的操作时,减少分区可以降低网络传输的数据量,加快Shuffle的速度。

foreach和foreachPartition

foreach和foreachPartition都是Spark中用于对RDD进行遍历的方法,两者的作用类似,但方式有所不同。

foreach:将函数应用于RDD中的每个元素,它的输入是一个函数,当RDD的一个partition中的所有元素被处理完后,该partition会被释放掉。

foreachPartition方法:将函数应用于RDD中的每个partition,它的输入是一个函数,这个函数接收一个partition(即一个Iterator对象),对该partition的所有元素进行操作。它的主要作用是可以在每个partition的上下文中进行初始化操作,减少开销。

因此,foreach方法每次处理一个元素,速度较慢,主要用于对RDD的元素进行迭代遍历;foreachPartition方法是对每个partition进行操作,速度较快,适合对每个partition进行操作,如批量写入数据到数据库等。另外,由于foreachPartition只需要初始化一次上下文,因此其在初始化等时,具有比较明显的性能优势。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值