注明:大部分知识点是从官方文档翻译,少部分是自己测试,或者在实际项目中的总结。
官方文档地址:https://spark.apache.org/docs/latest/rdd-programming-guide.html#shared-variables
原理
通常情况下,spark的变量只为单独的task工作。广播变量的出现,可以在每台服务器保存一个变量而不是在每一个task上保留一份。官方文档说明如下
Broadcast variables allow the programmer to keep a read-only variable cached on each machine rather than shipping a copy of it with tasks.
这样节省了数据传输的时间,尤其是在变量数据量较大的情况下。
应用场景
官方文档说明如下
This means that explicitly creating broadcast variables is only useful when tasks across multiple stages need the same data or when caching the data in deserialized form is important.
大意为当跨越多个stage并且需要相同的数据的时候 或者以反序列化形式缓存数据 的时候 这种情况下广播变量变得有必要(抱歉这里并不能理解反序列化形式缓存数据 这一步是为何)
这里注意:当创建完广播变量,后续不可以对广播变量进行修改,保证所有的节点都能获得相同的广播变量。
我们在项目中的实际应用为 在做join操作的时候,将工参表当做广播变量广播出去。因为工参表不变,也相对不大,所以符合broadcast 变量的应用场景
实现和参数
广播变量在代码中的实现
- 1、sparkRDD中的实现
val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar.value
- 2、spark sql中的实现
sql中的需要多讲一下。
官方地址:https://spark.apache.org/docs/latest/sql-performance-tuning.html#broadcast-hint-for-sql-queries
spark进行join计算的时候,我们可以将小数据量的表广播出去,
实现方式
import org.apache.spark.sql.functions.broadcast
broadcast(spark.table(“src”)).join(spark.table(“records”), “key”).show()
相关参数
spark.sql.autoBroadcastJoinThreshold 10485760 (默认10M) 将这个值设置为-1 可以禁用广播。 注意目前只支持hive表
本文深入解析Spark中的广播变量原理及应用场景,阐述如何通过广播变量节省数据传输时间,特别是在大规模数据处理时的优势。同时,介绍了在Spark RDD和Spark SQL中实现广播变量的方法,以及相关参数配置。

1501

被折叠的 条评论
为什么被折叠?



