《Spark大数据分析:核心概念、技术及实践》一3.9 共享变量

简介:
 本节书摘来自华章出版社《Spark大数据分析:核心概念、技术及实践》一书中的第3章,第3.9节,作者[美] 穆罕默德·古勒(Mohammed Guller),更多章节内容可以访问云栖社区“华章计算机”公众号查看。


3.9 共享变量

Spark使用的架构是无共享的。数据分布在集群的各个节点上,每个节点都有自己的CPU、内存和存储资源。没有全局的内存空间用于任务间共享。驱动程序和任务之间通过消息共享数据。

举例来说,如果一个RDD操作的函数参数是驱动程序中变量的引用,Spark会将这个变量的副本以及任务一起发送给执行者。每个任务都有一份变量的副本并把它当成只读变量使用。任何对这个变量的更新都只存在任务的内部,改动并不会回传给驱动程序。而且Spark会把这个变量在每一个阶段的开始发送给worker节点。

对于一些应用而言,这种默认行为是低效的。在一个实际的使用场景中,驱动程序在作业的任务间共享了一个巨大的查找表。而这个作业由多个阶段构成。默认情况下,Spark会自动将这个变量及其相关任务发送给每个执行者。然而,Spark会在每个阶段做这件事。如果这个查找表存储了100MB的数据,并且这个作业涉及10个阶段,那么Spark就会给每个worker节点发送10次100MB的相同数据。

另外一个使用场景是在每个运行在不同节点上的任务中需要更新全局变量。默认情况下,任务中对变量的更新是不会回传给驱动程序的。

Spark通过共享变量的概念来满足这些使用场景的需求。

3.9.1 广播变量

广播变量的使用使得Spark应用可以有效地在驱动程序和执行作业的任务之间共享数据。Spark只会给worker节点发送一次广播变量,并且将它反序列化成只读变量存储在执行者的内存中。而且,Spark采用一种更高效的算法来发布广播变量。

注意,如果一个作业由多个阶段构成,且阶段中的任务使用同一个驱动程序的变量,那么使用广播变量是十分有用的。如果你不想在开始执行每个任务之前反序列化变量,使用广播变量也是有益的。默认情况下,Spark会将传输过来的变量以序列化的形式缓存在执行者的内存中,在开始执行任务之前再反序列化它。

SparkContext 类提供了一个叫作broadcast的方法用于创建广播变量。它把一个待广播的变量作为参数,返回一个Broadcast类实例。一个任务必须使用Broadcast对象的value方法才可以获取广播变量的值。

考虑这样一个应用,它根据电商交易信息生成交易详情。在现实世界的应用中会有一张顾客表、一张商品表和一张交易表。为了简化起见,我们直接用一些简单的数据结构来代替这些表作为输入数据。

 

使用广播变量使得我们可以高效地实现顾客数据、商品数据和交易数据之间的连接。我们可以通过使用RDD API来实现连接操作,但是这会在网络间对顾客数据、商品数据和交易数据做shuffle操作。使用广播变量,我们使得Spark只将顾客数据和商品数据发送给每个节点一次,并且用简单的map操作来代替耗时的join操作。

3.9.2 累加器

累加器是只增变量,它可以被运行在不同节点上的任务更改并且被驱动程序读取。它可以用于计数器和聚合操作。Spark提供了数值类型的累加器,也支持创建自定义类型的累加器。

SparkContext类提供了一个叫作accumulator的方法用于创建累加器变量。它有两个参数。第一个参数是累加器的初值,第二个是在Spark UI中显示的名字,这是一个可选参数。它返回一个Accumulator类实例。这个类实例为操作累加器变量提供操作符。任务只能采用add方法或者+=操作符来增加累加器变量的值。只有驱动程序可以通过value方法来获取累加器的值。

考虑这样一个应用,它需要从顾客表中过滤出不合法的顾客并计数。在现实世界的应用中,我们会从硬盘中读取数据并将过滤后的数据写入到硬盘中的另外一个文件。为简化起见,我们跳过读写硬盘的部分。

 

 

在使用累加器的时候需要注意,转换操作期间对累加器的更新无法保证恰好只有一次。如果一个任务或一个阶段重复执行,每一个任务的更新操作就会多次执行。

而且,对累加器的更新操作并不是在RDD的操作方法被调用时才执行的。RDD的转换操作是惰性的,转换操作中对累加器的更新并不会立即执行。因此,如果驱动程序在操作方法被调用之前就使用累加器的值,那么它将得到一个错误的值。

相关文章
|
机器学习/深度学习 分布式计算 算法
Spark快速大数据分析PDF下载读书分享推荐
《Spark快速大数据分析》适合初学者,聚焦Spark实用技巧,同时深入核心概念。作者团队来自Databricks,书中详述Spark 3.0新特性,结合机器学习展示大数据分析。Spark是大数据分析的首选工具,本书助你驾驭这一利器。[PDF下载链接][1]。 ![Spark Book Cover][2] [1]: https://zhangfeidezhu.com/?p=345 [2]: https://i-blog.csdnimg.cn/direct/6b851489ad1944548602766ea9d62136.png#pic_center
362 1
Spark快速大数据分析PDF下载读书分享推荐
|
10月前
|
机器学习/深度学习 算法 大数据
大数据中按变量删除(Variable Deletion)
【10月更文挑战第22天】
138 5
|
11月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
274 4
|
分布式计算 Java Serverless
EMR Serverless Spark 实践教程 | 通过 spark-submit 命令行工具提交 Spark 任务
本文以 ECS 连接 EMR Serverless Spark 为例,介绍如何通过 EMR Serverless spark-submit 命令行工具进行 Spark 任务开发。
717 7
EMR Serverless Spark 实践教程 | 通过 spark-submit 命令行工具提交 Spark 任务
|
11月前
|
SQL 分布式计算 大数据
大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化
大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化
143 0
|
分布式计算 大数据 Shell
MaxCompute产品使用合集之odps shell如何将ech变量的结果集合写入文件,并且指定服务器的位置
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
114 10
|
分布式计算 Hadoop Serverless
数据处理的艺术:EMR Serverless Spark实践及应用体验
阿里云EMR Serverless Spark是基于Spark的全托管大数据处理平台,融合云原生弹性与自动化,提供任务全生命周期管理,让数据工程师专注数据分析。它内置高性能Fusion Engine,性能比开源Spark提升200%,并有成本优化的Celeborn服务。支持计算存储分离、OSS-HDFS兼容、DLF元数据管理,实现一站式的开发体验和Serverless资源管理。适用于数据报表、科学项目等场景,简化开发与运维流程。用户可通过阿里云控制台快速配置和体验EMR Serverless Spark服务。
|
分布式计算 Serverless 数据处理
EMR Serverless Spark 实践教程 | 通过 Apache Airflow 使用 Livy Operator 提交任务
Apache Airflow 是一个强大的工作流程自动化和调度工具,它允许开发者编排、计划和监控数据管道的执行。EMR Serverless Spark 为处理大规模数据处理任务提供了一个无服务器计算环境。本文为您介绍如何通过 Apache Airflow 的 Livy Operator 实现自动化地向 EMR Serverless Spark 提交任务,以实现任务调度和执行的自动化,帮助您更有效地管理数据处理任务。
402 0
|
存储 分布式计算 监控
Spark中广播变量
【8月更文挑战第13天】
435 0
|
分布式计算 运维 Serverless
通过Serverless Spark提交PySpark流任务的实践体验
EMR Serverless Spark服务是阿里云推出的一种全托管、一站式的数据计算平台,旨在简化大数据计算的工作流程,让用户更加专注于数据分析和价值提炼,而非基础设施的管理和运维。下面就跟我一起通过Serverless Spark提交PySpark流任务吧。
458 1

热门文章

最新文章