大数据面试题之Spark Core & SQL

Spark 运行模式

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

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

很少使用。

(3) Yarn: 采用 Hadoop 的资源调度器 。 国内大量使用 。 Yarn-client 模式: Driver 运行在 Client 上 (不在 AM 里) Yarn-cluster 模式: Driver 在 AM 上

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

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

Spark 常用端口号

(1) 4040 spark-shell 任务端口

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

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

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

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

RDD 五大属性

RDD 弹性体现在哪里

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

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

(2) 基于 lineage 的高效容错

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

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

(5) Checkpoint 【每次对 RDD 操作都会产生新的 RDD, 如果链条比较长, 计算比较

笨重, 就把数据放在硬盘中】和 persist 【内存或磁盘中对数据进行复用】(检查点、持久化)

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

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

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

Spark 的行动算子 (5 个)

(1) reduce

(2) collect

(3) count

(4) first

(5) take

(6) save

(7) foreach

map 和 mapPartitions 区别

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

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

Repartition 和 Coalesce 区别

1) 关系:

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

2) 区别:

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

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

reduceByKey 与 groupByKey 的区别

reduceByKey: 具有预聚合操作。

groupByKey: 没有预聚合。

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

Spark 中的血缘

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

Spark 任务的划分

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

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

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

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

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

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

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

Hive on Spark 和 Spark on Hive 区别

Spark 内核源码 (重点)

1) 提交流程 (重点)

2) Shuffle 流程 (重点)

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

中间落盘应该是本地磁盘

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

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

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

Spark 统一 内存模型

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

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

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 个线程。

Spark Shuffle 和 Hadoop Shuffle 区别?

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

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

Spark 提交作业参数 (重点)

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值