Scala Spark Streaming:如何将广播变量的更新传播到整个集群?

Scala Spark Streaming:如何将广播变量的更新传播到整个集群?,scala,apache-spark,spark-streaming,Scala,Apache Spark,Spark Streaming,Spark驱动程序中有一个模块正在侦听Kafka队列,根据队列的内容,我需要修改广播变量(或闭包)的内容。在本例中,这可能是一个字符串 例如,如果字符串“change”到达队列,我需要更新每个节点中的广播变量 我希望看到一种模式可以做到这一点,它是干净的、性能良好的,或者至少可以收到一个输入,在那里我可以找到一些资料,以便更好地理解如何在Spark集群中传播修改。广播变量确实在使用对等协议向Spark集群传播变量或整个闭包 从: 广播变量是 只是spark.broadcast.broadcast

Spark驱动程序中有一个模块正在侦听Kafka队列,根据队列的内容,我需要修改广播变量(或闭包)的内容。在本例中,这可能是一个字符串

例如,如果字符串“change”到达队列,我需要更新每个节点中的广播变量


我希望看到一种模式可以做到这一点,它是干净的、性能良好的,或者至少可以收到一个输入,在那里我可以找到一些资料,以便更好地理解如何在Spark集群中传播修改。

广播变量确实在使用对等协议向Spark集群传播变量或整个闭包

从:

广播变量是 只是spark.broadcast.broadcast[T]类型的对象,它封装了 键入T。我们可以通过调用 任务。该值仅发送到每个节点一次,使用高效的类似BitTorrent的 沟通机制

对性能有影响的是您正在使用的序列化方法(例如:Kryo,自定义方法,…):

书中有一个例子:

例6-8。在Scala中使用广播值查找国家/地区

如这些示例所示,使用广播变量的过程很简单: 1.通过在类型为的对象上调用SparkContext.Broadcast创建广播[T] 任何类型都可以工作,只要它也是可序列化的。 2.使用value属性(或Java中的value()方法)访问其值。 3.变量将只发送到每个节点一次,并且应视为已读- 仅限(更新不会传播到其他节点)


“广播变量实际上是使用对等协议将变量或整个闭包传播到spark集群。”好的,这是我不确定的。我将在一个片段中尝试它,并查看它的行为。Thank.AFAIK广播变量只能在驱动程序上声明(如示例所示),如果要求根据一个执行器接收到的内容更新某些值,此方法将不起作用。OP希望向执行器广播一个在驱动程序上接收到的值。@Bacon对我来说,这个问题还不清楚。给定“例如,如果字符串“change”到达队列,我需要更新每个节点中的广播变量。”--数据到达执行器。只有
collect()
(或类似)会将此消息传递给驱动程序,可能是,也可能不是和选项。OP声明驱动程序正在侦听卡夫卡队列,并且这些消息应在执行器上转发。您能否提供一些示例代码来说明您要执行的操作?特别是,“我在Spark驱动程序中有一个模块正在收听卡夫卡队列”令人费解。有关详细信息,请参阅@Bacon answer上的讨论。
// Look up the countries for each call sign for the
// contactCounts RDD. We load an array of call sign
// prefixes to country code to support this lookup.

val signPrefixes = sc.broadcast(loadCallSignTable())

val countryContactCounts = contactCounts.map {
    case (sign, count) =>
        val country = lookupInArray(sign, signPrefixes.value) (country, count)
    }.reduceByKey((x, y) => x + y)

countryContactCounts.saveAsTextFile(outputDir + "/countries.txt")