【Spark】(四)Spark 广播变量和累加器

简介: 【Spark】(四)Spark 广播变量和累加器

文章目录


一、概述

二、广播变量broadcast variable

2.1 为什么要将变量定义成广播变量?

2.2 广播变量图解

2.3 如何定义一个广播变量?

2.4 如何还原一个广播变量?

2.5 定义广播变量需要的注意点?

2.6 注意事项

三、累加器

3.1 为什么要将一个变量定义为一个累加器?

3.2 图解累加器

3.3 如何定义一个累加器?

3.4 如何还原一个累加器?

3.5 注意事项


一、概述


在spark程序中,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的是这个函数所用变量的一个独立副本。这些变量会被复制到每台机器上,并且这些变量在远程机器上的所有更新都不会传递回驱动程序。通常跨任务的读写变量是低效的,但是,Spark还是为两种常见的使用模式提供了两种有限的共享变量:广播变(broadcast variable)和累加器(accumulator)


二、广播变量broadcast variable


2.1 为什么要将变量定义成广播变量?



如果我们要在分布式计算里面分发大对象,例如:字典,集合,黑白名单等,这个都会由Driver端进行分发,一般来讲,如果这个变量不是广播变量,那么每个task就会分发一份,这在task数目十分多的情况下Driver的带宽会成为系统的瓶颈,而且会大量消耗task服务器上的资源,如果将这个变量声明为广播变量,那么支持每个executor拥有一份,这个executor启动的task会共享这个变量,节省了通信的成本和服务器的资源。


2.2 广播变量图解


错误的,不使用广播变量


20200107222815852.png


正确的,使用广播变量的情况


20200107222829432.png


2.3 如何定义一个广播变量?


val a = 3
val broadcast = sc.broadcast(a)


2.4 如何还原一个广播变量?


val c = broadcast.value


2.5 定义广播变量需要的注意点?


变量一旦被定义为一个广播变量,那么这个变量只能读,不能修改


2.6 注意事项


1、能不能将一个RDD使用广播变量广播出去?


不能,因为RDD是不存储数据的。可以将RDD的结果广播出去。


2、 广播变量只能在Driver端定义,不能在Executor端定义。


3、 在Driver端可以修改广播变量的值,在Executor端无法修改广播变量的值。


4、如果executor端用到了Driver的变量,如果不使用广播变量在Executor有多少task就有多少Driver端的变量副本。


5、如果Executor端用到了Driver的变量,如果使用广播变量在每个Executor中只有一份Driver端的变量副本。


三、累加器


3.1 为什么要将一个变量定义为一个累加器?


在spark应用程序中,我们经常会有这样的需求,如异常监控,调试,记录符合某特性的数据的数目,这种需求都需要用到计数器,如果一个变量不被声明为一个累加器,那么它将在被改变时不会再driver端进行全局汇总,即在分布式运行时每个task运行的只是原始变量的一个副本,并不能改变原始变量的值,但是当这个变量被声明为累加器后,该变量就会有分布式计数的功能。


3.2 图解累加器


错误的图解


20200107223055668.png


正确的图解


20200107223115351.png


3.3 如何定义一个累加器?


val a = sc.accumulator(0)


3.4 如何还原一个累加器?


val b = a.value


3.5 注意事项


1、 累加器在Driver端定义赋初始值,累加器只能在Driver端读取最后的值,在Excutor端更新。


2、累加器不是一个调优的操作,因为如果不这样做,结果是错的

目录
相关文章
|
1月前
|
分布式计算 Spark
Spark学习--day05、累加器
Spark学习--day05、累加器
|
1月前
|
分布式计算 监控 分布式数据库
Spark Day05:Spark Core之Sougou日志分析、外部数据源和共享变量
Spark Day05:Spark Core之Sougou日志分析、外部数据源和共享变量
106 0
|
10月前
|
分布式计算 算法 Spark
Spark学习--4、键值对RDD数据分区、累加器、广播变量、SparkCore实战(Top10热门品类)
Spark学习--4、键值对RDD数据分区、累加器、广播变量、SparkCore实战(Top10热门品类)
|
分布式计算 Java 编译器
一天学完spark的Scala基础语法教程一、基础语法与变量(idea版本)-1
一天学完spark的Scala基础语法教程一、基础语法与变量(idea版本)
160 0
一天学完spark的Scala基础语法教程一、基础语法与变量(idea版本)-1
|
缓存 分布式计算 Java
Spark RDD高级应用(传参、闭包、共享变量)
Spark RDD高级应用(传参、闭包、共享变量)
293 0
Spark RDD高级应用(传参、闭包、共享变量)
|
1月前
|
分布式计算 Hadoop 大数据
大数据技术与Python:结合Spark和Hadoop进行分布式计算
【4月更文挑战第12天】本文介绍了大数据技术及其4V特性,阐述了Hadoop和Spark在大数据处理中的作用。Hadoop提供分布式文件系统和MapReduce,Spark则为内存计算提供快速处理能力。通过Python结合Spark和Hadoop,可在分布式环境中进行数据处理和分析。文章详细讲解了如何配置Python环境、安装Spark和Hadoop,以及使用Python编写和提交代码到集群进行计算。掌握这些技能有助于应对大数据挑战。
|
9天前
|
存储 分布式计算 Hadoop
Spark和Hadoop都是大数据处理领域的重要工具
【6月更文挑战第17天】Spark和Hadoop都是大数据处理领域的重要工具
35 7
|
13天前
|
分布式计算 大数据 数据处理
Apache Spark在大数据处理中的应用
Apache Spark是大数据处理的热门工具,由AMPLab开发并捐赠给Apache软件基金会。它以内存计算和优化的执行引擎著称,提供比Hadoop更快的处理速度,支持批处理、交互式查询、流处理和机器学习。Spark架构包括Driver、Master、Worker Node和Executor,核心组件有RDD、DataFrame、Dataset、Spark SQL、Spark Streaming、MLlib和GraphX。文章通过代码示例展示了Spark在批处理、交互式查询和实时数据处理中的应用,并讨论了其优势(高性能、易用性、通用性和集成性)和挑战。【6月更文挑战第11天】
44 6
|
11天前
|
分布式计算 Hadoop 大数据
大数据技术:Hadoop与Spark的对比
【6月更文挑战第15天】**Hadoop与Spark对比摘要** Hadoop是分布式系统基础架构,擅长处理大规模批处理任务,依赖HDFS和MapReduce,具有高可靠性和生态多样性。Spark是快速数据处理引擎,侧重内存计算,提供多语言接口,支持机器学习和流处理,处理速度远超Hadoop,适合实时分析和交互式查询。两者在资源占用和生态系统上有差异,适用于不同应用场景。选择时需依据具体需求。