Spark 广播变量和累加器

Spark 广播变量和累加器

学习过 RDD 常用算子之后,回顾这些算子,你会发现它们都是作用(Apply)在 RDD 之上的。RDD 的计算以数据分区为粒度,依照算子的逻辑,Executors 以相互独立的方式,完成不同数据分区的计算与转换。

不难发现,对于 Executors 来说,分区中的数据都是局部数据。换句话说,在同一时刻,隶属于某个 Executor 的数据分区,对于其他 Executors 来说是不可见的。

不过,在做应用开发的时候,总会有一些计算逻辑需要访问“全局变量”,比如说全局计数器,而这些全局变量在任意时刻对所有的 Executors 都是可见的、共享的。那么问题来了,像这样的全局变量,或者说共享变量,Spark 又是如何支持的呢?

按照创建与使用方式的不同,Spark 提供了两类共享变量,分别是广播变量(Broadcast variables)和累加器(Accumulators)。接下来,我们就正式进入今天的学习,去深入了解这两种共享变量的用法、以及它们各自的适用场景

广播变量(Broadcast variables)

我们先来说说广播变量。广播变量的用法很简单,给定普通变量 x,通过调用 SparkContext 下的 broadcast API 即可完成广播变量的创建,我们结合代码例子看一下。

val list: List[String] = List("Apache", "Spark")
 
// sc为SparkContext实例
val bc = sc.broadcast(list)

在上面的代码示例中,我们先是定义了一个字符串列表 list,它包含“Apache”和“Spark”这两个单词。然后,我们使用 broadcast 函数来创建广播变量 bc,bc 封装的内容就是 list 列表。

// 读取广播变量内容
bc.value
// List[String] = List(Apache, Spark)
 
// 直接读取列表内容
list
// List[String] = List(Apache, Spark)

广播变量创建好之后,通过调用它的 value 函数,我们就可以访问它所封装的数据内容。可以看到调用 bc.value 的效果,这与直接访问字符串列表 list 的效果是完全一致的。

看到这里,你可能会问:“明明通过访问 list 变量就可以直接获取字符串列表,为什么还要绕个大弯儿,先去封装广播变量,然后又通过它的 value 函数来获取同样的数据内容呢?”实际上,这是个非常好的问题,要回答这个问题,咱们需要做个推演,看看直接访问 list 变量会产生哪些弊端。

在前面的几讲中,我们换着花样地变更 Word Count 的计算逻辑。尽管 Word Count 都快被我们“玩坏了”,不过,一以贯之地沿用同一个实例,有助于我们通过对比迅速掌握新的知识点、技能点。因此,为了让你迅速掌握广播变量的“精髓”,咱们不妨“故技重施”,继续在 Word Count 这个实例上做文章。

普通变量的痛点

这一次

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值