spark的广播变量(Broadcast)

注明:大部分知识点是从官方文档翻译,少部分是自己测试,或者在实际项目中的总结。

官方文档地址: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)