如何更新工作节点上的SPARK广播值?

时间:2018-01-23 02:59:16

标签: java apache-spark broadcast

我有从数据库获得的广播值。我在驱动程序主机上定义了广播

val stampsBroadcast = ssc.sparkContext.broadcast(stampListMap)

此值(stampsBroadcast.value)用于工作节点执行程序。执行程序完成任务后(向数据库添加新密钥)。我需要更新广播值才能添加这个新密钥。

我试图使用:

stampsBroadcast.unpersist(false)
ssc.sparkContext.broadcast(NewstampsBroadcastValue)

但似乎我不能在工作节点上使用ssc。如果我在驱动程序主机上重新广播,我如何从工作节点获取新数据?

2 个答案:

答案 0 :(得分:2)

您无法从工作节点创建广播变量。

在您的情况下,基本上您需要Accumulators。在驱动程序上定义累加器。在工作节点上,您可以更新累加器值。您可以再次获取驱动程序上的更新值。

注意:您无法在工作节点上检索累加器的值。只能从工作节点更新值。

以下来自spark docs的示例:

// creating the accumulator on driver
scala> val accum = sc.longAccumulator("My Accumulator")
accum: org.apache.spark.util.LongAccumulator = LongAccumulator(id: 0, name: Some(My Accumulator), value: 0)

// updating the accumulator on worker nodes
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum.add(x))
...
10/09/29 18:41:08 INFO SparkContext: Tasks finished in 0.317106 s

// fetaching the value
scala> accum.value
res2: Long = 10

答案 1 :(得分:0)

首先:将spark更新为spark2.3

第二:将stampListMap设置为文件流(sparkStream.readStream.textFile('/../my.txt')...load()),文件流可以自行更新内容。现在,如果您使用静态流连接流,则可以在spark2.3 +中使用流连接流。