SparkCore & SQL

本文详细探讨了Spark的多种部署方式,如Local、Standalone、YARN和Mesos;介绍了Spark任务的提交方式,关键参数,以及Spark的架构、作业提交流程。还涵盖了RDD的血统概念、宽窄依赖、transformation和action算子,以及Shuffle过程和优化。此外,讨论了Spark的缓存机制、共享变量和数据库连接管理,以及实现TopN的策略。

1.Spark有几种部署方式?请分别简要论述

1)Local:运行在一台机器上,通常是练手或者测试环境

2)Standlone:构建一个基于Master+slaves的资源调度集群,spark任务提交个哦,aster运行.是Spark自身的一个调度系统

3)Yarn:Spark客户端直接连接Yarn,不需要构建Spark集群.有yarn-client和yarn-cluster两种,模式,主要区别在于:Driver程序运行的节点

4)Mesos:国内大环境比较少用

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

shell脚本

3. 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.ClassNameXXXX.jar \

        --name"SparkJobName" \

        InputPath \

        OutputPath

4. 简述Spark的架构与作业提交流程(画图讲解,注明各个部分的作用)

5.如何理解Spark中的血统概念(RDD)

        RDD在Lineage依赖方面分为两种NarrowDependencies与WideDependecies用来解决数据容错时的高效性以及划分任务时候起到重要作用

6.简述Spark的宽窄依赖,以及Spark如何划分stage,每个stage又根据什么决定task个数?

        Stage:根据RDD之间的依赖关系的不同将JOB划分成不同的Stage,遇到一个宽依赖则划分一个Stage

        Task:Stage是一个TaskSet,将Stage根据分区数划分成一个个Task

 7.请列举Spark的transformation算子(不少于8个),并简述功能

1)map(func):返回一个新的RDD,该该RDD由每一个输入元素经过func函数转换后组成.

2)mapPartitions(fanc):类似于map,但独立地在RDD的每一个分片上运行,因此在类型为T的RD上运行时,func的函数类型必须是Iterator[T] => Iterator[U]。假设有N个元素,有M个分区,那么map的函数的将被调用N次,而mapPartitions被调用M次,一个函数一次处理所有分区

3)reduceByKey(func,[numTask]):在一个(K,V)的RDD上调用,返回一个(K,V)的RDD,使用定的reduce函数,将相同key的值聚合到一起,reduce任务的个数可以通过第二个可选的参数来设置

4)aggregateByKey(zeroValue:U,[partitioner: Partitioner])(seqOp: (U, V) => U,combOp: (U, U) => U: 在kv对的RDD中,按key将value进行分组合并,合并时,将每个value和初始值作为seq函数的参数,进行计算,返回的结果作为一个新的kv对,然后再将结果按照key进行合并,最后将每个分组的value传递给combine函数进行计算(先将前两个value进行计算,将返回结果和下一个value传给combine函数,以此类推),将key与计算结果作为一个新的kv对输出

5)combineByKey(createCombiner: V=>C, mergeValue: (C, V) =>C, mergeCombiners: (C, C) =>C):

对相同K,把V合并成一个集合

6)createCombiner: combineByKey() 会遍历分区中的所有元素,因此每个元素的键要么还没有遇到过,要么就和之前的某个元素的键相同。如果这是一个新的元素,combineByKey()会使用一个叫作createCombiner()的函数来创建那个键对应的累加器的初始值

7)mergeValue: 如果这是一个在处理当前分区之前已经遇到的键,它会使用mergeValue()方法将该键的累加器对应的当前值与这个新的值进行合并

8)mergeCombiners: 由于每个分区都是独立处理的, 因此对于同一个键可以有多个累加器。如果有两个或者更多的分区都有对应同一个键的累加器, 就需要使用用户提供的 mergeCombiners() 方法将各个分区的结果进行合并

8.请列举Spark的action算子(不少于6个),并简述功能

1)reduce:

2)collect:

3)first:

4)take:

5)aggregate:

6)countByKey:

7)foreach:

8)savaAsTextFile:

9. 请列举会引起Shuffle过程的Spark算子,并简述功能

reduceByKey:

groupByKey:

...ByKay:

10 简述Spark的两种核心Shuffle(HashShuffle与SortShuffle)的工作流程(包括未优化的HashShuffle、优化的HashShuffle、普通的SortShuffle与bypass的SortShuffle)

 

当shuffle read task 的数量小于等于spark.shuffle.sort

bypassMergeThreshold参数的值时(默认为200,就会启用bypass机制)

11 Spark常用算子reduceByKey与groupByKey的区别,哪一种更具优势?

        reduceByKey:按照Key进行聚合,在shuffle之前有combine(预聚合)操作,返回结果RDD[k,v]

        groupByKey:按照key进行分组,直接进行shuffle.

        开发指导:reduceByKey比groupByKey,建议使用但是需要注意是否会影响业务逻辑

12 Repartition和Coalesce关系与区别

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

        2)区别:repartition一定会发生shuffle,coalesce根据传入的参数来判断是否发生shuffle一般情况下增大rdd的partition数量使用repartition.减少partition数量时使用coalesce

13 分别简述Spark中的缓存机制(cache和persist)与checkpoint机制,并指出两者的区别与联系

        都是做RDD持久化的

        cache:内存,不会截断血缘关系,使用计算过程中的数据缓存

        checkpoint:磁盘,截断血缘关系,在CK之前必须没有任何任务提交才会生效,ck过程会额外提交一次任务

14 简述Spark中共享变量(广播变量和累加器)的基本原理与用途。

        累加器(accumulator)是Spark中提供的一个分布式的变量机制,其原理类似于mapreduce,即分布式的改变,然后聚合这些改变.累加器的一个常见用途是在调试时对作业执行过程中的事件进行计数.而广播变量用来高效分发较大的对象

        共享变量出现的原因:

        通常在向Spark传递函数时,比如使用map()函数或者使用filter()传条件时,可以使用驱动器程序中定义的变量,但是集群中运行的每个任务都会得到这些变量的一份新的副本,更新这些副本的值也不会影响驱动器中的对应变量

        Spark的两个共享变量,累加器与广播变量,分别为结果聚合与广播这两种常见的通信模式突破了这一限制

15.当Spark涉及到数据库的操作时,如何减少Spark运行中的数据库连接数?

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

16.如何使用Spark实现TopN的获取(描述思路或使用伪代码)

       方法1:

                (1)按照key对数据进行聚合(groupByKey)

                (2)将value转换为数组,利用scala的sortby或者sortWith进行排序(mapValues)数据量太大,会OOM

        方法2:

                (1)取出所有key

                (2)对key进行迭代,每次取出一个key利用spark的排序算子进行排序

        方法3:

                (1)自定义分区器,按照key进行分区,使不同的key进到不同的分区

                (2)对每个分区运用spark的排序算子进行排序         

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值