首页 > 其他分享 >Spark中的闭包引用和广播变量

Spark中的闭包引用和广播变量

时间:2024-05-03 19:11:21浏览次数:16  
标签:闭包 task 变量 对象 广播 线程 引用 Spark

闭包引用

概念

所有编程语言都有闭包的概念,闭包就是在一个函数中引用了函数外的变量。

Spark中,普通的变量是在Driver程序中创建的,RDD的计算是在分布式集群中的task程序上进行的。因此,当分布式算子的函数引用了外部的变量时,Driver会把该变量序列化后通过网络发送给每一个task(只针对普通对象)。

spark中所谓"闭包引用",只是看起来类似各种编程语言中的闭包。而本质上就是对某个对象进行序列化+复制,即Driver把分布式算子中引用的外部变量序列化后,发送给每个task来使用。

在闭包函数内对外部变量进行修改,闭包外的变量的并不会改变。因为在闭包函数内的修改,只是在task上对复制过来的闭包对象副本的修改,并不会影响到driver端的原对象,他们是存在于两台机器上的独立的文件,互不影响。

好处

应用于大表join小表的场景,将小表数据(字典表、维度表)发送到大表所在节点的内存中,在map阶段完成join,无需通过两个rdd去join,省去了shffule操作。

适用条件

1、闭包引用的对象,必须实现序列化接口:extends Serializable

2、被引用的对象,数据量不能太大,否则会导致task端内存溢出。

单例对象的闭包引用

单例对象(object对象)只在每个executor进程中持有一份,由其中的多个task线程共享。不要在task中对单例对象进行修改操作,否则会产生线程安全问题。而普通对象在每个task线程中都持有一份,不存在线程安全问题。

广播变量

闭包引用的场景中,Spark为每个task都复制了一份它需要的数据,当数据量较大且task较多时,必然会给网络io和内存资源造成很大压力,而广播变量只给每个executor发送一份变量副本,由多个task共享。

和闭包引用的区别

1、闭包引用中,是由driver给每个executor直接发送数据。广播变量中,是通过bittorrent协议来发送数据的,可以减少通信成本。(所有executor遵循了人人为我,我为人人的原则)。

2、闭包引用中,每个task持有一份引用对象的副本,并可以修改(只在该task线程生效);广播变量中,一个executor只持有一份广播变量的副本,由多个task共享,该数据是只读的,不可修改。

标签:闭包,task,变量,对象,广播,线程,引用,Spark
From: https://www.cnblogs.com/ji-lei/p/18171507

相关文章

  • 在Windows防火墙设置中,允许单播响应(Unicast Response)是一个控制选项,用于允许或禁止系
    在Windows防火墙设置中,允许单播响应(UnicastResponse)是一个控制选项,用于允许或禁止系统对多播或广播网络流量的单播响应。让我详细解释一下允许和禁止单播响应的区别:允许单播响应(是):当设置为“是”时(默认值),Windows系统会允许对多播或广播网络流量的单播响应。这意味着当系......
  • 搭建单机版伪分布式Hadoop+Scala+spark
    搭建单机版伪分布式Hadoop+Scala+spark修改ip[root@master~]#nmcliconnectionaddifnameens32con-nameens32autoconnectyesipv4.methodmanualipv4.gateway192.168.130.2ipv4.addresses192.168.130.102/24ipv4.dns114.114.114.114[root@master~]#nmcliconu......
  • 闭包
    在JavaScript中,闭包是一个非常重要的概念,它指的是一个函数能够记住并访问它自身被创建时所在的作用域,即使它在别的地方被执行。这是通过函数内部创建并返回另外一个函数来实现的。这个被返回的函数持有对外部函数作用域的引用,让这个函数可以访问到外部函数的变量。来看一个简单......
  • 实战干货|Spark 在袋鼠云数栈的深度探索与实践
    Spark是一个快速、通用、可扩展的大数据计算引擎,具有高性能、易用、容错、可以与Hadoop生态无缝集成、社区活跃度高等优点。在实际使用中,具有广泛的应用场景:·数据清洗和预处理:在大数据分析场景下,数据通常需要进行清洗和预处理操作以确保数据质量和一致性,Spark提供了丰富的......
  • python闭包 - 理解与应用
    闭包定义闭包是指在一个函数内部定义的函数,并且这个内部函数可以访问外部函数的局部变量。当外部函数执行完毕后,内部函数仍然可以访问外部函数的局部变量,这种函数就称为闭包。在Python中,闭包通常用来保存一些状态信息,可以在外部函数执行完毕后继续使用这些状态信息。闭包可以帮......
  • js 闭包的概念及应用场景
    1.概念是内部函数可以访问外部函数作用域中的变量。2.来由由于JavaScript中的函数作用域规则和函数可以作为值传递的特性产生的3.优点封装性(可以将变量和函数封装起来,防止外部访问和修改,提高了代码的可维护性和可重用性)保存状态(即使函数已经执行完毕,状态仍然保存,在事件处理......
  • spark和scala的搭建
    Scala--部署安装步骤(1)上传并解压安装scala安装包例:tar-zxvfscala--**-C指定位置(2)设置环境变量vim/etc/profileexportSCALA_HOME=spark软件包位置exportPATH=$PATH:${SCALA_HOME}/binsource/etc/profile使环境变量生效(3)验证scala启动成功spark--部署与安装......
  • spark standalone同时运行pyspark和spark-shell
    需要限制资源数量,使用spark.cores.max或--total-executor-cores来指定最大核数。假设集群一共4c5.6gpyspark(使用2c2g)frompyspark.sqlimportSparkSessionspark=SparkSession.builder\.master("spark://worker1:7077")\.appName("pysparkApp")\.......
  • Spark设置executor-memory后,executor显示的内存不符问题
    以该命令为例,我们设置一个executor并分配内存为2800m,可以看到ui上只给executor分配了1.5G的内存。同理,如果你设置了--executor-memory=1g,那么实际上只会有1048.8M的内存会被分配。spark-submit--masteryarn\--num-executors=1\--executor-memory=2800m\--classorg.apac......
  • Spark SQL 抽样函数 ——TABLESAMPLE 的坑点
    最近需要实现一段SparkSQL逻辑,对数据集进行抽样指定的行数。由于数据集较大,刚开始的逻辑是,取窗口函数随机排序后row_number的前n行。但运行速度较慢,所以想起了TABLESAMLE函数,支持直接取Rows,尝试后发现速度特别快,基本上几秒内就完成对亿级数据的采样。所以好奇就去查......