PySpark之Spark的共享变量(广播变量和累加器)

一、广播变量

一、原理

  • 广播变量允许开发人员在每个节点(Worker or Executor)缓存只读变量,而不是在Task之间传递这些变量。使用广播变量能够高效地在集群没每个节点创建大数据集的副本。同时Spark还使用高效的广播算法分发这些变量,从而减少通信的开销。
  • Spark的动作通过一系列的步骤执行,这些步骤由分布式的洗牌操作分开。Spark自动地广播每个步骤每个任务需要的通用数据。这些广播数据被序列化地缓存,在运行任务之前被反序列化出来。
  • 可以通过调用sc.broadcast(v)创建一个广播变量,该广播变量的值封装在v变量中,可使用获取该变量value的方法进行访问

在这里插入图片描述

from pyspark import SparkContext, SparkConf
import os

os.environ["SPARK_HOME"] = "/export/server/spark"
PYSPARK_PYTHON = '/root/anaconda3/envs/pyspark_env/bin/python'
os.environ["PYSPARK_PYTHON"] = PYSPARK_PYTHON
os.environ["PYSPARK_DRIVER_PYTHON"] = PYSPARK_PYTHON

if __name__ == '__main__':
    print("PySpark BroadCast Program")
    # 1.创建应用程序入口SparkContext实例对象
    conf = SparkConf().setAppName("miniProject").setMaster("local[*]")
    sc = SparkContext.getOrCreate(conf)

    # 2.定义累加器
    kvFruit = sc.parallelize([(1,"apple"),(2,"orange"),(3,"banana"),(4,"grape")])
    print(kvFruit.collect())
    fruitMap = kvFruit.collectAsMap()
    print(fruitMap)
    fruitlds = sc.parallelize([2,4,1,3])
    # 3.定义累加函数实现累加功能
    fruitNames = fruitlds.map(lambda x:fruitMap[x])
    print(fruitNames.collect())
    print('停止PySpark SparkSession对象')
    # 4.关闭SparkContext
    sc.stop()

二、累加器

一、原理

  • Spark提供的Accumulator,主要用于多个节点对一个变量进行共享性的操作。Accumulator只提供了累加的功能,即提供了多个task对一个变量并行操作的功能。但是task只能对Accumulator进行累加操作,不能读取Accumulator的值,只有Driver程序可以读取Accumulator的值。创建对的Accumulator变量的值能够在Spark Web UI上看到,在创建时应该尽量为其命名。
  • Spark内置了三种类型的Accumulator
    • LongAccumulator:用来累加整数型
    • DoubleAccumulator:用来累加浮点型
    • CollectionAccumulator:用来累加集合元素

二、不使用累加器

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值