Spark面试题

news2024/11/15 15:37:23

在这里插入图片描述

1. spark core

1.简述hadoop 和 spark的不同点(为什么spark更快)♥♥♥

  shuffle都是需要落盘的,因为在宽依赖中需要将上一个阶段的所有分区数据都准备好,才能进入下一个阶段,那么如果一直将数据放在内存中,是非常耗费资源的

  • MapReduce需要将计算的中间结果写入磁盘,然后还要读取磁盘,从而导致了频繁的磁盘IO;而spark不需要将计算中间结果写入磁盘,这得益于spark的RDD弹性分布式数据集和DAG有向无环图,中间结果能够以RDD的形式放在内存中,这样大大减少了磁盘IO。
  • MapReduce在shuffle时需要花费大量时间排序,而spark在shuffle时如果选择基于hash的计算引擎,是不需要排序的,这样就会节省大量时间。
  • MapReduce是多进程模型,每个task会运行在一个独立的JVM进程中,每次启动都需要重新申请资源,消耗大量的时间;而spark是多线程模型,每个executor会单独运行在一个JVM进程中,每个task则是运行在executor中的一个线程。

2. 谈谈你对RDD的理解

  RDD称为弹性分布式数据集,是spark中最基本的数据处理模型。代码中代表是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。

  • 弹性
    • 存储的弹性:内存与磁盘的自动切换
    • 容错的弹性:数据丢失可以自动恢复
    • 计算的弹性:计算出错重试机制
    • 分片的弹性:可根据需要重新分片
  • 分布式:数据存储在大数据集群不同节点上
  • 数据集:RDD封装了计算逻辑,并不保存数据
  • 不可变:RDD封装了计算逻辑,是不可以改变的,想要改变,只能产生新的RDD,在新的RDD里面封装计算逻辑
  • 可分区、并行计算

3. 简述spark的shuffle过程♥♥♥

  如果问spark与Mapreduce的shuffle的区别,先说Mapreduce的shuffle,再说spark的shuffle。
  spark的shuffle分为两种实现,分别为HashShuffle和Sortshuffle

  • HashShuffle分为普通机制和合并机制,分为write阶段和read阶段,write阶段就是根据key进行分区,开始先将数据写入对应的buffer中,当buffer满了之后就会溢写到磁盘上,这个时候会产生mapper的数量 x reducer的数量的小文件,这样就会产生大量的磁盘IO。read阶段就是reduce去拉取各个maptask产生的同一个分区的数据;HashShuffle的合并机制就是让多个mapper共享buffer,这时候落盘的数量等于reducer的数量 x core的个数,从而可以减少落盘的小文件数量,但是当Reducer有很多的时候,依然会产生大量的磁盘小文件。
  • SortShuffle分为普通机制和bypass机制
    • 普通机制:map task计算的结果数据会先写入一个内存数据结构(默认5M)中,每写一条数据之后,就会判断一下,是否达到阈值,如果达到阈值的话,会先尝试增加内存到当前内存的2倍,如果申请不到会溢写,溢写的时候先按照key进行分区和排序,然后将数据溢写到磁盘,最后会将所有的临时磁盘文件合并一个大的磁盘文件,同时生成一个索引文件,然后reduce task去map端拉取数据的时候,首先解析索引文件,根据索引文件再去拉取对应的数据。
    • bypass机制:将普通机制的排序过程去掉了,它的触发条件是当shuffle map task 数量下于200(配置参数)并且算子不是聚合类的shuffle算子(比如reduceByKey)的时候,该机制不会排序,极大提高了性能。

4. spark的作业运行流程是怎么样的♥♥

重要参数如下:

  • num-executoes:配置Executor的数量
  • executor-memory:配置每个Executor的内存大小(堆内内存)
  • executor-cores:配置每个Executor的虚拟CPU core数量

运行流程如下:

  1. 首先spark的客户端将作业提交给yarn的RM,然后RM会分配container,并且选择合适的NM启动ApplicationMaster,然后AM启动Driver,紧接着向RM申请资源启动executor,Executor进程启动后会反向向Driver进行注册,全部注册完成后Driver开始执行main函数,当执行到行动算子,触发一个Job,并根据宽依赖开始划分stage(阶段的划分),之后将task分发到各个Executor上执行。
  2. 扩展一:spark怎么提高并行度
    • spark作业中,各个stage的task的数量,也就代表了spark作业在各个stage的并行度。
    • 官方推荐,并行度设置为总的cpu核心数的2到3倍
    • 设置参数:spark.default.parallelism
  3. 扩展2:spark内存管理
    • spark分为堆内内存和堆外内存,堆内内存有jvm统一管理,而堆外内存直接向操作系统进行内存的申请,不受JVM控制。spark.executor.memory和spark.memory.offHeap.size
    • 堆内内存又分为存储内存和执行内存和其他内存和预留内存,存储内存主要存放缓存数据和广播变量,执行内存只要存放shuffle过程的数据,其他内存主要存放rdd的元数据集信息,预留内存和和其他内存作业相同。
    • 堆外内存:
      • 优点:减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作;
      • 缺点:堆外内存难以控制,如果内存泄漏,不容易排查。

5. spark driver的作用,以及client模式和cluster模式的区别♥

  • drive 主要负责管理整个集群的作业任务调度;executor是一个jvm进程,专门用于计算的节点
  • client模式下,driver运行在客户端;cluster模式下,driver运行在yarn集群。

6. 你知道Application、Job、Stage、Task他们之间的关系吗?♥

  • 初始化一个SparkContext就会生成一个Application
  • 一个行动算子就会生成一个job
  • stage(阶段)等于宽依赖的个数+1
  • 一个阶段中,最后一个RDD的分区个数就是Task的个数
  • 总结:Application>Job>Stage>Task

7. spark常见的算子介绍一下(10个以上)♥♥♥

  • 算子分为转换算子和行动算子,转换算子主要是讲旧的RDD包装成新的RDD,行动算子就是触发任务的调度和作业的执行
  • 转换算子:
    • map:将数据逐条进行转换,可以是数据类型的装换,也可以是值的转换
    • flatMap:先进行map操作,再进行扁平化操作
    • filter:根据指定的规则进行筛选
    • coalesce:减少分区的个数,默认不进行shuffle
    • repartition:可以增加分区或者减少分区的个数,一定发生shuffle
    • union:两个RDD求并集
    • zip:将两个RDD中的元素,以键值对的形式进行合并。
    • reduceByKey:按照key对value进行分组
    • groupByKey:按照key对value进行分组
    • cogroup:按照key对value进行合并
  • 行动算子用的比较多的有:
    • collect:将数据采集到Driver端,形成数组
    • take:返回RDD的前n个元素组成的数组
    • foreach:遍历RDD中的每一个元素(executor端)

8. 简述map和mapPartitions的区别♥

  他们之间有三个区别:

  1. map算子是串行操作,mapPartitions算子是以分区为单位的批处理操作
  2. map算子主要是对数据进行转换和改变,但是数量不能增加或者减少,而mapPartitions算子可以增加或者减少数据。
  3. map算子性能比mapPartitions算子要低,但是mapPartitions算子会长时间占用内存,可能会导致内存溢出的情况,所以如果内存不是太多,不推荐使用,一般还是使用map算子

9. 你知道重分区的相关算子吗♥

  coalesce算子和repartition算子,他们都是用来改变RDD的分区数量的,而且repartition算子底层调用的就是coalesce方法。他们的区别如下:

  1. coalesce一般用来减少分区,如果要增加分区必须设置shuffle参数=true,repartition既可以增加分区也可以减少分区
  2. coalesce根据传入的参数来决定是否shuffle,设置为false容易发生数据倾斜,但是repartition一定发生shuffle,也就是shuffle参数不可修改一定为true。
  • 还有一个partitionBy算子也是进行重分区的,参数传入一个分区器,默认是HashPartitioner

10. spark目前支持哪几种分区策略

  spark支持Hash分区,Range分区和自定义分区

  • hash分区就是计算key的hashCode,然后和分区个数取余就可以得到对应的分区号。
  • range分区就是将一定范围内的数据映射到一个分区中,尽量保证每个分区数据均匀,而且分区间有序
  • 自定义分区就是继承Partitioner类,重写numPartitions方法和getPartition方法。

11. 简述groupByKey和reduceByKey的区别♥♥♥

  他们之间主要有两个区别:

  1. groupByKey只能分组,不能聚合,而reduceByKey包含分组和聚合两个功能
  2. reduceByKey会在shuffle前对分区内相同key的数据进行预聚合(类似于MapReduce的combiner),减少落盘的数据量,而groupByKey只会shuffle,不会进行预聚合的操作,因此reduceByKey的性能会高一些。

12. 简述reduceByKey、foldByKey、aggregateByKey、combineByKey的区别♥

  • reduceByKey:没有初始值,分区内和分区间计算规则一样
  • foldByKey:有初始值,分区内和分区间计算规则一样
  • aggregateByKey:有初始值,分区内和分区间计算规则可以不一样。
  • combineByKey:没有初始值,分区内和分区间计算规则可以不一样,同时返回类型可以与输入类型不一致,因此通常在数据结构不满足要求的时候,才会使用该聚合函数。

13. 宽依赖和窄依赖之间的区别♥♥

  多个连续RDD的依赖关系,称之为血缘关系;每个RDD会保存血缘关系

  • 宽依赖:父的RDD一个分区的数据会被子RDD的多个分区依赖,涉及到shuffle。
  • 窄依赖:父的RDD的一个分区的数据只会被子RDD的一个分区依赖
    为什么要设计宽窄依赖
  • 窄依赖的多个分区可以并行计算;而宽依赖必须等到上一阶段计算完成才能计算下一个阶段。
    如何进行stage划分:
  • 对于窄依赖,不会进行划分,也就是将这个转换操作尽量放在同一个stage中,可以实现流水线并行计算。对于宽依赖,由于有shuffle的存在,只能在父RDD处理完成后,才能开始接下来的计算,也就是说需要划分stage。

14. spark为什么需要RDD持久化,持久化的方式有哪几种,他们之间的区别是什么♥♥♥

  RDD实际上是不存储数据的,那么如果RDD要想重用,那么就需要重头开始再执行一遍,所以为了提高RDD的重用性,就有了RDD持久化。

  • 分类:缓存和检查点
  • 区别:
    1. 缓存有两种方法,一种是cache,将数据临时存储在内存中(默认就会调用persist(memory_only)),还有一种是persist,将数据临时存储在磁盘中,程序结束就会自动删除临时文件;而检查点,就是checkpoint,将数据长久保存在磁盘中。
    2. 缓存不会切断RDD之间的血缘关系,检查点会切断RDD之间的血缘关系。

15. 简述spark的容错机制

  容错机制主要包括四个方面:

  1. stage输出失败的时候,上层调度器DAGScheduler会进行重试
  2. 计算过程中,某个task失败,底层调度器会进行重试。
  3. 计算过程中,如果部分计算结果丢失,可以根据窄依赖和宽依赖的血统重新恢复计算。
  4. 如果血统非常长,可以对中间结果做检查点,写入磁盘中,如果后续计算结果丢失,那么就从检查点的RDD开始重新计算。

16.除了RDD,你还了解spark的其他数据结构吗♥♥

  算子以外的代码都是在Driver端执行,算子里面的代码都是在Executor端执行。
了解累加器和广播变量两种数据结构。

  • 累加器就是分布式共享只写变量,简单说一下它的原理:累加器用来把Executor端变量信息聚合到Driver端。在Driver程序中定义的变量,在Executor端的每个Task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回Driver端进行合并。
  • 广播变量就是分布式共享只读变量,简单说一下它的原理:用来高效分发较大的对象。向所有工作节点发送一个较大的只读值,以供一个或多个spark操作使用。
    补充:由BlockManager管理,广播变量会带来Driver的内存膨胀,因为广播变量会在内存中分割,分割完成之前,内存中由俩份大小相同的广播变量。

17. spark调优♥♥♥

2. spark sql

  用于结构化数据(structured data)处理的spark模块。

18. 谈一谈RDD,DataFrame,DataSet的区别♥

  1. spark1.0产生了RDD,spark1.3产生了DataFrame,spark1.6产生了DataSet。
  2. RDD不支持sparksql操作,但是DataFrame和DataSet支持sparksql操作。
  3. RDD一般会和spark mllib同时使用,但是DataFrame和DataSet一般不和spark mllib同时使用
  4. DataFrame是DataSet的一个特例;DataFrame的每一行的类型都是Row,DataSet的每一行的数据类型不相同。

19. Hive on spark 与 sparkSql的区别♥

  只是SQL引擎不同,但是计算引擎都是spark。

20. sparkSql的三种join实现♥♥♥

  包括broadcast hash join、shuffle hash join、sort merge join,前两种都是基于hash join;broadcast适合一张很小和一张很大的表进行join,shuffle适合一张较大的小表和一张大表进行join,sort适合两张较大的表进行join。

  • hash join这个算法主要分为三步,首先确定哪张是build table和哪张表是probe table,这个是由spark决定的,通常情况下,小表会作为build table,大表会作为probe table;然后构建hash table,遍历build table中的数据,对于每一条数据,根据join的字段进行hash,存放到hashtable中;最后遍历probe table中的数据,使用同样的hash函数,在hashtable中寻找join字段相同的数据,如果匹配成功就join到一起。这就是hash join的过程。
  • broadcast hash join 分为broadcast阶段和hash join阶段,broadcast阶段就是将小表广播到所有的executor上,hash join阶段就是在每个executor上执行hash join,小表构建为hash table,大表作为probe table。
  • shuffle hash join 分为shuffle阶段和hash join阶段,shuffle阶段就是对两张表分别按照join字段进行重分区,让相同key的数据进入到一个分区中;hash join 阶段就是 对每个分区中的数据执行hash join。
  • sort merge join 分为shuffle阶段,sort阶段和merge阶段,shuffle阶段就是将两张表按照join字段进行重分区,让相同key的数据进入同一个分区中;sort阶段就是对每个分区内的数据进行排序;merge阶段就是对排好序的分区表进行join,分别遍历两张表,key相同就join输出,如果不同,左边小,就继续遍历左边的表,反之,遍历右边的表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1398352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM多核调度器DSU

1. 背景 从A75开始,ARM提出了一个新的多核心管理系统单元,叫做DSU(DynamIQ Shared Unit)。DSU的核心功能是控制CPU内核,使其成簇Cluster使用,簇内每一个核心可以单独开关、调整频率/电压,能效表现更佳,甚至…

手动正则删除console.log

依赖删除的可以先出去了 先得删除箭头函数里的 正则匹配不能直接删,如这种箭头函数,得先全局改了 然后正则 console.log(.*?) 选中》空着〉全局替换 最后删除 // 因为有的 console.log在代码块原来就是被空着状态, 所以也得全局为空替…

正则表达式..

1.字符串的合法检验 现在有一个字符串验证码 我们需要检验其的合法性 什么条件才能够使得字符串合法呢?就是6-10个字符串长度 并且以字母开头 并且其中由字母、数字、下划线构成 那么我们可以先通过自定义的方式进行检验 public class Main {public static void m…

通过Konva.js实现canvas列表滚动

列表可以通过Konva.js中的Rect来实现,通过group可以丰富列表的内容 在滚动方面,可以通过vue的scroll方法,通过rect中的move方法来修改y值即可 我这里设置的是一个透明的盒子在想要滚动的canvas上,这样就可以实现直接滚动canvas列…

K8s(七)四层代理Service

Service概述 Service在Kubernetes中提供了一种抽象的方式来公开应用程序的网络访问,并提供了负载均衡和服务发现等功能,使得应用程序在集群内外都能够可靠地进行访问。 每个Service都会自动关联一个对应的Endpoint。当创建一个Service时,Ku…

springboot109新闻稿件管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的新闻稿件管理系统 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获…

SpringMVC下半篇之整合ssm

4.ssm整合 4.1.创建表 CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,money double DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;4.2.创建工程 4.3.pom.xml <?xml version"1.0" encoding&…

【图形学】颜色线性插值和Wu反走样算法

颜色线性插值 绘制一条颜色渐变的直线&#xff0c;直线上每一个点的颜色都来自端点颜色的线性插值。线性插值公式为 P ( 1 − t ) P s t a r t t P e n d P 是直线上任意一个点&#xff0c; P s t a r t 是直线的起点&#xff0c; P e n d 是直线的终点 对应直线上任意一点…

[flutter]GIF速度极快问题的两种解决方法

原因&#xff1a; 当GIF图没有设置播放间隔时间时&#xff0c;电脑上会默认间隔0.1s&#xff0c;而flutter默认0s。 解决方法一&#xff1a; 将图片改为webp格式。 解决方法二&#xff1a; 为图片设置帧频率&#xff0c;添加播放间隔。例如可以使用GIF依赖组件设置每秒运行…

低代码技术杂谈

一、探讨低代码的定义 “Low-Code”是什么&#xff1f;身为技术人员听到这种技术名词&#xff0c;咱们第一反应就是翻看维基百科 或者其他相关技术论文&#xff0c;咱们想看维基百科的英文介绍&#xff1a; A low-code development platform (LCDP) provides a development env…

Docker(七)使用网络

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Docker 中的网络功能介绍 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。 一、外部访问容器 容器中可以运行一些网络应用&…

数学建模常见算法的通俗理解(1)

目录 1.层次分析法&#xff08;结合某些属性及个人倾向&#xff0c;做出某种决定&#xff09; 1.1 粗浅理解 1.2 算法过程 1.2.1 构造判断矩阵 1.2.2 计算权重向量 1.2.3 计算最大特征根 1.2.4 计算C.I.值 1.2.5 求解C.R.值 1.2.6 判断一致性 1.2.7 计算总得分 2 神经…

go语言(八)---- map

map的声明方式有以下三种。 package mainimport "fmt"func main() {//第一种声明方式//声明map1是一个map类型&#xff0c;key是String&#xff0c;value是Stringvar myMap1 map[string] stringif myMap1 nil {fmt.Println("myMap1 是一个空map")}//在使…

多测师肖sir___ui自动化测试po框架(升级)

ui自动化测试po框架&#xff08;升级&#xff09; po框架 一、ui自动化po框架介绍 &#xff08;1&#xff09;PO是Page Object的缩写&#xff08;pom模型&#xff09; &#xff08;2&#xff09;业务流程与页面元素操作分离的模式&#xff0c;可以简单理解为每个页面下面都有一…

java数据结构与算法刷题-----LeetCode59. 螺旋矩阵 II

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 初始&#xff0c;top行执向第一行&#xff0c;bottom行指向最后一…

积分梳状滤波器CIC原理与实现

CIC&#xff08;Cascade Intergrator Comb&#xff09;&#xff1a;级联积分梳状滤波器&#xff0c;是由积分器和梳状滤波器级联而得。滤波器系数为1&#xff0c;无需对系数进行存储&#xff0c;只有加法器、积分器和寄存器&#xff0c;资源消耗少&#xff0c;运算速率高&#…

TypeScript语法总结

JavaScript 与 TypeScript 的区别 TypeScript 是 JavaScript 的超集&#xff0c;扩展了 JavaScript 的语法&#xff0c;因此现有的 JavaScript 代码可与 TypeScript 一起工作无需任何修改&#xff0c;TypeScript 通过类型注解提供编译时的静态类型检查。 TypeScript 可处理已…

GitHub 13.7k star,一款让Windows和macOS瘦身减肥实用工具,免安装+开源+性能高

GitHub 13.7k star&#xff0c;一款让Windows和macOS瘦身减肥实用工具&#xff0c;免安装开源性能高 大家好&#xff01;我是老码农。 今天给大家推荐一款&#xff1a;让Windows和macOS操作系统瘦身减肥的实用工具&#xff0c;czkawka。 这款工具主要干啥事呢&#xff1f;说…

Latex绘图

排查Latex报错 “Command \csubfigure already defined” 这个可以通过添加如下命令&#xff1a; \usepackage{subfig} \usepackage{subfloat} ..... \begin{figure*}[h] \centering \subfloat[subfloat title]{ \label{fig:subfig:a} \includegraphics[scale0.7]{Figs/.....…

MeterSphere本地化部署实践

项目结构 搭建本地环境 安装JDK11&#xff0c;配置好JDK环境&#xff0c;系统同时支持JDK8和JDK11安装IEAD&#xff0c;配置JDK环境配置maven环境,IDEA配置(解压可以直接使用)无限重置IDEA试用期配置redis环境(解压可以直接使用) 配置kafka环境 安装mysql-5.7环境&#xff…