我只需要知道在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)中的部分是分布式的,然后我假定向执行该过程的每个执行者广播“清单”,是这样吗?
答案 0 :(得分:1)
全局类变量与广播变量不同。
使用类变量很好,但是这样做效率低下,尤其是 适用于较大的变量,例如查找表或机器学习 模型。原因是当您在 闭包或类变量,必须在其上反序列化 工作节点多次(每个任务一次)。此外,如果您使用 在多个Spark动作和作业中使用相同的变量,它将被重新发送 而不是一次地交给工人。
广播变量是共享的,不可变的变量,它们 缓存在群集中的每台计算机上,而不是与每个任务序列化
您需要做的就是
Broadcast<Map<String,String>> broadcast = ssc.sparkContext().broadcast(inventory);
并访问
broadcast.value().get(key)
答案 1 :(得分:0)
是的,您必须广播该变量以使分布式环境中的所有执行程序都可以使用。