广播变量(Broadcast)-及生命周期

简介:

1 Spark中广播变量概念
广播变量是spark中共享变量的其中一种。它可以让程序高效的向所有工作节点发送一个只读的值,以供一个或多个spark操作使用。

2 广播变量使用示例
下面是一段简单的计算逻辑,对比了不使用广播变量和使用广播变量的两种方式:

val pws = Map("Apache Spark" -> "http://spark.apache.org/", "Scala" -> "http://www.scala-lang.org/")
//不使用广播变量(比较低效,需要多次将pws变量发送到各个节点)
val time1=System.currentTimeMillis()
val websites = sc.parallelize(Seq("Apache Spark", "Scala")).map(pws).collect
val time2 =System.currentTimeMillis()
println("websites = " + (time2 - time1))
websites.foreach(println)
//使用广播变量
val pwsB = sc.broadcast(pws)
val time3=System.currentTimeMillis()
val websitesWithBroadcast = sc.parallelize(Seq("Apache Spark", "Scala")).map(pwsB.value).collect
println("websitesWithBroadcast = " + (System.currentTimeMillis() - time3))
websitesWithBroadcast.foreach(println)
输出:
===============广播变量使用示例================
cost = 446ms
websites =
http://spark.apache.org/
http://www.scala-lang.org/
cost = 32ms
websitesWithBroadcast =
http://spark.apache.org/
http://www.scala-lang.org/
可以看出,输出结果是一样的,但是耗时,广播变量明显优于非广播变量模式。

3 广播变量原理
将变量广播到各个执行器:

在spark中,使用SparkContext创建广播变量,使用broadcastmanager和ContextCleaner管理其生命周期。

org.apache.spark.SparkContext#broadcast核心代码:

def broadcast[T: ClassTag](value: T): Broadcast[T] = {
//调用broadcastManager创建新的广播变量
val bc = env.broadcastManager.newBroadcast[T](value, isLocal)
//注册广播变量到ContextCleaner
cleaner.foreach(_.registerBroadcastForCleanup(bc))
bc
}
也可以手动销毁广播变量org.apache.spark.broadcast.Broadcast#destroy:

def destroy() {
destroy(blocking = true)
}
获取广播变量的值:


/** Get the broadcasted value. */
def value: T = {
assertValid()
getValue()
}
相关文章
|
存储 关系型数据库 MySQL
怎么使用 Flink 向 Apache Doris 表中写 Bitmap 类型的数据
怎么使用 Flink 向 Apache Doris 表中写 Bitmap 类型的数据
727 0
|
缓存 负载均衡 中间件
中间件Nginx性能瓶颈
【7月更文挑战第12天】
871 13
|
监控 Java 测试技术
拆帧神器:深度解读Netty中的DelimiterBasedFrameDecoder()
拆帧神器:深度解读Netty中的DelimiterBasedFrameDecoder()
849 0
|
机器学习/深度学习 并行计算 TensorFlow
GPU加速TensorFlow模型训练:从环境配置到代码实践的全方位指南,助你大幅提升深度学习应用性能,让模型训练不再等待
【8月更文挑战第31天】本文以随笔形式探讨了如何在TensorFlow中利用GPU加速模型训练,并提供了详细的实践指南。从安装支持GPU的TensorFlow版本到配置NVIDIA CUDA及cuDNN库,再到构建CNN模型并使用MNIST数据集训练,全面展示了GPU加速的重要性与实现方法。通过对比CPU与GPU上的训练效果,突显了GPU在提升训练速度方面的显著优势。最后,还介绍了如何借助TensorBoard监控训练过程,以便进一步优化模型。
2344 0
|
存储 分布式计算 并行计算
阿里云大数据开发二面面经,已过,面试题已配答案
阿里云大数据开发一面面经,已过,面试题已配答案
|
Oracle Java 关系型数据库
超详细图解!基于IDEA+Gradle+jdk11搭建Spring框架源码阅读环境
超详细图解!基于IDEA+Gradle+jdk11搭建Spring框架源码阅读环境
超详细图解!基于IDEA+Gradle+jdk11搭建Spring框架源码阅读环境
|
Linux Shell
Linux判断目录是否存在命令,Linux shell 中判断文件、目录是否存在的方法
本文主要介绍了Linux 中 使用 shell 判断文件、目录是否存在的方法,分享给大家
1015 0
|
Java Go 开发工具
Go入门篇:(一)golang的安装和编辑工具安装
Go入门篇:(一)golang的安装和编辑工具安装
655 0
|
SQL 存储 关系型数据库
一条SQL查询出MySQL数据库中所有表的数据量大小
一条SQL查询出MySQL数据库中所有表的数据量大小
1909 0

热门文章

最新文章