分享

面试最新整理常问Spark知识点

本帖最后由 hanyunsong 于 2020-9-17 18:22 编辑

问题导读:

1. RDD有哪些特性?
2. Map和MapPartitions有哪些区别?
3.
为什么Spark Application在没有获得足够的资源,job就开始执行了,可能会导致什么什么问题发生?


RDD的五个特性:

1.A list of partitions

RDD是一个由多个partition(某个节点里的某一片连续的数据)组成的的list;将数据加载为RDD时,一般会遵循数据的本地性(一般一个hdfs里的block会加载为一个partition)。

2.A function for computing each split

一个函数计算每一个分片,RDD的每个partition上面都会有function,也就是函数应用,其作用是实现RDD之间partition的转换。

3.A list of dependencies on other RDDs

RDD会记录它的依赖 ,依赖还具体分为宽依赖和窄依赖,但并不是所有的RDD都有依赖。为了容错(重算,cache,checkpoint),也就是说在内存中的RDD操作时出错或丢失会进行重算。

4.Optionally,a Partitioner for Key-value RDDs

可选项,如果RDD里面存的数据是key-value形式,则可以传递一个自定义的Partitioner进行重新分区,例如这里自定义的Partitioner是基于key进行分区,那则会将不同RDD里面的相同key的数据放到同一个partition里面

5.Optionally, a list of preferred locations to compute each split on

最优的位置去计算,也就是数据的本地性。

Map和MapPartitions的区别

map是对rdd中的每一个元素进行操作;
mapPartitions则是对rdd中的每个分区的迭代器进行操作

MapPartitions的优点:

如果是普通的map,比如一个partition中有1万条数据。ok,那么你的function要执行和计算1万次。
使用MapPartitions操作之后,一个task仅仅会执行一次function,function一次接收所有
的partition数据。只要执行一次就可以了,性能比较高。如果在map过程中需要频繁创建额外的对象(例如将rdd中的数据通过jdbc写入数据库,map需要为每个元素创建一个链接而mapPartition为每个partition创建一个链接),则mapPartitions效率比map高的多。
SparkSql或DataFrame默认会对程序进行mapPartition的优化。

MapPartitions的缺点:

如果是普通的map操作,一次function的执行就处理一条数据;那么如果内存不够用的情况下, 比如处理了1千条数据了,那么这个时候内存不够了,那么就可以将已经处理完的1千条数据从内存里面垃圾回收掉,或者用其他方法,腾出空间来吧。
所以说普通的map操作通常不会导致内存的OOM异常。
但是MapPartitions操作,对于大量数据来说,比如甚至一个partition,100万数据,
一次传入一个function以后,那么可能一下子内存不够,但是又没有办法去腾出内存空间来,可能就OOM,内存溢出。

宽依赖、窄依赖

窄依赖:父RDD的每个分区只能被一个子RDD分区使用(1对1或者 多对1)
宽依赖:父RDD的每个分区都可能被多个子RDD分区使用(1对多)。
一些常见的宽窄依赖
窄依赖:map、filter、union、mapPartitions、join(当分区器是HashPartitioner)
宽依赖:sortByKey、join(分区器不是HashPartitioner时)
reduceByKey 是宽依赖还是窄依赖 ?/todo
https://www.cnblogs.com/upupfeng/p/12344963.html
https://github.com/rohgar/scala- ... Narrow-Dependencies
https://blog.csdn.net/qq_34993631/article/details/88890669

partition数量由什么决定

https://blog.csdn.net/thriving_fcl/article/details/78072479

spark并行度

spark.sql.shuffle.partitions 默认值是200, 是返回的 RDD s中的默认分区数通过 join , reduceByKey 和 parallelize 等转换由用户明确设置。请注意, spark.default.parallelism 似乎只适用于原始 RDD ,并在处理数据帧时被忽略。
spark.default.parallelism 非sparksql中使用, 配置混洗连接或聚合数据时使用的分区数。
https://www.jianshu.com/p/e721f002136c

spark共享变量

在应用开发中,一个函数被传递给Spark操作(例如map和reduce),在一个远程集群上运行,它实际上操作的是这个函数用到的所有变量的独立拷贝。这些变量会被拷贝到每一台机器。通常看来,在任务之间中,读写共享变量显然不够高效。然而,Spark还是为两种常见的使用模式,提供了两种有限的共享变量:广播变量和累加器。

(1). 广播变量(Broadcast Variables)
– 广播变量缓存到各个节点的内存中,而不是每个 Task
– 广播变量被创建后,能在集群中运行的任何函数调用
– 广播变量是只读的,不能在被广播后修改
– 对于大数据集的广播, Spark 尝试使用高效的广播算法来降低通信成本
val broadcastVar = sc.broadcast(Array(1, 2, 3))方法参数中是要广播的变量

(2). 累加器
累加器只支持加法操作,可以高效地并行,用于实现计数器和变量求和。Spark 原生支持数值类型和标准可变集合的计数器,但用户可以添加新的类型。只有驱动程序才能获取累加器的值
https://www.jianshu.com/p/aeec7d8bc8c4

spark数据倾斜

https://www.jianshu.com/p/e721f002136c

spark的shuffle

https://www.jianshu.com/p/a3bb3001abae
https://www.jianshu.com/p/98a1d67bc226
hashshuffle(过时了)
sortshuffle(目前默认的shuffle方式,包含bypassMergeSortShuffle)
unsafe shuffle or tungsten sort

图片1.png

shuffle调优:

https://www.cnblogs.com/haozheng ... b094f36b72c7d3.html

shuffle配置详情:

https://blog.csdn.net/lds_include/article/details/89197291

spark和hadoop的shuffle区别(重点)

https://www.jianshu.com/p/58c7b7f3efbe

spark性能优化

基础篇:https://tech.meituan.com/2016/04/29/spark-tuning-basic.html
高级篇:https://tech.meituan.com/2016/05/12/spark-tuning-pro.html

为什么Spark Application在没有获得足够的资源,job就开始执行了,可能会导致什么什么问题发生?

会导致执行该job时候集群资源不足,导致执行job结束也没有分配足够的资源,分配了部分Executor,该job就开始执行task,应该是task的调度线程和Executor资源申请是异步的;如果想等待申请完所有的资源再执行job的:需要将spark.scheduler.maxRegisteredResourcesWaitingTime设置的很大;spark.scheduler.minRegisteredResourcesRatio 设置为1,但是应该结合实际考虑,否则很容易出现长时间分配不到资源,job一直不能运行的情况。
The minimum ratio of registered resources (registered resources / total expected resources) (resources are executors in yarn mode, CPU cores in standalone mode and Mesos coarsed-grained mode ['spark.cores.max' value is total expected resources for Mesos coarse-grained mode] ) to wait for before scheduling begins. Specified as a double between 0.0 and 1.0. Regardless of whether the minimum ratio of resources has been reached, the maximum amount of time it will wait before scheduling begins is controlled by config spark.scheduler.maxRegisteredResourcesWaitingTime.
default : 0.8 for YARN mode; 0.0 for standalone mode and Mesos coarse-grained mode

spark Lineage

https://blog.csdn.net/m0_37914799/article/details/85009466

spark 粗粒度、细粒度

https://www.jianshu.com/p/d6df42c10a5c

spark checkpoint

https://www.jianshu.com/p/259081b0083a

spark 组件

  • Driver Pragram:Application的driver程序,用来运行Application的main函数以及创建SparkContext进程来准备Application的运行环境;
  • SparkContext:SparkContext在Spark中用来和ClusterManager进行通信,申请资源,分配和监控任务;
  • ClusterManager:负责集群资源的管理和分配的节点,它会通过心跳的方式来监控workerNode,在Standalone模式中,它就是Master,在Yarn模式中,它就是Resource Manager;
  • WorkNode:集群中的从节点,用来负责计算和控制的节点,可以启动Exector或者Driver;
  • Executor:Application的Executor程序,ClusterManager会为Application的每个Executor分配一个进程,采用线程池分配的方式来执行TaskSet;
  • Task:Executor上执行任务的基本单位;多个Task可以构成一个Stage;
  • TaskSet(任务集): 一组关联的,但相互之间没有Shuffle依赖关系的Task集合。

spark job流程

图片2.png

图片3.png

1.Application程序启动Driver程序,创建SparkContext;
2.SparkContext向资源管理器申请运行Executor节点资源,Executor节点启动SatandaloneExectuorBackend,Exectuor会定期向资源管理器上报资源使用情况;
3.Executor节点向SparkContext申请Task,然后SparkContext将Application中的Executor程序发送给Executor;
4.SparkContext会将RDD objects构建成DAG(有向无环图),然后发送给DAG Scheduler;
5.DAG Scheduler会将DAT拆分为多个Stage,每个Stage都是由多个Task组成;然后将TaskSet发送给TaskScheduler;
6.TaskScheduler会将TaskSet中的Task提交给Exectutor运行,Executor将采用线程池的方式运行这些Tasks;Executor会在Tasks运行完成后会释放所有资源;

https://www.jianshu.com/p/3e1abd37aadd

sparkContext

https://www.cnblogs.com/xia520pi/p/8609602.html

memory system

http://arganzheng.life/spark-executor-memory-management.html

spark block

https://blog.csdn.net/imgxr/article/details/80129296

data locality

https://www.cnblogs.com/cc11001100/p/10301716.html

spark sql 三种Join

https://blog.csdn.net/wlk_328909605/article/details/82933552
https://blog.csdn.net/aa5305123/article/details/83037838

sparksql执行计划

https://www.cnblogs.com/johnny666888/p/12343338.html

RDD、Dataframe、Dataset的区别

DataFrame只是知道字段,但是不知道字段的类型,所以在执行这些操作的时候是没办法在编译的时候检查是否类型失败的,比如你可以对一个String进行减法操作,在执行的时候才报错,而DataSet不仅仅知道字段,而且知道字段类型,所以有更严格的错误检查。就跟JSON对象和类对象之间的类比。
https://www.pianshen.com/article/273498711/

spark codegen

https://zhuanlan.zhihu.com/p/92725597



加微信w3aboutyun,获取更多资源



领取100本书+1T资源
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26480

大数据5个项目视频
http://www.aboutyun.com/forum.php?mod=viewthread&tid=25235

名企资源、名企面试题、最新BAT面试题、专题面试题等资源汇总
https://www.aboutyun.com/forum.php?mod=viewthread&tid=27732




没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条