【大数据面试题】(五)Spark 相关面试题总结
文章目录
- 一、spark中的RDD是什么,有哪些特性?
- 二、概述一下spark中的常用算子区别(map,mapPartitions,foreach,foreachPatition)?
- 三、谈谈spark中的宽窄依赖?
- 四、spark中如何划分stage?
- 五、RDD缓存?
- 六、driver 的功能是什么?
- 七、Spark master 使用zookeeper 进行HA 的,有哪些元数据保存在Zookeeper?
一、spark中的RDD是什么,有哪些特性?
答:RDD(Resilient Distributed Dataset)叫做分布式数据集,是spark中最基本的数据抽象,它代表一个不可变,可分区,里面的元素可以并行计算的集合
Dataset:就是一个集合,用于存放数据的
Destributed:分布式,可以并行在集群计算
Resilient:表示弹性的,弹性表示
RDD中的数据可以存储在内存或者磁盘中;
RDD中的分区是可以改变的;
五大特性:
A list of partitions:一个分区列表,RDD中的数据都存储在一个分区列表中
A function for computing each split:作用在每一个分区中的函数
A list of dependencies on other RDDs:一个RDD依赖于其他多个RDD,这个点很重要,RDD的容错机制就是依据这个特性而来的
Optionally,a Partitioner for key-value RDDs(eg:to say that the RDD is hash-partitioned):可选的,针对于kv类型的RDD才有这个特性,作用是决定了数据的来源以及数据处理后的去向
可选项,数据本地性,数据位置最优
二、概述一下spark中的常用算子区别(map,mapPartitions,foreach,foreachPatition)?
答:map:用于遍历RDD,将函数应用于每一个元素,返回新的RDD(transformation算子)
foreach:用于遍历RDD,将函数应用于每一个元素,无返回值(action算子)
mapPatitions:用于遍历操作RDD中的每一个分区,返回生成一个新的RDD(transformation算子)
foreachPatition:用于遍历操作RDD中的每一个分区,无返回值(action算子)
总结:一般使用mapPatitions和foreachPatition算子比map和foreach更加高效,推荐使用
三、谈谈spark中的宽窄依赖?
答:RDD和它的父RDD的关系有两种类型:窄依赖和宽依赖
宽依赖:指的是多个子RDD的Partition会依赖同一个父RDD的Partition,关系是一对多,父RDD的一个分区的数据去到子RDD的不同分区里面,会有shuffle的产生
窄依赖:指的是每一个父RDD的Partition最多被子RDD的一个partition使用,是一对一的,也就是父RDD的一个分区去到了子RDD的一个分区中,这个过程没有shuffle产生
区分的标准就是看父RDD的一个分区的数据的流向,要是流向一个partition的话就是窄依赖,否则就是宽依赖,如图所示:
四、spark中如何划分stage?
Spark任务会根据RDD之间的依赖关系,形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把DAG划分相互依赖的多个stage,划分依据就是宽窄依赖,遇到宽依赖就划分stage,每个stage包含一个或多个task,然后将这些task以taskSet的形式提交给TaskScheduler运行,stage是由一组并行的task组成。
stage的task的并行度是由stage的最后一个RDD的分区数来决定的,一般来说,一个partition对应一个task,但最后reduce的时候可以手动改变reduce的个数,也就是改变最后一个RDD的分区数,也就改变了并行度。例如:reduceByKey(+,3)。
优化 :提高stage的并行度:reduceByKey(+,patition的个数) ,join(+,patition的个数)。
DAGScheduler分析:
答:是一个面向stage 的调度器
主要入参有:dagScheduler.runJob(rdd, cleanedFunc, partitions, callSite, allowLocal,resultHandler, localProperties.get)
rdd: final RDD;
cleanedFunc: 计算每个分区的函数;
resultHander: 结果侦听器;
主要功能:
接受用户提交的job;
将job根据类型划分为不同的stage,记录那些RDD,stage被物化,并在每一个stage内产生一系列的task,并封装成taskset;
决定每个task的最佳位置,任务在数据所在节点上运行,并结合当前的缓存情况,将taskSet提交给TaskScheduler;
重新提交shuffle输出丢失的stage给taskScheduler;
注:一个stage内部的错误不是由shuffle输出丢失造成的,DAGScheduler是不管的,由TaskScheduler负责尝试重新提交task执行。
- Job的生成:
答:一旦driver程序中出现action,就会生成一个job,比如count等,向DAGScheduler提交job,如果driver程序后面还有action,那么其他action也会对应生成相应的job,所以,driver端有多少action就会提交多少job,这可能就是为什么spark将driver程序称为application而不是job 的原因。每一个job可能会包含一个或者多个stage,最后一个stage生成result,在提交job 的过程中,DAGScheduler会首先从后往前划分stage,划分的标准就是宽依赖,一旦遇到宽依赖就划分,然后先提交没有父阶段的stage们,并在提交过程中,计算该stage的task数目以及类型,并提交具体的task,在这些无父阶段的stage提交完之后,依赖该stage 的stage才会提交。
- 有向无环图:
答:DAG,有向无环图,简单的来说,就是一个由顶点和有方向性的边构成的图中,从任意一个顶点出发,没有任意一条路径会将其带回到出发点的顶点位置。通俗说就是所有任务的依赖关系。为每个spark job计算具有依赖关系的多个stage任务阶段,通常根据shuffle来划分stage,如reduceByKey,groupByKey等涉及到shuffle的transformation就会产生新的stage ,然后将每个stage划分为具体的一组任务,以TaskSets的形式提交给底层的任务调度模块来执行,其中不同stage之前的RDD为宽依赖关系,TaskScheduler任务调度模块负责具体启动任务,监控和汇报任务运行情况。
五、RDD缓存?
Spark可以使用 persist 和 cache 方法将任意 RDD 缓存到内存、磁盘文件系统中。缓存是容错的,如果一个 RDD 分片丢失,可以通过构建它的 transformation自动重构。被缓存的 RDD 被使用的时,存取速度会被大大加速。一般的executor内存60%做 cache, 剩下的40%做task。
Spark中,RDD类可以使用cache() 和 persist() 方法来缓存。cache()是persist()的特例,将该RDD缓存到内存中。而persist可以指定一个StorageLevel。StorageLevel的列表可以在StorageLevel 伴生单例对象中找到。
Spark的不同StorageLevel ,目的满足内存使用和CPU效率权衡上的不同需求。我们建议通过以下的步骤来进行选择:
如果你的RDDs可以很好的与默认的存储级别(MEMORY_ONLY)契合,就不需要做任何修改了。这已经是CPU使用效率最高的选项,它使得RDDs的操作尽可能的快。
如果不行,试着使用MEMORY_ONLY_SER并且选择一个快速序列化的库使得对象在有比较高的空间使用率的情况下,依然可以较快被访问。
尽可能不要存储到硬盘上,除非计算数据集的函数,计算量特别大,或者它们过滤了大量的数据。否则,重新计算一个分区的速度,和与从硬盘中读取基本差不多快。
如果你想有快速故障恢复能力,使用复制存储级别(例如:用Spark来响应web应用的请求)。所有的存储级别都有通过重新计算丢失数据恢复错误的容错机制,但是复制存储级别可以让你在RDD上持续的运行任务,而不需要等待丢失的分区被重新计算。
如果你想要定义你自己的存储级别(比如复制因子为3而不是2),可以使用StorageLevel 单例对象的apply()方法。
在不会使用cached RDD的时候,及时使用unpersist方法来释放它。
六、driver 的功能是什么?
- 一个Spark 作业运行时包括一个Driver 进程,也是作业的主进程,具有main 函数,并且有SparkContext 的实例,是程序的入口点;
- 功能:负责向集群申请资源,向master 注册信息,负责了作业的调度,负责作业的解析、生成Stage 并调度Task 到Executor 上。包括DAGScheduler,TaskScheduler。
七、Spark master 使用zookeeper 进行HA 的,有哪些元数据保存在Zookeeper?
答:spark 通过这个参数spark.deploy.zookeeper.dir 指定master 元数据在zookeeper 中保存的位置,包括Worker,Driver 和Application 以及Executors。standby 节点要从zk 中,获得元数据信息,恢复集群运行状态,才能对外继续提供服务,作业提交资源申请等,在恢复前是不能接受请求的。另外,Master 切换需要注意2 点:
- 在Master 切换的过程中,所有的已经在运行的程序皆正常运行!因为Spark Application 在运行前就已经通过Cluster Manager 获得了计算资源,所以在运行时Job 本身的调度和处理和Master 是没有任何关系的!
- 在Master 的切换过程中唯一的影响是不能提交新的Job:一方面不能够提交新的应用程序给集群,因为只有Active Master 才能接受新的程序的提交请求;另外一方面,已经运行的程序中也不能够因为Action 操作触发新的Job 的提交请求。
【大数据面试题】(五)Spark 相关面试题总结相关推荐
- 2021年大数据HBase(五):HBase的相关操作JavaAPI方式
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的相关操作-JavaAPI方式 一.需求说明 ...
- 【计算机大数据毕设之基于spark+hadoop的大数据分析论文写作参考案例】
[计算机大数据毕设之基于spark+hadoop的大数据分析论文写作参考案例-哔哩哔哩] https://b23.tv/zKOtd3L 目 录 一 引言1 二 系统分析2 2.1 必要性和可行性 ...
- 大数据系列(五)之 Flume 数据传输
目录 一.Flume简介 二.Flume架构 2.1 Flume基本组件 2.2 Flume常见数据流模型 三.Source,Channel,Sink 详解 3.1 Source 3.2 Channe ...
- 2021年大数据ELK(五):Elasticsearch中的核心概念
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Elasticsearch中的核心概念 一.索引 index 二 ...
- 2021年大数据Kafka(五):❤️Kafka的java API编写❤️
全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Kafka的java API编写 一.生产者代码 第一步: ...
- spark启动的worker节点是localhost_Spark大数据在线培训:Spark运行原理解析
在大数据技术框架当中,Spark是继Hadoop之后的又一代表性框架,也是学习大数据当中必学的重点技术框架.在这些年的发展当中,Spark所占据的市场地位,也在不断拓展.今天的Spark大数据在线培训 ...
- 大数据学长面试之瓜子二手车面试题
大数据学长面试之瓜子二手车面试题 1)技术部分 (1)优化必问 hive/spark (2)为什么kafka可以实现高吞吐?单节点kafka的吞吐量也比其他消息队列大,为什么? (3)如果写了JVM调 ...
- 大数据项目(基于spark)--新冠疫情防控指挥作战平台项目
大数据项目(基于spark)–新冠疫情防控指挥作战平台项目 文章目录 第一章 项目介绍 1.1 项目背景 1.2 项目架构 1.3 项目截图 1.4 功能模块 第二章 数据爬取 2.1 数据清单 2. ...
- 大数据治理的五个核心要素
当今的大型企业,内部分工日趋细化,采购.服务.市场.销售.开发.支持.物流.财务.人力等各个环节,无不每时每刻产生着大量的数据.数据的格式也越来越多样化,包括IT系统里存储的结构化.非结构化数据,各样 ...
- CDH大数据平台搭建之SPARK集群搭建
CDH大数据平台搭建之SPARK集群搭建 一.安装规划 二.下载 三.安装及配置 1.解压 2.修改配置文件 四.启动 五.JPS检查节点 一.安装规划 参考CHD大数据平台搭建之集群规划 二.下载 ...
最新文章
- Java并发包常见异常_Java并发包1--线程的状态及常用方法
- ntopng mysql_网络流量监控工具与分析Ntop和Ntopng
- 小程序入门学习04--数据绑定、条件渲染、列表渲染
- Secure DevOps!探真科技2022云原生安全产品发布会圆满落幕
- 【LOJ101】最大流(Edmonds-Karp)
- sort 升序还是降序?priority_queue 大根堆还是小根堆?
- axure6.5汉化
- 仿苹果响应式官网(含代码!)
- 23Bootstrap
- 新手必看--test link使用步骤
- python读取word内容复制粘贴_如何复制word文档的内容?
- 计算机专业杭州申请公租房有,2018年第四批公租房配租方案及参加摇号名单出炉!报名状况查询方式在此!...
- 大型企业CA认证系统部署应用案例解析
- 实现财务自由 之 美股上市公司的年报(年度财报)(国内外公司年报20-F,10-k)查阅、下载、以及 翻译中文查阅、下载的方法
- Android Studio 调试技巧大全
- matlab 解目标函数,对分法求解目标函数最优解函数MATLAB实现
- Flatten()详解
- 12对胸椎对应体表标志_人体体表标志【图文】
- linux python spyder,Ubuntu 18.04中安装Spyder,Python可视化IDE
- 禅道的部署测试如何使用禅道