广播变量(broadcast variable)

广播变量允许程序开发人员在每个机器上缓存一个只读的不变量,而不需要将其封装到函数中去(为每个机器生成一个副本)。通过这种方式就可以高效的为每个节点提供一个大的输入数据集副本。广播变量缓存在集群的每个节点上,而不是在每个任务中都反复序列化
可以调用SparkContext中的broadcast()函数来从一个普通变量 v 中创建一个广播变量,这个广播变量就是对普通变量 v 的一个包装器,通过调用 value 方法就可以获得这个广播变量的值
>>> broadcastVar = sc.broadcast([1, 2, 3])
>>> broadcastVar.value

累加器

Spark 第二种共享变量是累加器,它用于将转换操作更新的值以高效和容错的方式传输到驱动节点。累加器是仅被相关操作累加的变量,通常可以用来实现计数器(counter)和求和(sum)。
Spark 提供对数字类型累加器的原生支持,成程序员可以自行添加对新类型的支持。
累加器也遵循 Spark 的惰性评估机制,如果 RDD 的某个操作要更新累加器,则它的值只会在实际计算 RDD 时更新
累加器可以是命名和未命名的,命名累加器将可以在 Spark UI 上被看到
一个数值型的累加器,可以通过调用 SparkContext 中的 accumulator() 方法来创建,运行在集群中的任务就可以使用 add() 方法来把数值累加到累加器上,但是这些任务只能做累加操作,不能读取累加器的值
如果想要读取累加器的值,要在任务控制节点(Driver Program)中使用 value() 方法来读取累加器的值
下面是一个使用累加器求和的例子
>>> accum = sc.accumulator(0)
>>> sc.parallelize([1, 2, 3, 4]).foreach(lambda x: accum.add(x))
>>> accum.value()

Last modification:June 22nd, 2020 at 12:22 pm
如果觉得我的文章对你有用,请随意赞赏