Spark面试题总结

一、RDD的五大特性是什么

1、RDD是由一些分区构成的,读取文件时有多少个block块,RDD中就会有多少个分区
2、算子实际上是作用在RDD中的分区上的,一个分区是由一个task处理,有多少个分区,总共就有多少个task
3、RDD之间存在依赖关系,后一个RDD中的数据是依赖与前一个RDD的计算结果,数据会像水流一样在RDD之间流动
4、分区类的算子只能作用在键值对格式的RDD上,groupByKey、reduceByKey
5、spark为task计算提供了精确的计算位置,移动计算而不移动数据

二、Spark常用算子

转换算子:
map(func):对RDD中的每个元素应用一个函数,返回一个新的RDD。
filter(func):根据给定的条件筛选RDD中的元素,返回一个新的RDD。
flatMap(func):类似于Map,但每个输入元素可以映射到多个输出元素,返回一个扁平化的新RDD。
distinct():去除RDD中的重复元素,返回一个新的RDD。
union(otherRDD):将两个RDD合并成一个新的RDD。
intersection(otherRDD):返回两个RDD的交集。
subtract(otherRDD):返回两个RDD的差集。
groupByKey():将RDD中的元素按键分组,生成(键,值列表)对的RDD。
reduceByKey(func):对具有相同键的元素执行reduce操作。
sortByKey():根据键对RDD进行排序。

行动算子:
collect():将RDD中的所有元素收集到驱动程序节点,以数组的形式返回。
count():返回RDD中元素的数量。
first():返回RDD中的第一个元素。
take(n):返回RDD中的前n个元素。
saveAsTextFile:将结果输出到外部存储系统

三、reduceByKey和groupByKey的区别

groupByKey:根据键对RDD中的元素进行分组,但不执行聚合操作
reduceByKey:会根据键将元素进行分组并聚合,并且会在map端做预聚合

四、Spark部署方式

--loacl(本地模式)
主要用于本地开发程序与测试。

--Standalone(独立集群模式)
在此种方式下,Spark自带完整的资源调度管理服务,无需依赖任何其他的资源管理系统。
部署模式:分为client模式和cluster模式

--YARN模式(Spark on YARN)
把Spark作为一个客户端,将作业提交给YARN调度执行
有yarn-client和yarn-cluster两种模式
主要区别在于:
yarn-client模式:Driver在本地启动,在本地可以看到详细日志
yarn-cluster模式:YARN会在集群中选择一台机器来启动Driver进程,在本地看不到详细日志

五、介绍一下Spark中的RDD持久化

--RDD持久化的适用场景
Spark基于内存进行计算,如果某个中间计算结果会被重复使用,我们可以使用RDD持久化将中间结果存储在内存中或磁盘上,避免重复计算,从而提高程序的运行效率。

--RDD持久化的实现方式
1、cache()方法:将数据持久化到内存中。
2、persist()方法:允许用户指定存储级别,包括内存、磁盘、序列化等不同的选项。

--存储级别
MEMORY_ONLY:只将数据存储在内存中,适用于数据量较小且内存资源充足的情况。  --通常使用
MEMORY_ONLY_SER:将数据以序列化的形式存储在内存中,适用于数据量较大但内存资源有限的情况。
MEMORY_AND_DISK:优先将数据存储在内存中,如果内存不足则存储在磁盘上。  ----通常使用
MEMORY_AND_DISK_SER:与MEMORY_AND_DISK类似,但数据以序列化的形式存储。
DISK_ONLY:只将数据存储在磁盘上,适用于数据量非常大且无法完全放入内存的情况。
OFF_HEAP:将数据存储在堆外内存中,适用于对内存管理有特殊要求的场景。

六、Spark中的shuffle是什么?

1、spark的运行过程中如果出现了相同的键被拉取到对应的分区,这个过程称之为shuffle。
2、只有Key-Value型的RDD才会有Shuffle操作,例如reduceByKey、groupByKey。
3、具体来说宽依赖的划分会产生shuffle

七、RDD是什么?

RDD:弹性分布式数据集,是Spark提供的一个面向数据集的分布式内存计算模型,RDD支持内存计算,并可以在多个节点上并行操作数据

八、Spark RDD宽窄依赖是什么?

--窄依赖
父RDD的每个分区仅被一个子RDD的对应分区所使用的情况。

--宽依赖
父RDD的一个或多个分区被多个子RDD的分区所使用的情况。宽依赖的划分会产生shuffle,如groupByKey、reduceByKey等需要数据重新分区的操作。

九、spark资源调度+任务调度

--资源调度
1、Driver向集群申请资源启动Executor
2、Executor启动后,会向Driver反向注册,报告自己的资源信息(如内存和CPU使用情况)
3、Driver根据Executor的资源信息和任务需求,将任务分发给相应的Executor执行。
4、当所有任务执行完毕后,Executor进程停止,释放所占用的内存和CPU资源。


--任务调度(spark作业提交流程)
1、在提交节点上会启动Driver进程,Driver会启动SparkContext。
2、SparkContext在接收到用户程序后,会解析程序中的RDD操作构建DAG有向无环图
3、DAGScheduler根据宽窄依赖将DAG有向无环图划分一个一个Stage,每个Stage中包含了一个或多个Task,Task的数量取决于RDD的Partition个数。
4、TaskScheduler将Task以TaskSet的形式分发给Executor执行。
5、当所有Task执行完毕后,Task的执行结果会返回给Driver进程,Spark会释放所有占用的资源,并通知资源管理器作业已完成。


--重试机制:
TaskScheduler监控每个Task的执行情况,如果Task执行失败,会尝试重新提交(默认重试3次)。
如果某个Stage的所有Task都失败,DAGScheduler会重新提交该Stage(默认重试4次)。

十、spark唯一一次(ECO)怎么保证

1、开启checkpoint支持
2、数据源可以采用kafka(Kafka支持幂等性和事务,为Spark Streaming提供了实现Exactly Once语义的基础)

十二、Spark的内存模型?

Spark的内存模型是基于分布式内存计算的,主要包括两个组件:Driver和Executor。

--Driver
Driver节点负责将应用程序转化为任务并将其分配给Executor执行。Driver节点包含了应用程序的整个代码以及数据集的元数据,也会保存一部分数据在内存中。

--Executor
Executor是Spark执行任务计算的节点。每个Executor运行在一个独立的JVM进程中,它们通过网络与Driver进行通信。Executor会将数据存在在内存中RDD或DataFrame中。

十三、Spark分哪几个部分(模块)

--Spark Core
Spark的核心组件,提供了弹性分布式数据集rdd以及程序入口SparkContext,主要用于处理非结构化数据和半结构化数据

--Spark SQL
Spark用于处理结构化数据的模块,引入DataFrame的概念和程序入口SparkSession

--Spark Streaming
spark对数据进行实时处理的模块(实际上是微批处理,做不到真正的实时,准确来说是近实时)

--Spark MLlib(提供常见机器学习功能的库)
--Spark GraphX(用于图计算的模块)

十四、Spark的哪些算子会有shuffle过程?

1、groupByKey:将具有相同键的键值对分组到一起,必须进行shuffle以重新分配数据到不同的分区。
2、reduceByKey:对具有相同键的键值对进行聚合操作,需要将具有相同键的数据重新分配到不同的分区。
3、sortByKey:按照键对数据进行排序,需要将数据重新分区以进行排序。
4、join:将两个具有相同键的数据集进行连接操作,需要将具有相同键的数据重新分配到不同的分区。
5、distinct:去除数据集中的重复元素,需要对元素进行重新分区以进行重复元素的合并。

十五、Spark Executor内存分配?

Spark Executor内存分配主要涉及到两个参数:driver-memory和executor-memory。
--driver-memory
驱动程序运行时可用的内存量,它决定了Spark应用程序驱动程序在集群中的可用内存大小

--executor-memory
每个Executor可用的内存量,它决定了每个Executor可以用来执行任务的内存大小

十六、广播变量和累加器

--广播变量
广播变量通过Spark的SparkContext.broadcast()方法创建,如果数据集比较大或需要频繁访问某个数据集时,可以将该数据集广播到executor中,提高Spark作业的性能。

--累加器
通过累加器,executor可以将中间结果或统计信息直接发送到driver端,可以提高Spark作业的性能。

十七、介绍一下Spark DAGScheduler、TaskScheduler、SchedulerBackend?

--DAGScheduler(有向无环图调度器)
它通过分析Spark作业的RDD依赖关系生成一个有向无环图,并将作业划分为多个Stage。然后,DAGScheduler根据Stage的依赖关系和数据本地性进行任务调度。它佳能任务添加到任务队列中,并在有空闲Executor时将任务发送给它们。

--TaskScheduler(任务调度器)
它根据调度策略(如FIFO、FAIR等)从任务队列中选择任务,并将其分发给可用的Executor。TaskScheduler会监控任务的执行状态,如果任务失败,它会尝试重新执行或标记任务为失败。它还会定期检查Executor的健康状态,并根据需要添加或删除Executor。

--SchedulerBackend(调度器后端)
它负责与特定的集群管理器交互,并负责资源的管理和任务的分配。SchedulerBackend会向集群管理器申请资源,并在资源可用时将其分配给Spark应用程序。它还会监控和管理Executor的状态,并在需要时重新申请资源。

十八、spark中如果发生数据倾斜该怎么处理?

1、当Spark作业的数据来源是Hive表,在Hive表中对数据进行预处理,例如按照key进行分组,将同一key对应的所有value用一种特殊的格式拼接到一个字符串里,这样在Spark中处理时就可以避免shuffle操作,从根源上减少了数据倾斜的可能性。
2、当倾斜的key很少且不重要时,可以过滤导致倾斜的key
3、增加shuffle分区的数量(调整spark.sql.shuffle.partitions参数),使数据更加均匀地分布到各个节点
4、对于聚合操作产生的数据倾斜,可以使用局部聚合+全局聚合的方式(首先给每个key打上随机数前缀并进行局部聚合,然后去除前缀进行全局聚合)
5、给每个key添加随机前缀,使数据分布更加均匀

十九、你知道哪些spark的优化方案?

--优化RDD操作
1、对多次使用的RDD进行缓存或持久化,减少重复计算
2、数据倾斜处理:使用随机前缀或哈希分区等方法来均衡数据分布,避免某些节点负载过重
3、将reduce join转为map join:当join操作的一个RDD或表比较小时,可以将其广播到所有节点,在map阶段进行join操作,避免shuffle过程。

--参数调优
1、设置合理的并行度:根据集群资源情况,调整RDD的分区数,以充分利用集群的计算能力
2、优化资源量设置:通过spark-submit提交参数或配置文件,合理设置Driver和Executor的内存、核心数等资源。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python + 在线 + 中文文本转为英文语音,语音转为中文文本

模型 平台:https://huggingface.co/ars-语言转文本: pipeline("automatic-speech-recognition", model"openai/whisper-large-v3", device0 )tts-文本转语音:pipeline("text-to-speech", "microsoft/speecht5_tts&q…

Java8新特性之Optional、Lambda表达式、Stream、新日期Api使用总结

标题 Optional类常用Api使用说明Optional API 使用建议 Lambda表达式Lambda 表达式的局限性与解决方案 Stream案例实操优化 Stream 操作 新的日期和时间APILocalDateTime在SpringBoot中的应用 函数式接口(Functional) Optional博客参考地址1 Stream博客参…

【Linux从入门到放弃】探究进程如何退出以进程等待的前因后果

🧑‍💻作者: 情话0.0 📝专栏:《Linux从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! 进…

【C++】STL-priority_queue

目录 1、priority_queue的使用 2、实现没有仿函数的优先级队列 3、实现有仿函数的优先级队列 3.1 仿函数 3.2 真正的优先级队列 3.3 优先级队列放自定义类型 1、priority_queue的使用 priority_queue是优先级队列,是一个容器适配器,不满足先进先出…

pdf拆分,pdf拆分在线使用,pdf拆分多个pdf

在数字化的时代,pdf文件已经成为我们日常办公、学习不可或缺的文档格式。然而,有时候我们可能需要对一个大的pdf文件进行拆分,以方便管理和分享。那么,如何将一个pdf文件拆分成多个pdf呢?本文将为你推荐一种好用的拆分…

监控平台zabbix介绍与部署

目录 1.为什么要做监控 2.zabbix是什么? 3.zabbix 监控原理 4.Zabbix 6.0 新特性 5.Zabbix 6.0 功能组件 6.部署zabbix 6.1 部署 Nginx PHP 环境并测试 6.2 部署数据库 6.3 向数据库导入 zabbix 数据 6.4 编译安装 zabbix Server 服务端 6.5 修改 zabbix…

中小企业如何防止被查盗

在当前的商业环境中,小企业面临诸多挑战,其中之一便是如何在有限的预算内满足日常运营的技术需求。由于正版软件的高昂成本,一些小企业可能会选择使用盗版软件来降低成本。 我们联网之后存在很多风险,你可以打开自己的可以联网的电…

【面试系列】机器学习工程师高频面试题及详细解答

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…

Java--创建对象内存分析

1.如图所示,左边为一个主程序,拥有main方法,右边定义了一个Pet类,通过debug不难看出,当启动该方法时,有以下该步骤 1.运行左边的实例化Pet类对象 2.跳转至右边定义Pet类的语句 3.跳回至左边获取Pet类基本属…

代码生成器使用指南,JeecgBoot低代码平台

JeecgBoot 提供强大的代码生成器,让前后端代码一键生成,实现低代码开发。支持单表、树列表、一对多、一对一等数据模型,增删改查功能一键生成,菜单配置直接使用。 同时提供强大模板机制,支持自定义模板,目…

【bug报错已解决】ERROR: Could not find a version that satisfies the requirement

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析 二、解决方法2.1 方法一2.2 方法二 三、总结 引言 有没有遇到过那种让人…

JSON JOLT常用示例整理

JSON JOLT常用示例整理 1、什么是jolt Jolt是用Java编写的JSON到JSON转换库,其中指示如何转换的"specification"本身就是一个JSON文档。以下文档中,我统一以 Spec 代替如何转换的"specification"json文档。以LHS(left hand side)代…

kaggle量化赛金牌方案(第七名解决方案)

获奖文章(第七名解决方案) 致谢 我要感谢 Optiver 和 Kaggle 组织了这次比赛。这个挑战提出了一个在金融市场时间序列预测领域中具有重大和复杂性的问题。 方法论 我的方法结合了 LightGBM 和神经网络模型,对神经网络进行了最少的特征工程。目标是结合这些模型以降低最终…

arco disign vue 日期组件的样式穿透

问题描述: 对日期组件进行样式穿透. 原因分析: 如图,日期组件被展开时它默认将dom元素挂载到body下, 我们的页面在idroot的div 里层, 里层想要穿透外层是万万行不通的. 解决问题: 其实官网提供了参数,但是并没有提供例子, 只能自己摸索着过河. 对于日期组件穿透样式,我们能…

收集了很久的全网好用的磁力搜索站列表分享

之前找资源的时候,收集了一波国内外大部分主流的磁力链接搜索站点。每一个站可能都有对应的优缺点,多试试,就能知道自己要哪个了。 全网好用的磁力链接 大部分的时候,我们用国内的就可以了,速度块,而且不…

Snappy使用

Snappy使用 Snappy是谷歌开源的压缩和解压的开发包,目标在于实现高速的压缩而不是最大的压缩 项目地址:GitHub - google/snappy:快速压缩器/解压缩器 Cmake版本升级 该项目需要比较新的cmake,CMake 3.16.3 or higher is requi…

51单片机第23步_定时器1工作在模式0(13位定时器)

重点学习51单片机定时器1工作在模式0的应用。 在51单片机中,定时器1工作在模式0,它和定时器0一样,TL1占低5位,TH1占高8位,合计13位,也是向上计数。 1、定时器1工作在模式0 1)、定时器1工作在模式0的框图…

8619 公约公倍

这个问题可以通过计算最大公约数 (GCD) 和最小公倍数 (LCM) 来解决。我们需要找到一个整数,它是 a, b, c 的 GCD 的倍数,同时也是 d, e, f 的 LCM 的约数。 以下是解决这个问题的步骤: 1. 计算 a, b, c 的最大公约数。 2. 计算 d, e, f 的最…

流处理系统对比:RisingWave vs ksqlDB

本文将从架构、部署与可扩展性、Source 和 Sink、生态系统与开发者工具几个方面比较 ksqlDB 和 RisingWave 这两款领先的流处理系统。 1. 架构 ksqlDB 是由 Confluent 开发和维护的流处理 SQL 引擎,专为 Apache Kafka 设计。它基于 Kafka Streams 构建,…

鸿蒙:路由Router原理

页面路由:在应用程序中实现不同页面之间的跳转和数据传递 典型应用:商品信息返回、订单等多页面跳转 页面栈最大容量为32个页面,当页面需要销毁可以使用router.clear()方法清空页面栈 router有两种页面跳转模式: router.pushUrl…