高频面试之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内获取数据库的连接。

相关推荐
安替-AnTi23 分钟前
基于Django的购物系统
python·sql·django·毕设·购物系统
潘小磊24 分钟前
高频面试之11Flink
面试·flink
小葛呀2 小时前
互联网大数据求职面试:从Zookeeper到数据挖掘的技术探讨
大数据·redis·zookeeper·面试·互联网·数据采集·技术栈
zh_199954 小时前
Spark面试精讲(上)
java·大数据·数据仓库·python·spark·数据库开发·数据库架构
爱笑的眼睛115 小时前
HarmonyOS 组件复用面试宝典 [特殊字符]
华为·面试·harmonyos·harmonyos next
章鱼paul帝5 小时前
浅谈 iOS 字典 NSDictionary 的底层实现原理
面试
zhuiQiuMX5 小时前
SQL力扣
数据库·sql·leetcode
远方16095 小时前
29-Oracle 23ai Flashback Log Placement(闪回日志灵活配置)
数据库·sql·oracle·database
寒山李白6 小时前
Java 传输较大数据的相关问题解析和面试问答
java·开发语言·面试·传输