Spark常见面试问题整理

数据倾斜

  1. 什么是数据倾斜
    在并行处理的大数据系统中,某个部分(Partition)的数据量严重大于其他部分,导致该部分的数据处理速度成为数据集处理的瓶颈。
  2. 为什么会数据倾斜
    同一Stage中不同task处理的数据量存在显著差异,某个task处理的数据量严重大于其他task。
  3. 怎样解决数据倾斜的问题
    提高shuffle操作的并行度
    为了避免task较少导致多个key分配到同一task且分配不均的问题,可以适当提高task的数量(但是并不能解决某一个key数据量严重大于其他key的情况的问题)
    在这里插入图片描述

两阶段聚合(为key增加随机前缀/后缀)
如果某个key的数据量过大,比如key为‘hello’的数据有很多,可以为其加上前缀,变为:0_hello,1_hello,2_hello…
然后分别分配到不同task上,进行局部聚合,最终再进行全局聚合,彻底解决key的数据量不均衡的问题。
将reduce join转为map join,消除shuffle带来的数据倾斜
reduce join: 适合两个大表join,map阶段保留两个表的全部信息,以join的关键字为key进行分布式计算后,shuffle和reduce阶段进行join。
reduce join的map阶段没有对数据进行瘦身,reduce对两个表进行乘积运算,内存消耗大。
在这里插入图片描述
map join:适合一个小表join一个大表,将小表的数据全部加载到节点内存中,join完之后没有reduce操作。
map join必须有一个表足够小,能够在内存中进行join操作。
将数据量过多的字段删除,如company_id=0对应上亿条数据,其他对应个位数,则company_id=0分配到的节点会内存溢出导致程序崩溃,删除该异常值则可以快速执行。

Spark运行架构

  1. Spark的组成部件包括:driverexecutor (都是进程),负责资源的使用。
    驱动器节点(driver):
    执行main()方法的进程,构建sparkContext对象,负责把用户程序分为多个stage(串行),并把每个stage分解为多个任务task(并行),为各执行器分配任务和调度任务执行;
    驱动器一旦终止,Spark应用结束。
    执行器节点(executor):
    负责运行任务,将rdd缓存在执行器进程内,并把结果返回给驱动器进程
    执行器彼此相互独立,如果一个执行器节点崩溃,Spark应用可以继续执行。
  2. 主节点(master)和工作节点(worker)(是物理节点),负责资源的管理和分配。
    一台机器可以同时作为master和worker节点。
    主节点(master)
    负责管理worker节点,executor向master请求资源。
    工作节点(worker):
    负责管理executor进程。一个Worker默认情况下分配一个Executor,配置时根据需要也可以配置多个Executor。
    在这里插入图片描述

宽依赖和窄依赖

1. 窄依赖
窄依赖就是指父RDD的每个分区只被一个子RDD分区使用,子RDD分区通常只对应常数个父RDD分区
在这里插入图片描述
2. 宽依赖
宽依赖就是指父RDD的每个分区都有可能被多个子RDD分区使用,子RDD分区通常对应父RDD所有分区
在这里插入图片描述
3. 宽依赖和窄依赖的区别
宽依赖往往对应着shuffle操作,需要在运行的过程中将同一个RDD分区传入到不同的RDD分区中,中间可能涉及到多个节点之间数据的传输,而窄依赖的每个父RDD分区通常只会传入到另一个子RDD分区,通常在一个节点内完成。
当RDD分区丢失时,对于窄依赖来说,由于父RDD的一个分区只对应一个子RDD分区,这样只需要重新计算与子RDD分区对应的父RDD分区就行。这个计算对数据的利用是100%的
当RDD分区丢失时,对于宽依赖来说,重算的父RDD分区只有一部分数据是对应丢失的子RDD分区的,另一部分就造成了多余的计算。宽依赖中的子RDD分区通常来自多个父RDD分区,极端情况下,所有父RDD都有可能重新计算。
4. 对应的函数
窄依赖的函数有:
map, filter, union, join(父RDD是hash-partitioned ), mapPartitions, mapValues
宽依赖的函数有:
groupByKey, join(父RDD不是hash-partitioned ), partitionBy

参考文章:
Spark面试题(一).知乎专栏.runzhliu
Spark宽依赖与窄依赖.简书.不圆的石头

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值