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

时间:2015-08-06 12:13:59

标签: scala apache-spark spark-streaming

我在Spark驱动程序中有一个模块,用于监听Kafka队列,并根据队列的内容,我需要修改Broadcast变量(或闭包)的内容。在这个例子中,这可能是一个字符串。

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

我希望看到一个执行此操作的模式,该模式是干净且高效的,或至少接收一个输入,我可以在其中找到一些材料以更好地了解如何在Spark群集中传播修改。

1 个答案:

答案 0 :(得分:0)

广播变量确实是使用对等协议将变量或整个闭包传播到spark集群。

来自Learning Spark book

  

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

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

书中有一个例子:

  

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

// 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")
  

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