高频面试之10 Spark Core & SQL

10 Spark Core & SQL

文章目录

  • [10 Spark Core & SQL](#10 Spark Core & SQL)
    • [10.1 Spark运行模式](#10.1 Spark运行模式)
    • [10.2 Spark常用端口号](#10.2 Spark常用端口号)
    • [10.3 RDD五大属性](#10.3 RDD五大属性)
    • [10.4 RDD弹性体现在哪里](#10.4 RDD弹性体现在哪里)
    • [10.5 Spark的转换算子(8个)](#10.5 Spark的转换算子(8个))
    • [10.6 Spark的行动算子(5个)](#10.6 Spark的行动算子(5个))
    • [10.7 map和mapPartitions区别](#10.7 map和mapPartitions区别)
    • [10.8 Repartition和Coalesce区别](#10.8 Repartition和Coalesce区别)
    • [10.9 reduceByKey与groupByKey的区别](#10.9 reduceByKey与groupByKey的区别)
    • [10.10 Spark中的血缘](#10.10 Spark中的血缘)
    • [10.11 Spark任务的划分](#10.11 Spark任务的划分)
    • [10.12 SparkSQL中RDD、DataFrame、DataSet三者的转换及区别](#10.12 SparkSQL中RDD、DataFrame、DataSet三者的转换及区别)
    • [10.13 Hive on Spark和Spark on Hive区别](#10.13 Hive on Spark和Spark on Hive区别)
    • [10.14 Spark内核源码(重点)](#10.14 Spark内核源码(重点))
    • [10.15 Spark统一内存模型](#10.15 Spark统一内存模型)
    • [10.16 Spark为什么比MR快?](#10.16 Spark为什么比MR快?)
    • [10.17 Spark Shuffle和Hadoop Shuffle区别?](#10.17 Spark Shuffle和Hadoop Shuffle区别?)
    • [10.18 Spark提交作业参数(重点)](#10.18 Spark提交作业参数(重点))
    • [10.19 Spark任务使用什么进行提交,JavaEE界面还是脚本](#10.19 Spark任务使用什么进行提交,JavaEE界面还是脚本)
    • [10.20 请列举会引起Shuffle过程的Spark算子,并简述功能。](#10.20 请列举会引起Shuffle过程的Spark算子,并简述功能。)
    • [10.21 Spark操作数据库时,如何减少Spark运行中的数据库连接数?](#10.21 Spark操作数据库时,如何减少Spark运行中的数据库连接数?)

10.1 Spark运行模式

(1)Local:运行在一台机器上。测试用。

(2)Standalone:是Spark自身的一个调度系统。 对集群性能要求非常高时用。国内很少使用。

(3)Yarn:采用Hadoop的资源调度器。 国内大量使用。

Yarn-client模式:Driver运行在Client上(不在AM里)

Yarn-cluster模式:Driver在AM上

(4)Mesos:国内很少使用。

(5)K8S:趋势,但是目前不成熟,需要的配置信息太多。

10.2 Spark常用端口号

(1)4040 spark-shell任务端口

(2)7077 内部通讯端口。类比Hadoop的8020/9000

(3)8080 查看任务执行情况端口。 类比Hadoop的8088

(4)18080 历史服务器。类比Hadoop的19888

注意:由于Spark只负责计算,所有并没有Hadoop中存储数据的端口9870/50070。

10.3 RDD五大属性

10.4 RDD弹性体现在哪里

主要表现为存储弹性、计算弹性、任务(Task、Stage)弹性、数据位置弹性,具体如下:

(1)自动进行内存和磁盘切换

(2)基于lineage的高效容错

(3)Task如果失败会特定次数的重试

(4)Stage如果失败会自动进行特定次数的重试,而且只会只计算失败的分片

(5)Checkpoint【每次对RDD操作都会产生新的RDD,如果链条比较长,计算比较笨重,就把数据放在硬盘中】和persist 【内存或磁盘中对数据进行复用】(检查点、持久化)

(6)数据调度弹性:DAG Task 和资源管理无关

(7)数据分片的高度弹性repartion

10.5 Spark的转换算子(8个)

1)单Value

(1)map

(2)mapPartitions

(3)mapPartitionsWithIndex

(4)flatMap

(5)groupBy

(6)filter

(7)distinct

(8)coalesce

(9)repartition

(10)sortBy
2)双vlaue

(1)intersection

(2)union

(3)subtract

(4)zip
3)Key-Value

(1)partitionBy

(2)reduceByKey

(3)groupByKey

(4)sortByKey

(5)mapValues

(6)join

10.6 Spark的行动算子(5个)

(1)reduce

(2)collect

(3)count

(4)first

(5)take

(6)save

(7)foreach

10.7 map和mapPartitions区别

(1)map:每次处理一条数据

(2)mapPartitions:每次处理一个分区数据

10.8 Repartition和Coalesce区别

1)关系:

两者都是用来改变RDD的partition数量的,repartition底层调用的就是coalesce方法:coalesce(numPartitions, shuffle = true)。
2)区别:

repartition一定会发生Shuffle,coalesce根据传入的参数来判断是否发生Shuffle。

一般情况下增大rdd的partition数量使用repartition,减少partition数量时使用coalesce。

10.9 reduceByKey与groupByKey的区别

reduceByKey:具有预聚合操作。

groupByKey:没有预聚合。

在不影响业务逻辑的前提下,优先采用reduceByKey。

10.10 Spark中的血缘

宽依赖和窄依赖。有Shuffle的是宽依赖。

10.11 Spark任务的划分

(1)Application:初始化一个SparkContext即生成一个Application;

(2)Job:一个Action算子就会生成一个Job;

(3)Stage:Stage等于宽依赖的个数加1;

(4)Task:一个Stage阶段中,最后一个RDD的分区个数就是Task的个数。

10.12 SparkSQL中RDD、DataFrame、DataSet三者的转换及区别

DataFrame和DataSet的区别:前者是row类型

RDD和DataSet及DataSet的区别:前者没有字段和表信息

10.13 Hive on Spark和Spark on Hive区别

元数据 执行引擎 语法 生态
Hive on Spark MySQL rdd HQL 更加完善
Spark on Hive MySQL df ds Spark SQL 有欠缺(权限管理、元数据管理)
内置Hive derby
外置Hive MySQL

10.14 Spark内核源码(重点)

1)提交流程(重点)



2)Shuffle流程(重点)

(1)SortShuffle:减少了小文件。

中间落盘应该是本地磁盘

生成的文件数 = Task数量*2

在溢写磁盘前,先根据key进行排序,排序过后的数据,会分批写入到磁盘文件中。默认批次为10000条,数据会以每批一万条写入到磁盘文件。写入磁盘文件通过缓冲区溢写的方式,每次溢写都会产生一个磁盘文件,也就是说一个Task过程会产生多个临时文件。最后在每个Task中,将所有的临时文件合并,这就是merge过程,此过程将所有临时文件读取出来,一次写入到最终文件。

(4)bypassShuffle:减少了小文件,不排序,效率高。在不需要排序的场景使用。

10.15 Spark统一内存模型

1)统一内存管理的堆内内存结构如下图

2)统一内存管理的动态占用机制如下图

10.16 Spark为什么比MR快?

1)内存&硬盘

(1)MR在Map阶段会在溢写阶段将中间结果频繁的写入磁盘,在Reduce阶段再从磁盘拉取数据。频繁的磁盘IO消耗大量时间。

(2)Spark不需要将计算的中间结果写入磁盘。这得益于Spark的RDD,在各个RDD的分区中,各自处理自己的中间结果即可。在迭代计算时,这一优势更为明显。
2)Spark DAG任务划分减少了不必要的Shuffle

(1)对MR来说,每一个Job的结果都会落地到磁盘。后续依赖于次Job结果的Job,会从磁盘中读取数据再进行计算。

(2)对于Spark来说,每一个Job的结果都可以保存到内存中,供后续Job使用。配合Spark的缓存机制,大大的减少了不必要的Shuffle。
3)资源申请粒度:进程&线程

开启和调度进程的代价一般情况下大于线程的代价。

(1)MR任务以进程的方式运行在Yarn集群中。N个MapTask就要申请N个进程

(2)Spark的任务是以线程的方式运行在进程中。N个MapTask就要申请N个线程。

10.17 Spark Shuffle和Hadoop Shuffle区别?

(1)Hadoop不用等所有的MapTask都结束后开启ReduceTask;Spark必须等到父Stage都完成,才能去Fetch数据。

(2)Hadoop的Shuffle是必须排序的,那么不管是Map的输出,还是Reduce的输出,都是分区内有序的,而Spark不要求这一点。

10.18 Spark提交作业参数(重点)

参考答案:
https://blog.csdn.net/gamer_gyt/article/details/79135118
1)在提交任务时的几个重要参数

executor-cores ------ 每个executor使用的内核数,默认为1,官方建议2-5个,我们企业是4个

num-executors ------ 启动executors的数量,默认为2

executor-memory ------ executor内存大小,默认1G

driver-cores ------ driver使用内核数,默认为1

driver-memory ------ driver内存大小,默认512M
2)给一个提交任务的样式

spark-submit

--master local[5]

--driver-cores 2

--driver-memory 8g

--executor-cores 4

--num-executors 10

--executor-memory 8g

--class PackageName.ClassName XXXX.jar

--name "Spark Job Name"

InputPath

OutputPath

10.19 Spark任务使用什么进行提交,JavaEE界面还是脚本

Shell脚本。海豚调度器可以通过页面提交Spark任务。

10.20 请列举会引起Shuffle过程的Spark算子,并简述功能。

reduceBykey:

groupByKey:

...ByKey:

10.21 Spark操作数据库时,如何减少Spark运行中的数据库连接数?

使用foreachPartition代替foreach,在foreachPartition内获取数据库的连接。

相关推荐
一个 00 后的码农3 分钟前
26考研物理复试面试常见问答问题汇总(2)电磁波高频面试问题,物理专业保研推免夏令营面试问题汇总
考研·面试·职场和发展
左纷9 分钟前
git部分命令的简单使用
前端·面试
gadiaola19 分钟前
【JavaSE面试篇】Java集合部分高频八股汇总
java·面试
红衣信24 分钟前
深入剖析 hooks-todos 项目:前端开发的实用实践
前端·react.js·面试
Code季风36 分钟前
SQL关键字快速入门:CASE 实现条件逻辑
javascript·数据库·sql
艾迪的技术之路41 分钟前
redisson使用lock导致死锁问题
java·后端·面试
独立开阀者_FwtCoder1 小时前
Vite Devtools 要发布了!期待
前端·面试·github
kk在加油2 小时前
Mysql锁机制与优化实践以及MVCC底层原理剖析
数据库·sql·mysql
前端小巷子2 小时前
Web开发中的文件下载
前端·javascript·面试
满昕欢喜11 小时前
SQL Server从入门到项目实践(超值版)读书笔记 20
数据库·sql·sqlserver