1.10 Spark Core & SQL
1.10.1 Spark运行模式
(1)Local:运行在一台机器上。测试用。
(2)Standalone:是Spark自身的一个调度系统。 对集群性能要求非常高时用。国内很少使用。
(3)Yarn:采用Hadoop的资源调度器。 国内大量使用。
Yarn-client模式:Driver运行在Client上(不在AM里)
Yarn-cluster模式:Driver在AM上
(4)Mesos:国内很少使用。
(5)K8S:趋势,但是目前不成熟,需要的配置信息太多。
1.10.2 Spark常用端口号
(1)4040 spark-shell任务端口
(2)7077 内部通讯端口。类比Hadoop的8020/9000
(3)8080 查看任务执行情况端口。 类比Hadoop的8088
(4)18080 历史服务器。类比Hadoop的19888
注意:由于Spark只负责计算,所有并没有Hadoop中存储数据的端口9870/50070。
1.10.3 RDD五大属性
1.10.4 RDD弹性体现在哪里
主要表现为存储弹性、计算弹性、任务(Task、Stage)弹性、数据位置弹性,具体如下:
(1)自动进行内存和磁盘切换
(2)基于lineage的高效容错
(3)Task如果失败会特定次数的重试
(4)Stage如果失败会自动进行特定次数的重试,而且只会只计算失败的分片
(5)Checkpoint【每次对RDD操作都会产生新的RDD,如果链条比较长,计算比较笨重,就把数据放在硬盘中】和persist 【内存或磁盘中对数据进行复用】(检查点、持久化)
(6)数据调度弹性:DAG Task 和资源管理无关
(7)数据分片的高度弹性repartion
1.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
1.10.6 Spark的行动算子(5个)
(1)reduce
(2)collect
(3)count
(4)first
(5)take
(6)save
(7)foreach
1.10.7 map和mapPartitions区别
(1)map:每次处理一条数据
(2)mapPartitions:每次处理一个分区数据
1.10.8 Repartition和Coalesce区别
1)关系:
两者都是用来改变RDD的partition数量的,repartition底层调用的就是coalesce方法:coalesce(numPartitions, shuffle = true)。
2)区别:
repartition一定会发生Shuffle,coalesce根据传入的参数来判断是否发生Shuffle。
一般情况下增大rdd的partition数量使用repartition,减少partition数量时使用coalesce。
1.10.9 reduceByKey与groupByKey的区别
reduceByKey:具有预聚合操作。
groupByKey:没有预聚合。
在不影响业务逻辑的前提下,优先采用reduceByKey。
1.10.10 Spark中的血缘
宽依赖和窄依赖。有Shuffle的是宽依赖。
1.10.11 Spark任务的划分
(1)Application:初始化一个SparkContext即生成一个Application;
(2)Job:一个Action算子就会生成一个Job;
(3)Stage:Stage等于宽依赖的个数加1;
(4)Task:一个Stage阶段中,最后一个RDD的分区个数就是Task的个数。
1.10.12 Spark广播变量
1.10.13 SparkSQL中RDD、DataFrame、DataSet三者的转换
1.10.14 Hive on Spark和Spark on Hive区别
元数据 | 执行引擎 | 语法 | 生态 | |
Hive on Spark | MySQL | rdd | HQL | 更加完善 |
Spark on Hive (Spark SQL ) | MySQL | df ds | Spark SQL | 有欠缺(权限管理、元数据管理) |
内置Hive | derby | |||
外置Hive | MySQL |
1.10.15 Spark内核源码(重点)
1)提交流程(重点)
2)Shuffle流程(重点)
(1)未优化的HashShuffle缺点:每个任务单独占用buffer,中间小文件过多。
生成的文件数= Task数量 * 分区数(即Shuffle后的分区数)
(2)优化后的HashShuffle缺点:提高性能优先仍然还有大量小文件。
优化后的HashShuffle,就是复用buffer,开启复用buffer的配置是spark.shuffle.consolidateFiles=true。
生成的文件数= Executor数量 * 分区数(Shuffle后的分区数)
(3)SortShuffle:减少了小文件。
中间落盘应该是本地磁盘
生成的文件数 = Task数量*2
(4)bypassShuffle:减少了小文件,不排序,效率高。在不需要排序的场景使用。
1.10.16 Spark统一内存模型
1)统一内存管理的堆内内存结构如下图
2)统一内存管理的动态占用机制如下图
1.10.17 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个线程。
1.10.18 Spark Shuffle和Hadoop Shuffle区别?
(1)Hadoop不用等所有的MapTask都结束后开启ReduceTask;Spark必须等到父Stage都完成,才能去Fetch数据。
(2)Hadoop的Shuffle是必须排序的,那么不管是Map的输出,还是Reduce的输出,都是分区内有序的,而Spark不要求这一点。
1.10.19 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
1.10.20 Spark任务使用什么进行提交,JavaEE界面还是脚本
Shell脚本。海豚调度器可以通过页面提交Spark任务。
1.10.21 请列举会引起Shuffle过程的Spark算子,并简述功能。
reduceBykey:
groupByKey:
…ByKey:
1.10.22 Spark操作数据库时,如何减少Spark运行中的数据库连接数?
使用foreachPartition代替foreach,在foreachPartition内获取数据库的连接。
1.10.23 Spark数据倾斜
详见Hive on Spark数据倾斜讲解。