菜单
本页目录

广播变量

广播变量(Broadcast Variable)是 Spark 中用于将较小的数据集高效地共享到集群的所有节点的一种机制。通常在分布式计算中,如果某个变量或数据在所有任务(Tasks)中都需要使用,可以将该数据通过广播变量的方式发送到所有节点,而不是让每个任务独立地发送副本,从而大幅减少数据传输的开销,提高性能。

广播变量的特点

  1. 一次性发送,减少数据传输: 当你在集群中进行分布式计算时,广播变量只会被传输一次,然后在各个执行器(Executor)节点上本地化存储和使用,避免了每个任务都发送一份数据的重复传输。

  2. 只读: 广播变量是只读的。任务(Tasks)只能读取广播变量中的数据,而不能修改。这种设计避免了在分布式环境下对同一个变量进行多次写操作可能引起的不一致问题。

  3. 用于小型数据集: 广播变量通常用于那些相对较小但会在很多地方使用的数据集。例如,配置参数、查找表、模型参数等。广播数据集的大小最好适合存储在节点的内存中。

  4. 性能提升: 在需要多次访问同一份数据的操作中(如 join 操作),使用广播变量可以显著减少网络I/O的开销,进而提升性能。

广播变量的工作原理

当你使用广播变量时,数据会从驱动器(Driver)发送到集群中执行任务的所有节点。每个节点只会接收广播数据一次,然后所有任务都可以从该节点的本地存储中访问广播的数据。

PySpark 中广播变量的使用

  • 用法:

    #1,将本地List 标记成广播变星即可
    broadcast = sc.broadcast(stu_info_list)
    #2,使用广播变量,从broadcast对象中取出本地List对象即可
    value = broadcast.value
    #也就是,先放进去broadcast内部,然后从broadcast内部在取出来用,中间传输的是broadcast这个对象了
    #只要中间传输的是broadcast对象,spark就会留意,只会给每个Executor发一份了,而不是傻傻的哪个分区要都给,
    
  • 示例:

    from pyspark import SparkContext, SparkConf
    
    # 创建 SparkConf 和 SparkContext
    conf = SparkConf().setAppName("BroadcastExample")
    sc = SparkContext(conf=conf)
    
    # 创建一个小的数据集,作为需要广播的变量
    broadcast_data = {"a": 1, "b": 2, "c": 3}
    
    # 1. 广播变量
    broadcast_var = sc.broadcast(broadcast_data)
    
    # 2. 创建一个 RDD
    rdd = sc.parallelize([("a", 10), ("b", 20), ("c", 30), ("d", 40)])
    
    # 3. 使用广播变量进行操作
    result_rdd = rdd.map(lambda x: (x[0], x[1] + broadcast_var.value.get(x[0], 0)))
    
    # 4. 收集并输出结果
    result = result_rdd.collect()
    print("结果: ", result)
    
    # 关闭 SparkContext
    sc.stop()