火花流处理过程中使用的全局类变量:是广播变量吗?

时间:2019-07-03 12:17:59

标签: spark-streaming broadcast

我只需要知道在SparkStreaming流程中使用的全局公共类变量是否将被视为广播变量。

到目前为止,我成功地将预先设置的变量“库存”用于JavaDStream转换。

class Foo {

  public static Map<String,String> inventory;

  public static void main(String args) {

    inventory = Inventory.load(); // here i set the variable

    SparkSession sparkSession = ...

    JavaStreamingContext ssc = ... // here i initialize the Spark Streaming Context

    JavaInputDStream<ConsumerRecord<String, String>> records = ...

    JavaDStream<Map<String,Object>> processedRecords = records.flatMap(rawRecord->{
      return f(rawRecord,inventory); // just an example...
    }

  }

}

我了解到,lambda表达式(rawRecord)中的部分是分布式的,然后我假定向执行该过程的每个执行者广播“清单”,是这样吗?

2 个答案:

答案 0 :(得分:1)

全局类变量与广播变量不同。

  

使用类变量很好,但是这样做效率低下,尤其是   适用于较大的变量,例如查找表或机器学习   模型。原因是当您在   闭包或类变量,必须在其上反序列化   工作节点多次(每个任务一次)。此外,如果您使用   在多个Spark动作和作业中使用相同的变量,它将被重新发送   而不是一次地交给工人。

广播变量是共享的,不可变的变量,它们 缓存在群集中的每台计算机上,而不是与每个任务序列化

您需要做的就是

 Broadcast<Map<String,String>> broadcast = ssc.sparkContext().broadcast(inventory);

并访问

broadcast.value().get(key)

答案 1 :(得分:0)

是的,您必须广播该变量以使分布式环境中的所有执行程序都可以使用。