spark常见面试题

文章目录

          • 1.Spark 的运行流程?
          • 2.Spark 中的 RDD 机制理解吗?
          • 3.RDD 的宽窄依赖
          • 4.DAG 中为什么要划分 Stage?
          • 5.Spark 程序执行,有时候默认为什么会产生很多 task,怎么修改默认 task 执行个数?
          • 6.RDD 中 reduceBykey 与 groupByKey 哪个性能好,为什么?
          • 7.Spark Master HA 主从切换过程不会影响到集群已有作业的运行,为什么?
          • 8.Spark Master 使用 Zookeeper 进行 HA,有哪些源数据保存到
          • 9.Spark 主备切换机制原理知道吗?
          • 10.RDD 持久化原理?
          • 11.Checkpoint 和持久化机制的区别?
          • 12.Spark Streaming 以及基本工作原理?
          • 13.DStream 以及基本工作原理?
          • 18.Spark 中的数据倾斜问题

1.Spark 的运行流程?

Spark 运行流程 具体运行流程如下:

  1. SparkContext 向资源管理器注册并向资源管理器申请运行 Executor
  2. 资源管理器分配 Executor,然后资源管理器启动 Executor
  3. Executor 发送心跳至资源管理器
  4. SparkContext 构建 DAG 有向无环图
  5. 将 DAG 分解成 Stage(

TaskSet)

  1. 把 Stage 发送给 TaskScheduler
  2. Executor 向 SparkContext 申请 Task
  3. TaskScheduler 将 Task 发送给 Executor 运行
  4. 同时 SparkContext 将应用程序代码发放给 Executor

10.Task 在 Executor 上运行,运行完毕释放所有资源

2.Spark 中的 RDD 机制理解吗?

rdd 分布式弹性数据集,是spark一种数据结构,是 spark 框架上的通用货币。所有算子都是基于 rdd 来执行的,不同的场景会有不同的 rdd 实现类, RDD之间可以进行互相转换,从而rdd 执行过程中会形成 dag 图,然后形成 lineage 保证容错性等。从物理的角度来看 rdd 存储的是 block 和 node 之间的映射。 RDD 在逻辑上是一个 hdfs 文件,在抽象上是一种元素集合,包含了数据。它是被分区的,分为多个分区,每个分区分布在集群中的不同结点上,从而让 RDD 中 的数据可以被并行操作(分布式数据集)

比如有个 RDD90W 数据,3 个 partition,则每个分区上有 30W 数据。RDD通常通过 Hadoop 上的文件,即 HDFS 或者 HIVE 表来创建,还可以通过应用程序中的集合来创建;

RDD 最重要的特性就是容错性,由DAG的血缘关系可以自动从节点失败中恢复过来。即如果某个结点上的 RDD partition 因为节点故障,导致数据丢失,那么 RDD 可以通过自己的数据来源重新计算该 partition。这一切对使用者都是透明的。

RDD 的数据默认存放在内存中,但是当内存资源不足时,spark 会自动将 RDD 数据写入磁盘。RDD 的弹性体现在于 RDD 上自动进行内存和磁盘之间权衡和切换的机制。

比如某结点内存只能处理 20W 数据,那么这 20W 数据就会放入内 存中计算,剩下 10W 放到磁盘中。
  1. 不支持细粒度的写和更新操作,Spark 写数据是粗粒度的,所谓粗粒度, 就是批量写入数据,目的是为了高效率。但是 Spark 读数据是细粒度的, 也就是说可以一条条的读。
  2. 不支持增量迭代计算,如果对 Flink 熟悉,可以说下 Flink 支持增量迭代计算。
3.RDD 的宽窄依赖

窄依赖:父 RDD 的一个分区只会被子 RDD 的一个分区依赖;

宽依赖:父 RDD 的一个分区会被子 RDD 的多个分区依赖(涉及到 shuffle)。

  1. 对于窄依赖:

窄依赖的多个分区可以并行计算;

窄依赖的一个分区的数据如果丢失只需要重新计算对应的分区的数据就 可以了。

  1. 对于宽依赖:

划分 Stage(阶段)的依据:对于宽依赖,必须等到上一阶段计算完成才能计算下一阶段。

4.DAG 中为什么要划分 Stage?

并行计算

一个复杂的业务逻辑如果有 shuffle,那么就意味着前面阶段产生结果后,才能执行下一个阶段,即下一个阶段的计算要依赖上一个阶段的数据。那么我们按照shuffle 进行划分(也就是按照宽依赖就行划分),就可以将一个 DAG 划分成多 个 Stage/阶段,在同一个 Stage 中,会有多个算子操作,可以形成一个pipeline 流水线,流水线内的多个平行的分区可以并行执行。

对于窄依赖,partition 的转换处理在 stage 中完成计算,不划分(将窄依赖尽 量放在在同一个 stage 中,可以实现流水线计算)。

对于宽依赖,由于有 shuffle 的存在,只能在父 RDD 处理完成后,才能开始接 下来的计算,也就是说需要要划分 stage。

核心算法:回溯算法

从后往前回溯/反向解析,遇到窄依赖加入本 Stage,遇见宽依赖进行 Stage 切分。 Spark 内核会从触发 Action 操作的那个 RDD 开始从后往前推,首先会为最后 一个 RDD 创建一个 Stage,然后继续倒推,如果发现对某个 RDD 是宽依赖,那 么就会将宽依赖的那个 RDD 创建一个新的 Stage,那个 RDD 就是新的 Stage的最后一个 RDD。 然后依次类推,继续倒推,根据窄依赖或者宽依赖进行 Stage的划分,直到所有的 RDD 全部遍历完成为止。

5.Spark 程序执行,有时候默认为什么会产生很多 task,怎么修改默认 task 执行个数?
  1. 输入数据有很多 task,尤其是有很多小文件的时候,有多少个输入 block就会有多少个 task 启动;
  2. spark 中有 partition 的概念,每个 partition 都会对应一个 task,task 越多,在处理大规模数据的时候,就会越有效率。不过 task 并不 是越多越好,如果平时测试,或者数据量没有那么大,则没有必要 task 数 量太多。
  3. 参数可以通过 spark_home/conf/spark-default.conf 配置文件设置:

针对 spark sql 的 task 数量:spark.sql.shuffle.partitions=50

非 spark sql 程序设置生效:spark.default.parallelism=10

6.RDD 中 reduceBykey 与 groupByKey 哪个性能好,为什么?

reduceByKey:reduceByKey 会在结果发送至 reducer 之前会对每个 mapper 在本地进行 merge,有点类似于在 MapReduce 中的 combiner。这样做的好处在于,在 map 端进行一次 reduce 之后,数据量会大幅度减小,从而减小传输,保证reduce 端能够更快的进行结果计算。

groupByKey:groupByKey 会对每一个 RDD 中的 value 值进行聚合形成一个序列(Iterator),此操作发生在 reduce 端,所以势必会将所有的数据通过网络进行传输,造成不必要的浪费。同时如果数据量十分大,可能还会造成OutOfMemoryError。

所以在进行大量数据的 reduce 操作时候建议使用 reduceByKey。不仅可以提高 速度,还可以防止使用 groupByKey 造成的内存溢出问题。

7.Spark Master HA 主从切换过程不会影响到集群已有作业的运行,为什么?

不会的。

因为程序在运行之前,已经申请过资源了,driver 和 Executors 通讯,不需要和 master 进行通讯的。

8.Spark Master 使用 Zookeeper 进行 HA,有哪些源数据保存到

Zookeeper 里面?

spark 通过这个参数 spark.deploy.zookeeper.dir 指定 master 元数据在zookeeper 中保存的位置,包括 Worker,Driver 和 Application 以及Executors。standby 节点要从 zk 中,获得元数据信息,恢复集群运行状态, 才能对外继续提供服务,作业提交资源申请等,在恢复前是不能接受请求的。

注:Master 切换需要注意 2 点:

1、在 Master 切换的过程中,所有的已经在运行的程序皆正常运行! 因为 SparkApplication 在运行前就已经通过 Cluster Manager 获得了计算资源,所以在运行时 Job 本身的 调度和处理和 Master 是没有任何关系。

2、在 Master 的切换过程中唯一的影响是不能提交新的 Job:一方面不能够提交新 的应用程序给集群, 因为只有 Active Master 才能接受新的程序的提交请求;另 外一方面,已经运行的程序中也不能够因 Action 操作触发新的 Job 的提交请求。

9.Spark 主备切换机制原理知道吗?

Master 实际上可以配置两个,Spark 原生的 standalone 模式是支持 Master主备切换的。当 Active Master 节点挂掉以后,我们可以将 Standby Master 切 换为 Active Master。

Spark Master 主备切换可以基于两种机制,一种是基于文件系统的,一种是基于 ZooKeeper 的。

基于文件系统的主备切换机制,需要在 Active Master 挂掉之后手动切换到 Standby Master 上;

而基于 Zookeeper 的主备切换机制,可以实现自动切换 Master。

10.RDD 持久化原理?

spark 非常重要的一个功能特性就是可以将 RDD 持久化在内存中。调用 cache()和 persist()方法即可。cache()和 persist()的区别在于,cache() 是 persist()的一种简化方式,cache()的底层就是调用 persist()的无参版本

persist(MEMORY_ONLY),将数据持久化到内存中。 如果需要从内存中清除缓存,可以使用 unpersist()方法。RDD 持久化是可以手 动选择不同的策略的。在调用 persist()时传入对应的 StorageLevel 即可。

11.Checkpoint 和持久化机制的区别?

最主要的区别在于持久化只是将数据保存在 BlockManager 中,但是 RDD 的lineage(血缘关系,依赖关系)是不变的。但是 checkpoint 执行完之后,rdd 已经没有之前所谓的依赖 rdd 了,而只有一个强行为其设置的 checkpointRDD,checkpoint 之后 rdd 的 lineage 就改变了。

持久化的数据丢失的可能性更大,因为节点的故障会导致磁盘、内存的数据丢失。但是 checkpoint 的数据通常是保存在高可用的文件系统中,比如 HDFS 中,所以数据丢失可能性比较低

12.Spark Streaming 以及基本工作原理?

Spark streaming 是 spark core API 的一种扩展,可以用于进行大规模、高吞吐量、容错的实时数据流的处理。 它支持从多种数据源读取数据,比如 Kafka、Flume、Twitter 和 TCP Socket, 并且能够使用算子比如 map、reduce、join 和 window 等来处理数据,处理后的数据可以保存到文件系统、数据库等存储中。

Spark streaming 内部的基本工作原理是:接受实时输入数据流,然后将数据拆 分成 batch,比如每收集一秒的数据封装成一个 batch,然后将每个 batch 交给 spark 的计算引擎进行处理,最后会生产处一个结果数据流,其中的数据也是一个一个的 batch 组成的。

13.DStream 以及基本工作原理?

DStream 是 spark streaming 提供的一种高级抽象,代表了一个持续不断的数 据流。

DStream 可以通过输入数据源来创建,比如 Kafka、flume 等,也可以通过其他DStream 的高阶函数来创建,比如 map、reduce、join 和 window 等。 DStream 内部其实不断产生 RDD,每个 RDD 包含了一个时间段的数据。

Spark streaming 一定是有一个输入的 DStream 接收数据,按照时间划分成一个一个的 batch,并转化为一个 RDD,RDD 的数据是分散在各个子节点的partition 中

18.Spark 中的数据倾斜问题
  1. 前提是定位数据倾斜,是 OOM 了,还是任务执行缓慢,看日志,看 WebUI

  2. 解决方法,有多个方面:

避免不必要的 shuffle,如使用广播小表的方式,将 reduce-side-join

提升为 map-side-join

分拆发生数据倾斜的记录,分成几个部分进行,然后合并 join 后的结果

改变并行度,可能并行度太少了,导致个别 task 数据压力大

两阶段聚合,先局部聚合,再全局聚合

自定义 paritioner,分散 key 的分布,使其更加均匀

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

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

相关文章

从0到1上线小程序的步骤

文章目录 一、开发前的准备二、开发中三、开发完成的上线部署相关资料和网址 开发一个小程序(例如微信小程序)涉及到多个阶段,每个阶段都有特定的步骤和要求。以下是详细的步骤及相关资料和网址,帮助你在开发前、开发中和开发完成…

镜像源问题:pip,npm,git,Linux,docker

镜像源的作用 提高下载速度:镜像源通常位于全球不同的地理位置,用户可以选择离自己最近的镜像源下载软件或更新,从而大大提高下载速度和效率。 负载均衡:通过将下载请求分散到多个镜像源,可以减轻主服务器的负载&…

RabbitMQ 入门

目录 一:什么是MQ 二:安装RabbitMQ 三:在Java中如何实现MQ的使用 RabbitMQ的五种消息模型 1.基本消息队列(BasicQueue) 2.工作消息队列(WorkQueue) 3. 发布订阅(Publish、S…

RIP、OSPF、IS-IS学习

文章目录 RIP (Routing Information Protocol) 路由信息协议OSPF (Open Shortest Path First) 开放最短路径优先IS-IS (Intermediate System to Intermediate System) 中间系统到中间系统 RIP (Routing Information Protocol) 路由信息协议 特性: 基于距离向量&am…

设计模式-面向对象设计原则

设计模式-面向对象的设计原则 依赖倒置原则开闭封闭原则单一职责原则Liskov替换原则接口隔离原则面向对象优先使用对象组合,而不是类继承。封装变化点针对接口编程,而不是针对实现编程 变化是复用的天地。面向对象设计最大的优势在于抵御变化。 重新认识…

【论文阅读】Multi-Camera Unified Pre-Training via 3D Scene Reconstruction

论文链接 代码链接 多摄像头三维感知已成为自动驾驶领域的一个重要研究领域,为基于激光雷达的解决方案提供了一种可行且具有成本效益的替代方案。具有成本效益的解决方案。现有的多摄像头算法主要依赖于单目 2D 预训练。然而,单目 2D 预训练忽略了多摄像…

【深度学习】GPT-3,Language Models are Few-Shot Learners(一)

论文: https://arxiv.org/abs/2005.14165 摘要 最近的研究表明,通过在大规模文本语料库上进行预训练,然后在特定任务上进行微调,可以在许多NLP任务和基准上取得显著的进展。虽然这种方法在结构上通常是任务无关的,但…

走进Web3时代的物联网领域:科技的无限可能

随着Web3技术的迅速发展,物联网(IoT)领域正迎来一场深刻的变革。本文将深入探讨Web3时代如何重新定义物联网的边界和未来发展的无限可能性,从技术原理到应用案例,为读者呈现一个充满挑战和机遇的全新科技景观。 1. Web…

GPU微架构综述

GPU微架构综述 摘要 图形处理单元(GPU)已成为现代计算系统中的关键组成部分,不仅在图形渲染方面发挥重要作用,还广泛应用于高性能计算、机器学习和科学计算等领域。本文综述了GPU微架构的发展历程和设计理念,探讨了其…

ffmpeg压缩视频

最近需要压缩视频,windows下没找到好的工具(大部分工具需要收费),于是想到通过ffmpeg工具进行压缩;ffmpeg不仅是一款强大的视频、图片处理工具,还是一款开源的多媒体框架。 windows下可以下载ffmpeg&#…

【数据结构】练习集

数据的逻辑结构说明数据元素之间的顺序关系,它依赖于计算机的存储结构。(F) 在顺序表中逻辑上相邻的元素,其对应的物理位置也是相邻的。(T) 若一个栈的输入序列为{1, 2, 3, 4, 5},则不可能得到…

mediasoup源码分析(三)channel创建及信令交互

mediasoup源码分析--channel创建及信令交互 概述跨职能图业务流程图代码剖析 概述 在golang实现mediasoup的tcp服务及channel通道一文中,已经介绍过信令服务中tcp和channel的创建,本文主要讲解c中mediasoup的channel创建,以及信令服务和medi…

HTML|02HTML标签

HTML标签的语义化 语义化就是&#xff1a;标签的含义HTML标签 排版标签标题标签h<h1></h1> 标签有h1-h6&#xff0c;没有h7段落标签p<p></p>水平线标签hr<hr /> 单标记换行标签br<br />div span标签用来布局的 文本格式化标签<b>&…

编程用什么电脑不卡的:深度解析与推荐

编程用什么电脑不卡的&#xff1a;深度解析与推荐 在编程的世界里&#xff0c;一台流畅不卡的电脑无疑是每个开发者的得力助手。然而&#xff0c;面对市场上琳琅满目的电脑品牌和型号&#xff0c;如何选择一台适合编程的电脑却成为了一个令人困惑的问题。本文将从四个方面、五…

如何避免接口重复请求(axios推荐使用AbortController)

前言&#xff1a; 我们日常开发中&#xff0c;经常会遇到点击一个按钮或者进行搜索时&#xff0c;请求接口的需求。 如果我们不做优化&#xff0c;连续点击按钮或者进行搜索&#xff0c;接口会重复请求。 以axios为例&#xff0c;我们一般以以下几种方法为主&#xff1a; 1…

「C系列」C 头文件及引发方法/操作

文章目录 一、C 头文件二、引用头文件的方法1. 使用尖括号 < > 引用标准库头文件2. 使用双引号 " " 引用用户自定义头文件 三、引用头文件的操作四、相关链接 一、C 头文件 在C语言中&#xff0c;头文件&#xff08;Header Files&#xff09;通常用于包含函数…

bashrc和profile区别

作用与目的&#xff1a; .bashrc&#xff1a;这个文件主要用于配置和自定义用户的终端环境和行为。每次启动新的终端时&#xff0c;.bashrc文件都会被执行&#xff0c;加载用户设置的环境变量、别名、函数等。这使得用户能够根据自己的喜好和需求来定制终端的行为和外观。profi…

如何通过编程获取桌面分辨率、操作像素点颜色、保存位图和JPG格式图片,以及图片数据的处理和存储方式

本节课在线学习视频&#xff08;网盘地址&#xff0c;保存后即可免费观看&#xff09;&#xff1a; ​​https://pan.quark.cn/s/c474d087e76f​​ 在图形编程中&#xff0c;获取桌面分辨率、操作像素点颜色、保存和处理图片数据是常见任务。本文将介绍如何通过编程实现这些操…

沃尔玛验厂报告的颜色分级

Walmart沃尔玛每年评估约 14000 份第三方社会责任验厂报告。沃尔玛验厂总的原则是&#xff0c;工厂从RBA、BSCI、SA8000等11个第三方社会责任验厂标准中&#xff0c;自由选择其中一个来进行验厂&#xff0c;验厂结束以后&#xff0c;把验厂报告提交给沃尔玛&#xff1b;然后沃尔…

【Pmac】PMAC QT联合开发中各种可能遇到的坑

目录 1. 错误 C2027 使用了未定义类型“PCOMMSERVERLib::DEVUPLOAD”2. 输入了正确的pmac的ip地址&#xff0c;没有显示可选的pmac设备3. Pmac DTC-28B无读数 使用QT编写PMAC上位机程序时&#xff0c;利用QT中的dump工具可以将pcommserver.exe转化为pcommserverlib.h和pcommser…