面试官:你来简单说说Spark RDD

spark的算子分为几类?

答:1,Tranformation:转换算子。(不会触发job的运行 和 返回值一定是一个RDD)

        2,Action:触发算子。(触发job的运行 和 返回值非RDD )

从小方向来说,Spark 算子大致可以分为以下三类:

1,Value数据类型的Transformation转换算子,这种变换并不触发提交作业,针对处理的数据项是Value型的数据。

2,Key-Value数据类型的Transformation转换算子,这种变换并不触发提交作业,针对处理的数据项是Key-Value型的数据对。

3,Action触发算子,这类算子会触发SparkContext提交Job作业。

RDD的弹性表现在哪几点?

答:数据的容错:1,血缘机制

                             2,缓存机制:persist/unpersist,将RDD缓存在内存或者磁盘中

                             3,Checkpoint机制:将RDD的数据持久化存储在HDFS上

      程序的容错:Task或者job如果失败,可以自动重试

Spark要比MR要快?

  • Spark支持DAG,一个Spark程序中可以有多个job,每个Job中可以多个阶段

  • Spark资源一次性申请Executor,所有Task计算以线程方式运行在固定的Executor中

  • Spark的shuffle过程不是固定的,根据调用的算子不同,执行过程会有区别

    • Shuffle write = Map端shuffle:基本一致

    • Shuffle Read = Reduce 端shuffle:不一样,不同算子会执行不同的操作

  • RDD的弹性设计:缓存机制、宽窄依赖

你说一下spark的shuffle原理?

当使用reduceByKey,groupByKey,sortByKey,countByKey,join等操作的时候,会发生shuffle操作。Spark在DAG阶段将job划分成多个stage,上游stage做map操作,下游stage做reduce操作,其本质还是MR计算架构。shuffle是连接map和reduce之间的桥梁,它是map输出对应到reduce的输出,这期间涉及到序列化和反序列化,跨界点网络IO和磁盘读写IO等,所以说shuffle是整个应用过程特别昂贵的阶段。

在DAG阶段以shuffle为界,划分stage,上游stage做map task,每个map task将计算结果数据分成多份,每一份对应到下游的stage的每个partition中,并将其;临时写到磁盘,该过程叫做shuffle write;下游stage叫做reduce task,每个reduce task通过网络拉去指定分区结果数据,该过程叫做shuffle read,最后完成reduce的业务逻辑

在map阶段,除了map的业务逻辑外,还有shuffle write的过程,这个过程涉及序列化,磁盘IO等耗时操作;在reduce阶段,除了reduce的业务逻辑外,还有shuffle read过程,这个过程涉及到网络IO,反序列化等耗时操作。所以整个shuffle过程是极其昂贵的,因为shuffle是⼀个涉及CPU(序列化反序列化)、⽹络IO(跨节点数据传输)以及磁盘IO(shuffle中间结果落地)的操作,所以 应当考虑shuffle相关的调优,提升spark应⽤程序的性能。

说一下spark的开发优化和设计优化?


        1,开发优化:

谓词下推:尽量将不需要的数据提前过滤掉join

        2,DSL开发:选择一些合适算子,

尽量选用有Map端聚合的算子:先分区内聚合【Combiner】,再分区间聚合【Reduce】

方案一:

        groupByKey + reduce

将所有数据的数据统一放到一起再进行分区,再做聚合

方案二:

        reduceByKey / countByKey / foldByKey / AggragateByKey => CombinerByKey

每个分区内部先分组聚合一次,再将每个分区的结果进行聚合

结构优化:文件存储类型、分区结构化

分区表:静态分区裁剪

上代码:select count(*) from table1 where dt = '2021-11-09'; --走分区裁剪过滤查询

继续上代码:

-- 不支持join中动态分区裁剪
select
 *
from table1 a join table2 b on a.dt = b.dt 
and a.dt = '2021-11-09' and b.dt = '2021-11-09';

但是合适文件类型:parquet/orc

=====================================================================完==

后续可以问一下HR他们公司spark用的是什么版本如果是3.0以后的版本内置了很多优化

spark3.0优化

动态分区裁剪(Dynamic Partition Pruning)

  • 默认的分区裁剪只有在单表查询过滤时才有效

  • 开启动态分区裁剪:自动在Join时对两边表的数据根据条件进行查询过滤,将过滤后的结果再进行join

  • 上代码:  spark.sql.optimizer.dynamicPartitionPruning.enabled=true

自适应查询执行(Adaptive Query Execution)

  • 基于CBO优化器引擎:实现最小代价的数据处理

  • 自动根据统计信息设置Reducer【ShuffleRead】的数量来避免内存和I/O资源的浪费

    • Shuffle Write : Map

  • Shuffle Read : Reduce

  • 自动选择更优的join策略来提高连接查询性能

    • Shuffle Join、Broadcast Join

  • 自动优化join数据来避免不平衡查询造成的数据倾斜,将数据倾斜的数据自动重分区

  • 上代码:spark.sql.adaptive.enabled=true

  • 加速器感知调度(Accelerator-aware Scheduling)

    • 添加原生的 GPU 调度支持,该方案填补了 Spark 在 GPU 资源的任务调度方面的空白

  • 有机地融合了大数据处理和 AI 应用,扩展了 Spark 在深度学习、信号处理和各大数据应用的应用场景

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值