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 在深度学习、信号处理和各大数据应用的应用场景