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

相关推荐
不辉放弃6 分钟前
Spark的累加器(Accumulator)
大数据·数据库·spark
梦想养猫开书店10 分钟前
36、spark-measure 源码修改用于数据质量监控
大数据·分布式·spark
Freed&42 分钟前
Elasticsearch 从入门到精通:术语、索引、分片、读写流程与面试高频题一文搞懂
大数据·elasticsearch·面试
Cosolar1 小时前
深入 Quartz 的内核:它是如何“到点就把任务叫醒”的
java·后端·面试
ALLSectorSorft1 小时前
相亲小程序聊天与互动系统模块搭建
java·数据库·sql·microsoft·oracle
王中阳Go2 小时前
跟复旦硕士聊了1小时,没想到这些基础题他居然也栽了
后端·面试·go
Hilaku3 小时前
“全栈”正在淘汰“前端”吗?一个前端专家的焦虑与思考
前端·面试·程序员
天天摸鱼的java工程师4 小时前
如何设计一个高可用的微服务网关?你会如何考虑这道面试题?
java·后端·面试
张元清4 小时前
React 曝光埋点组件的血泪史:一个前端工程师的技术觉醒之路
前端·javascript·面试