Spark 广播变量的数据分发 的完整操作流程

server/2024/10/25 15:52:08/

        在 Spark 中,广播变量的数据分发操作流程相对复杂,涉及到驱动程序与各个执行器(Executor)之间的通信与协作。下面是广播变量数据分发的完整流程,从广播变量的创建到分发给各个节点的步骤:

1. 广播变量的创建

        当用户在 Spark 程序中调用 SparkContext.broadcast 创建广播变量时,广播机制的流程正式启动。此时,驱动程序会首先创建一个广播变量对象,并将需要广播的数据包装在这个对象中。这个过程由 Spark 的驱动程序负责。

val broadcastVar = sc.broadcast(someData)
  • 驱动程序 是整个任务的协调者,负责将广播变量的元数据和内容广播给集群中的所有执行器。
  • 广播变量 一旦创建,它会在整个作业(job)的执行过程中保持不变(即只读)。

2. 广播数据的序列化

        广播变量创建后,驱动程序首先会对广播的数据进行序列化处理。序列化的目的是将数据转换成字节流格式,以便后续能够高效地通过网络传输到各个执行器。

        Spark 默认采用 Java serialization 或 Kryo serialization 来序列化数据。为了提高性能,通常推荐使用 Kryo 序列化。

3. 数据分发的策略

        广播的数据需要从驱动程序分发到各个工作节点的执行器。Spark 提供了两种不同的广播实现方式:

  • Torrent Broadcast(种子广播机制,Spark 默认方式):在 Spark 1.5 之后,Spark 使用了一种类似于 BitTorrent 协议的种子广播方式。Torrent Broadcast 的工作原理类似于 P2P 网络中的数据分发。即:
    1. 驱动程序 首先将广播的数据分片成多个小块(chunks),并将这些块发送给部分执行器。
    2. 执行器 收到数据块后,既可以处理这些数据块,也可以进一步将其传播给其他执行器,形成链式的广播。这样可以减少驱动程序的负担,提高数据传输的并发性和效率。
  • Http Broadcast:早期的 Spark 版本使用 HTTP 协议进行广播。驱动程序将广播变量放到一个本地的 HTTP 服务器上,所有执行器通过 HTTP 请求从该服务器下载数据。这种方式对驱动程序的压力较大,效率较低,在大型集群中容易成为瓶颈,因此已经被 Torrent Broadcast 所取代。

4. 数据接收与存储

        每个执行器在首次使用到广播变量时,会检查本地是否已有对应的广播变量副本。如果没有,该执行器会从驱动程序或者其他已经拥有数据的执行器处获取广播的数据块。获取完毕后,执行器会将广播变量存储在本地的内存或磁盘中。

具体的存储机制如下:

  • 内存缓存:默认情况下,广播变量会存储在执行器的内存中。如果内存不足,Spark 会将部分广播变量存储到磁盘中。
  • 磁盘存储:在内存压力较大的场景下,广播变量可以通过溢出到磁盘的方式来缓解内存不足的问题。

这意味着广播的数据在第一次获取之后,会被缓存起来供后续任务使用,从而避免重复的网络传输。

5. 任务使用广播变量

        广播数据分发到执行器后,后续的任务可以直接从本地访问广播变量。由于广播变量是只读的,任务不会对其内容进行修改。任务通过 broadcastVar.value 的方式来获取广播的数据,并在计算中进行使用。

val result = rdd.map(x => broadcastVar.value.contains(x)).collect()
  • 本地访问:每个执行器中的任务在本地访问广播变量时,是直接从缓存或磁盘中读取数据的,因此不涉及额外的网络通信,性能非常高效。

6. 广播变量的清理

        广播变量在作业执行结束后会一直保留在执行器的内存或磁盘中,直到显式清理为止。为了防止内存或磁盘占用过多,用户可以通过调用 unpersist() 方法来显式地清理广播变量,释放执行器上的资源。

broadcastVar.unpersist()

        此外,Spark 在内部也有机制通过垃圾回收来管理广播变量的生命周期,当广播变量在多个作业中不再被使用时,会自动被清理。

7. 错误处理与重试

        如果在数据分发过程中出现了网络问题,Spark 会自动重试。由于采用了 Torrent Broadcast 机制,即使部分节点获取数据失败,其他已经获取了广播数据的节点也可以继续传播数据,保证广播数据的最终一致性。

总结

广播机制的完整操作流程如下:

  1. 创建广播变量:驱动程序创建广播变量,并对数据进行序列化。
  2. 分片与分发:广播数据通过 Torrent Broadcast 被分片,并通过驱动程序和其他执行器之间的多级传播分发给集群中的所有执行器。
  3. 数据接收与缓存:每个执行器首次使用广播变量时,从驱动程序或其他执行器获取数据,并将其缓存到内存或磁盘。
  4. 任务使用广播数据:执行器上的任务通过本地访问缓存的广播变量,减少了网络传输的开销。
  5. 清理:当广播变量不再需要时,用户可以显式调用 unpersist(),或者依赖 Spark 的垃圾回收机制清理广播变量。

        这个流程确保了广播变量能够高效、可靠地在分布式环境中传播,并减少了网络传输的开销,优化了整体任务执行的性能。


http://www.ppmy.cn/server/134758.html

相关文章

腾讯推出ima.copilot智能工作台产品 由混元大模型提供技术支持

腾讯公司近期推出了一款名为ima.copilot(简称ima)的智能工作台产品,它由腾讯混元大模型提供技术支持。这款产品旨在通过其会思考的知识库,为用户开启搜读写的新体验。ima.copilot的核心功能包括知识获取、打造专属知识库以及智能写…

centos7.x安装openCV 4.6.0版本

## 从源代码编译安装 1.更新系统 sudo yum update -y 2.安装依赖项 sudo yum groupinstall "Development Tools" sudo yum install cmake gcc-c git libjpeg-turbo-devel libpng-devel libtiff-devel libwebp-devel openexr-devel gstreamer1-plugins-base-devel…

云电脑使用教程标准版

云电脑,也称为云桌面,是一种通过互联网连接远程服务器,使用虚拟桌面环境来执行计算任务的技术。川翔云电脑通过创建软件镜像,让用户能够快速启动并使用预配置的软件和资料,提供高效且经济的云服务。相较于公有云服务&a…

在 Linux 上保护 SSH 服务器连接的15种措施

在 Linux 上保护 SSH 服务器连接的15种措施 SSH(Secure Shell)是一种广泛使用的协议,用于安全地访问 Linux 服务器。尽管 SSH 提供了一定的安全性,但不安全的默认配置可能会导致各种安全风险,特别是在开放的环境中。为…

[实时计算flink]基于Paimon的数据库实时入湖快速入门

Apache Paimon是一种流批统一的湖存储格式,支持高吞吐的写入和低延迟的查询。本文通过Paimon Catalog和MySQL连接器,将云数据库RDS中的订单数据和表结构变更导入Paimon表中,并使用Flink对Paimon表进行简单分析。 背景信息 Apache Paimon是一…

轻松拿下offer,一次真实的面试回答记录

前言 最近一个vip学员去面试,被问到一些问题,回答完后轻松拿到offer。今天完整地记录这次面试中问到的问题与回答(该学员面试的公司,项目使用Lua为主)。 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交…

前端优化:从Vue/React/Svelte的数组更新->渲染策略剖析数组大列表数据展示优化策略

在现代前端框架中,数组的渲染是一个重要的功能。不同的框架在处理数组的操作(如新增、删除和更新)时有不同的实现方式和优化手段。本文将对比 Vue、React 和 Svelte 在数组渲染方面的特点,并讨论其优缺点,特别是与直接…

【Qt6聊天室项目】 主界面功能实现

1. 获取当前用户的个人信息 1.1 前后端逻辑分析(主界面功能) 主界面上所有的前后端交互逻辑相同,分析到加载会话列表后其余功能仅实现。 核心逻辑总结 异步请求-响应模型 客户端发起请求,向服务器发送包含会话ID的请求服务端处…