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